2011-09-14 13 views
5

Buduję aplikację przy użyciu Delphi 7. Dodałem jeden przycisk w głównym formularzu. W tym przycisku kliknij Chcę pokazać inny formularz. Próbuję utworzyć drugi formularz tylko wtedy, gdy użytkownik kliknął ten przycisk po raz pierwszy. Jeśli użytkownik kliknie ten przycisk po raz drugi, powinien zostać wyświetlony już utworzony formularz. Czy obiekt Form ma jakąś właściwość, dzięki której możemy bezpośrednio sprawdzić, czy obiekt został już utworzony, czy nie?Sprawdź, czy obiekt został utworzony czy nie w delphi

Odpowiedz

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

Ale jeśli forma jest zadeklarowana lokalnie globalnie należy upewnić się, że jest on inicjowany nil.

4

Potrzebujesz pola elementu, aby zachować odniesienie do formularza. Następnie sprawdź, czy odniesienie zostało przypisane. Tak:

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

(. Ja po prostu usunąć samą odpowiedź), ale trzeba dodać, że należy zresetować zmienną z powrotem do zera po niszcząc TOtherForm, jak oddanie TOtherForm: = nil w OnDestroy firmy TOtherForm. –

+0

@ Hasan Jeśli drugi formularz zostanie kiedykolwiek usunięty. Mam wrażenie, że ma to być forma, która żyje na zawsze, gdy tylko zostanie stworzona. –

+0

dokładnie, ale tylko dla spokoju ducha, aby przewidzieć scenariusz, w którym formularz zostanie usunięty (wyraźnie lub z jakiegokolwiek powodu) w przyszłości - tak aby nie wprowadzał "nowych błędów". –

2

Assigned (obj) może jeszcze powrócić prawda nawet po uwolnić go, używając "Obj.free". Najlepszy sposób na osiągnięcie celu jest bezpłatny, ZA UŻYCIE Assigned (obj) używa "FreeAndNil (Obj)"

0

Czasami forma jest darmowa, ale nie jest zerowa. W takim przypadku sprawdzenie Assigned nie jest tak dobre. Jedną z opcji jest uwolnienie formularza i ustawienie MyForm: = zero w formularzu OnClose. Inną opcją jest użycie następującego 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; 
Powiązane problemy