2011-09-14 16 views
5

Estoy compilando una aplicación usando Delphi 7. He agregado un botón en el formulario principal. En ese botón, haga clic en Deseo mostrar otro formulario. Intento crear una segunda forma solo si el usuario ha hecho clic en ese botón por primera vez. Si el usuario hace clic en ese botón por segunda vez, se debe mostrar el formulario ya creado. ¿Tiene un objeto Formulario alguna propiedad a través de la cual podamos verificar directamente si ya está creado o no?compruebe si el objeto se crea o no en delphi

Respuesta

10
if Assigned(Form1) then 
begin 
    //form is created 
end; 

Pero si su forma es declarado localmente a nivel mundial debe asegurarse de que se inicializa a nil.

4

Necesita un campo de miembro para mantener la referencia al formulario. Luego verifique si esa referencia está asignada. De esta manera:

function TMainForm.GetOtherForm: TMyForm; 
begin 
    if not Assigned(FOtherForm) then 
    FOtherForm := TMyForm.Create(Self); 
    Result := FOtherForm; 
end; 
+2

(. Acabo de borrar mi misma respuesta) pero tienen que añadir que asegúrese de restablecer la variable de vuelta a cero tras la destrucción de la TOtherForm, como poner TOtherForm: = nil en TOsterForm's OnDestroy. –

+0

@Hasan Si el otro formulario alguna vez se elimina. Mi impresión fue que debe ser una forma que perdure para siempre, una vez que se haya creado. –

+0

exactamente, pero solo por tranquilidad, para anticipar un escenario donde el formulario está dispuesto (explícitamente o por cualquier razón) en el futuro, por lo que no introducirá 'nuevos errores'. –

2

Asignada (Obj) aún puede devolver True incluso después de liberarla, usando "Obj.free". La mejor manera de asegurar su obj es gratis, PARA USAR Asignado (obj) está usando "FreeAndNil (Obj)"

0

Algunas veces la forma ha sido gratuita pero no es nula. En tal caso, la verificación de Asignado no es tan buena. Así que una opción es liberar el formulario y establecer MyForm: = nil en el formulario OnClose. otra opción es utilizar la siguiente proc:

function TMyForm.IsFormCreated: bool; 
var i: Integer; 
begin 
    Result := False; 
    for i := 0 to Screen.FormCount - 1 do 
    begin 
    if Screen.Forms[i] is TMyForm then 
    begin 
     Result := True; 
     Break; 
    end; 
    end; 
end; 
Cuestiones relacionadas