„Problem” Delphi: TForm. Utwórz () - zero, samo czy aplikacja?

Kiedy tworzysz Obiekty Delphi dynamicznie dziedziczące po TControl, takim jak TForm (reprezentujący formularz / okno w aplikacjach Delphi), konstruktor „Utwórz” oczekuje parametru „Właściciel”:

konstruktor Create (AOwner: TComponent);

Parametr AOwner jest właścicielem obiektu TForm. Właściciel formularza jest odpowiedzialny za zwolnienie formularza - tj. Pamięci przydzielonej przez formularz - w razie potrzeby. Formularz pojawia się w tablicy Components właściciela i jest niszczony automatycznie po zniszczeniu właściciela.

Masz trzy opcje parametru AOwner: Zero, samego siebie, i podanie.

Aby zrozumieć odpowiedź, najpierw musisz znać znaczenie „zero”, „ja” i „Aplikacja”.

  • Zero określa, że ​​żaden obiekt nie jest właścicielem formularza, dlatego programista jest odpowiedzialny za zwolnienie utworzonego formularza (przez wywołanie myForm. Bezpłatnie, gdy nie potrzebujesz już formularza)
  • Samego siebie określa obiekt, w którym wywoływana jest metoda Jeśli na przykład tworzysz nową instancję formularza TMyForm z wnętrza modułu obsługi OnClick przycisku (gdzie ten przycisk jest umieszczony w formularzu głównym),
    instagram viewer
    samego siebie odnosi się do „MainForm”. Tak więc, gdy MainForm zostanie zwolniony, zwolni również MyForm.
  • Podanie określa globalną zmienną typu TApplication utworzoną podczas uruchamiania aplikacji. „Aplikacja” zawiera aplikację i zapewnia wiele funkcji, które występują w tle programu.

Przykłady:

  1. Formy modalne. Kiedy tworzysz formularz, który będzie wyświetlany modalnie i zwolniony, gdy użytkownik zamknie formularz, użyj „nil” jako właściciela:
    var myForm: TMyForm; rozpocząć myForm: = TMyForm. Stwórz(zero); wypróbuj myForm. ShowModal; wreszcie myForm. Darmowy; koniec; koniec;
  2. Modelowe formy. Użyj „aplikacji” jako właściciela:
    var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Utwórz (aplikacja);

Teraz, kiedy zakończysz (zamkniesz) aplikację, obiekt „Aplikacja” zwolni instancję „myForm”.

Dlaczego i kiedy jest TMyForm. Tworzenie (Aplikacja) NIE jest zalecane? Jeśli formularz jest formularzem modalnym i zostanie zniszczony, należy przekazać właścicielowi wartość „zero”.

Możesz przekazać „aplikację”, ale opóźnienie spowodowane przez metodę powiadomienia wysyłaną do każdego komponentu i formularza będącego własnością lub pośrednio będącym własnością aplikacji może okazać się zakłócające. Jeśli twoja aplikacja składa się z wielu formularzy z wieloma komponentami (w tysiącach), a tworzony formularz ma wiele formantów (w setkach), opóźnienie powiadomienia może być znaczące.

Podanie „zero” jako właściciela zamiast „aplikacji” spowoduje, że formularz pojawi się wcześniej i nie wpłynie w inny sposób na kod.

Jeśli jednak formularz, który należy utworzyć, nie jest modalny i nie został utworzony z głównego formularza aplikacji, to po określeniu „ja” jako właściciela zamknięcie właściciela spowoduje zwolnienie utworzonego formularza. Użyj „ja”, jeśli nie chcesz, aby forma przeżyła swojego twórcę.

Ostrzeżenie: Aby dynamicznie utworzyć instancję komponentu Delphi i jawnie go zwolnić później, zawsze przekazuj „zero” jako właściciela. Niezastosowanie się do tego może spowodować niepotrzebne ryzyko, a także problemy z wydajnością i konserwacją kodu.

W Aplikacje SDI, gdy użytkownik zamyka formularz (klikając przycisk [x]) formularz nadal istnieje w pamięci - tylko się ukrywa. W aplikacjach MDI zamknięcie formularza potomnego MDI tylko go minimalizuje.
The OnClose wydarzenie zapewnia Akcja parametr (typu TCloseAction), którego można użyć, aby określić, co dzieje się, gdy użytkownik próbuje zamknąć formularz. Ustawienie tego parametru na „caFree” spowoduje zwolnienie formularza.

Nawigator Delphi:
»Pobierz pełny kod HTML ze składnika TWebBrowser
«Jak przekonwertować piksele na milimetry

instagram story viewer