Delphi "проблем": TForm. Създаване () - Nil, Self или Application?

Когато създавате Delphi обекти динамично които наследяват от TControl, като например TForm (представляваща форма / прозорец в приложенията на Delphi), конструкторът "Създаване" очаква параметър "Собственик":

конструктор Създаване (AOwner: TComponent);

Параметърът AOwner е собственик на обекта TForm. Собственикът на формуляра е отговорен за освобождаването на формуляра, т.е. паметта, разпределена от формата, когато е необходимо. Формата се появява в масива Components на нейния собственик и се унищожава автоматично, когато неговият собственик бъде унищожен.

Имате три възможности за параметъра AOwner: нула, себе си, и приложение.

За да разберете отговора, първо трябва да знаете значението на „нула“, „аз“ и „приложение“.

  • нула уточнява, че никой обект не притежава формата и следователно разработчикът е отговорен за освобождаването на създадения формуляр (като се обади на myForm. Безплатно, когато вече не се нуждаете от формата)
  • себе си указва обекта, в който се извиква методът. Ако например създавате нов екземпляр на форма на TMyForm от манипулатора на OnClick на бутон (където този бутон е поставен на MainForm),
    instagram viewer
    себе си се отнася до "MainForm." По този начин, когато MainForm бъде освободен, той също ще освободи MyForm.
  • Приложение указва глобална променлива тип TApplication, създадена при стартиране на приложението ви. „Приложението“ капсулира вашето приложение, както и предоставя много функции, които се появяват на фона на програмата.

Примери:

  1. Модални форми. Когато създадете формуляр, който да се показва модално и да се освобождава, когато потребителят затвори формуляра, използвайте "nil" като собственик:
    var myForm: TMyForm; започнете myForm: = TMyForm. Създаване (нула); опитайте myForm. ShowModal; накрая моята форма. Безплатно; край; край;
  2. Безмодерни форми. Използвайте „Приложение“ като собственик:
    Var
    myForm: TMyForm;
    ...
    myForm: = TMyForm. Създаване (Приложение);

Сега, когато прекратите (излезете) от приложението, обектът "Application" ще освободи екземпляра "myForm".

Защо и кога е TMyForm. Създаване (Приложение) НЕ се препоръчва? Ако формулярът е модална форма и ще бъде унищожен, трябва да преминете "нула" за собственика.

Можете да предадете „заявление“, но забавянето във времето, причинено от метода за уведомяване, изпращан до всеки компонент и форма, собственост или индиректно собственост на Приложението, може да се окаже смущаващ. Ако приложението ви се състои от много форми с много компоненти (в хилядите), а формата, която създавате, има много контроли (в стотиците), забавянето на уведомленията може да бъде значително.

Преминаването на „нула“ като собственик вместо „приложение“ ще доведе до по-бързото показване на формата и няма да повлияе на другия код.

Ако обаче формата, която трябва да създадете, не е модална и не е създадена от основната форма на приложението, тогава, когато посочите „себе си“ като собственик, затварянето на собственика ще освободи създадения формуляр. Използвайте „аз“, когато не искате формулярът да надживее създателя му.

Внимание: За да динамично създадете компонент на Delphi и изрично да го освободите някъде по-късно, винаги предавайте "нула" като собственик. Ако не го направите, това може да доведе до ненужен риск, както и проблеми с работата и поддръжката на кода.

в SDI приложения, когато потребителят затвори формуляра (като натисне бутона [x]), формулярът все още съществува в паметта - той само се скрива. В MDI приложения затварянето на MDI форма на дете само го свежда до минимум.
Най- OnClose събитието осигурява действие параметър (от типа TCloseAction), който можете да използвате, за да укажете какво се случва, когато потребителят се опита да затвори формата. Задаването на този параметър на "caFree" ще освободи формата.

Навигатор за съвети на Delphi:
»Вземете пълния HTML от компонента TWebBrowser
«Как да конвертирате пиксели в милиметри

instagram story viewer