2009-04-02 12 views
12

Mam formularz, którego używam do pokazywania pewnych informacji przez kilka sekund. Czy to jest w porządku, aby formularz sam się uwolnił? Czy mogę uruchomić zegar w konstruktorze, a następnie wywołać self.free w zdarzeniu timera? Czy może to potencjalnie prowadzić do kłopotów?Delphi: Czy jest w porządku, aby formularz mógł go uwolnić?

Odpowiedz

29

Ponadto za pomocą formularza można zadzwonić do wydania.

Wysyła komunikat CM_RELEASE do formularza. Jako reakcję nazywa Wolny. Zaletą wydania jest to, że nie ma żadnych wiadomości dla formularza, które mogłyby spowodować awarię.

+0

+1, To jest IMHO, jedyny czysty sposób na zrobienie tego w tej sprawie. – Fred

+0

Myślę, że pójdę na ten, w połączeniu z ustawianiem właściciela jako dodatkowe ubezpieczenie. – Vegar

1

Mam cały pakiet obiektów, które się wyzwalają, a ja przeprowadziłem na nich różne testy bez żadnych problemów/wycieków. TForm może być bardziej złożony, ale tak długo jak Self.Free() jest ostatnim wywołaniem, powinieneś być bezpieczny.

(Dla tych, którzy zastanawiają się, dlaczego na Ziemi mam obiekt, który się wyzwolił, bardzo często przekazuję je dookoła systemu, więc zaimplementowałem je według własnego schematu liczenia odniesień, a gdy ostatnie odniesienie zostanie zwolnione, obiekt uwalnia się).

+0

Ale Self.Free prawie * nigdy * będzie ostatnim wywołaniem formularza, ponieważ formularz prawie zawsze uruchamia kod w reakcji na akcję użytkownika. Zamiast tego użyj opcji Release. –

+0

Dlaczego po prostu nie używać interfejsów do liczenia referencji? –

16

Można zrobić formę uwolnić się gdy robi się zamknięte przez użytkownika lub z kodu:

procedure TForm27.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    Action := caFree; 
end; 

procedure TForm27.FormCreate(Sender: TObject); 
begin 
    Timer1.Enabled := True; 
end; 

procedure TForm27.Timer1Timer(Sender: TObject); 
begin 
    Timer1.Enabled := False; 
    Close; 
end; 

upewnij się, podać właściciela w konstruktorze okrywać z postojów aplikacyjnych i forma nie jest zniszczone w czas. Właściciel zwolni formularz przed uwolnieniem się.

+0

Im więcej o tym myślę, tym bardziej podoba mi się pomysł TCloseAction. Może powinienem użyć tego zamiast wydania ... – Vegar

+1

gdyby tylko formularze miały właściwości DefaultCloseAction, więc pone może je automatycznie zwolnić bez przypisywania procedur obsługi zdarzeń. –

0

Dokładnie to robi się za pomocą interfejsów.

+1

Tak, ale należy pamiętać, że TComponent Delphi zastępuje liczenie odwołań interfejsu, co często powoduje zamieszanie. –

+0

Korzystając z interfejsów, formularz zostanie zwolniony, gdy zniknie z miarki. Nie chcę tego. Chcę, aby żył tak długo, jak chce, bez żadnych odniesień do niego, a następnie uwolnić go, gdy zrobi to samo. – Vegar

+0

Fabio: Jestem pewien, że możesz to zmienić. Vegar: Interfejsy są liczone, a nie zarządzane w zakresie. – Arafangion

Powiązane problemy