2012-02-10 12 views
7

Я создаю свои формы во время выполнения чего-то вроде этого:Динамическая форма Создание

AboutForm := TAboutForm.Create(AboutForm); 
try 
    AboutForm.ShowModal; 
finally 
    AboutForm.Free; 
end; 

Но какая разница, хотя при использовании любого из них:

AboutForm := TAboutForm.Create(Self); 
AboutForm := TAboutForm.Create(nil); 
AboutForm := TAboutForm.Create(Application); 

Все они, кажется, работают одинаково с что я вижу, но что правильно, или все они правильны, что, как правило, лучше всего использовать?

Цените свои комментарии спасибо :)

+0

1. В вашем первом примере отсутствует утечка памяти. –

+0

re: ваш теперь удаленный вопрос о том, как быть хорошим программистом - прочитайте прекрасное руководство перед отправкой вопроса общественности - http://docwiki.embarcadero.com/VCL/en/Forms.TCustomForm.Create. Какой аргумент представляет для вас особый интерес? Да, 'AOwner' - перейдите по ссылке - http://docwiki.embarcadero.com/VCL/en/Classes.TComponent.Owner – OnTheFly

+0

@ user539484 спасибо, я думал, что мой другой удаленный вопрос будет разрешен, поскольку это связано с программированием вопрос. –

ответ

8

В качестве параметра параметр TForm.Create принимает значение Owner.

В вашем первом примере AboutForm является владельцем. Это, очевидно, плохая идея, так как она еще не создана.

Когда Self является параметром, экземпляр, делающий вызов владельцем.
Когда Application является параметром, приложение является владельцем.
Когда nil является параметром, у AboutForm doen нет владельца. Все в порядке, но в таких случаях вы должны помнить о том, чтобы освободить форму самостоятельно.

Когда вы передаете владельцу, вам фактически не нужно бесплатно освобождать я. Владелец освободит его, когда владелец будет освобожден.

Это как ваш код должен выглядеть следующим образом:

AboutForm := TAboutForm.Create(nil); 
try 
    AboutForm.ShowModal; 
finally 
    AboutForm.Free; 
end; 
+0

Это имеет смысл, особенно с информацией, опубликованной @PresleyDias. –

+1

Взгляните также на этот атрикс, описывающий систему уведомлений владельца и компонента, и почему вы не можете назначить владельца компоненту, который вы намереваетесь освободить: http://delphi.about.com/od/ kbcurt/ss/dynamiccreateno.htm –

+0

Огромное спасибо, теперь я вижу, как прохождение неправильного параметра - это плохо! –

2

Первый

AboutForm := TAboutForm.Create(AboutForm); 

говорит TAboutForm, что это владелец является объект, который был присвоен указателю «AboutForm» раньше (может быть также NIL -> no Owner).

Параметр "Владелец" из

TForm.Create(Owner: TComponent) 

говорит форму, кто это владелец. TComponents регистрируются у своего владельца, если они предоставляются. Итак, между владельцем и его детьми есть какая-то связь.

Пример: Если владелец освобожден, он также может освободить принадлежащие ему компоненты.

Поэтому

TAboutForm.Create(Self); 

означает, что "Я" является владельцем нового TAboutForm, если (Self is TComponent).

TAboutForm.Create(NIL); 

также является приемлемым решением, но здесь, вы должны освободить компонент самостоятельно (за исключением, вы создаете TAboutForm внутри MDI-окна).

+4

Как вы думаете, первый может быть прав? При каких обстоятельствах один TAboutForm создает и владеет другим TAboutForm, а затем отбрасывает ссылку на оригинал и заменяет его новым? –

+0

@RobKennedy: Хорошо, первый может быть прав! Конечно, может быть создан еще один TControl и назначен для AboutForm, прежде чем он переоценит новый ObjRef. Я читал это неправильно, было немного поздно в Австрии;) – MJSt

+0

@ RobKennedy Ваш комментарий выше имеет большой смысл, когда вы так выразились :) –

5

при создании формы динамически, то есть форма available формы. Вы должны передать owner формы.

enter image description here

.. Так что в вашем случае

AboutForm: = TAboutForm.Create (Self);

Оформе: = TAboutForm.Create (nil);

Оформе: = TAboutForm.Create (Application);

  1. Само
  2. Nil
  3. Применение

является владельцем для AboutForm (как вы уже знаете это)

But what is the difference though in using any of these:

здесь что-то от about.com-Form Owner

ноль - указывает, что ни один объект не имеет форму - и, следовательно, разработчик (вы) несет ответственность за освобождая созданную форму (вызывая myForm.Free, когда вы больше не нужны формы)

Self - указывает объект, в котором вызывается метод. Если, например, вы создаете новый экземпляр формы TMyForm внутри обработчика OnClick Button (где эта кнопка помещается в MainForm) - self ссылается на «MainForm». Таким образом, когда MainForm освобождается - он также освободит «MyForm».

Приложение - указывает глобальную переменную типа TApplication, создаваемую при запуске приложения. «Приложение» инкапсулирует ваше приложение, а также предоставляет множество функций, которые происходят на фоне программы.

и это также Form Owner

а) Formx.Create (Application) -> Форма ресурсы будут освобождены, когда приложение завершается

б) Formx.Create (Self) -> Форма ресурсы освобождаются, когда объект владельца уничтожается (если Self является потомком TComponent)

c) Formx.Create (nil) -> вы несете ответственность за освобождение формы.

Это из

используется Дельфах, когда форма autocreated

б удобно для основной формы, которая имеет несколько дочерних окон, которые необходимо закрыть, когда основная форма закрыта.

c подходит для отображения диалогового окна

Для освобождения вы можете сделать это ACtion := caFree onclose формы.

+0

Отличная информация благодаря –

Смежные вопросы