2011-09-14 14 views
5

Sto costruendo un'applicazione utilizzando Delphi 7. Ho aggiunto un pulsante nel modulo principale. Su quel pulsante clic voglio mostrare un altro modulo. Sto cercando di creare un secondo modulo solo se l'utente ha fatto clic su quel pulsante per la prima volta. Se l'utente fa clic su questo pulsante una seconda volta, dovrebbe essere visualizzato il modulo già creato. Un oggetto Form ha proprietà attraverso le quali possiamo controllare direttamente se è già stato creato o no?controllare se l'oggetto è stato creato o non in delphi

risposta

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

Ma se il modulo è dichiarato localmente globalmente è necessario assicurarsi che sia inizializzato a nil.

4

È necessario un campo membro per contenere il riferimento al modulo. Quindi verificare se tale riferimento è stato assegnato. In questo modo:

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

(. Ho appena cancellare il mio stessa risposta) ma hanno bisogno di aggiungere che essere sicuri di reimpostare la variabile di nuovo a zero a distruggere il TOtherForm, come mettere TOtherForm: = nil su Ontherist di TOtherForm. –

+0

@Hasan Se l'altro modulo viene mai cancellato. La mia impressione è che deve essere una forma che vive per sempre, una volta creata. –

+0

esattamente, ma solo per la tranquillità, per anticipare lo scenario in cui il modulo è disposto (esplicitamente o per qualsiasi ragione) in futuro - quindi non introdurrà 'nuovi bug'. –

2

Assegnato (Obj) può ancora restituire True anche dopo averlo liberato, utilizzando "Obj.free". Il modo migliore per assicurare il tuo obj è gratuito, PER UTILIZZARE Assigned (obj) utilizza "FreeAndNil (Obj)"

0

A volte la forma è stata gratuita ma non è nulla. In tal caso il controllo di Assegnato non è così buono. Quindi un'opzione è per liberare il modulo e impostare MyForm: = nil sul modulo OnClose. un'altra opzione è quella di utilizzare il seguente 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; 
Problemi correlati