Почему можно писать и так:
- Код: Выделить всё
Form2:= TForm.Create(Form1);
- Код: Выделить всё
Form2:= TForm1.Create(Form1);
Модератор: Модераторы
Form2:= TForm.Create(Form1);
Form2:= TForm1.Create(Form1);
Александр Яшин писал(а):Почему можно писать и так:
Form2: TForm2;
Да.Александр Яшин писал(а):1. Если закрыть вторую форму кнопкой закрытия окна, то форма останется в памяти и будет окончательно уничтожена только после закрытия Form1?
Александр Яшин писал(а):2. Как ее сразу уничтожить при нажатии кнопки закрытия? Т.е. как вставить обработчик OnDestroy, ведь в инспекторе объектов свойств Form2 не видно.
procedure TForm1.FormDestroyer(Sender: TObject);
begin
FreeAndNil(Form2);
end;
// где-нибудь типа обработчика TForm2.OnCreate написать:
OnClose:=@Form1.FormDestroyer;
Это многое объясняет!!! Меня давно терзали смутные сомнения, но теперь все встало на свои места. Я пытался изучать тру ООП и соотносить с тем, что я вижу в Delphi и меня не оставляло чувство смутного беспокойства, что либо что-то здесь не так, либо я чего-то не понимаю. Оказалось, что верно первое.Sergei I. Gorelkin писал(а):Это известная фраза, но означает она то, что эти среды навязывают определенный стиль кода, который соотносится и с ООП, и с правильным дизайном довольно-таки опосредованно.
Александр Яшин писал(а):Как ее сразу уничтожить при нажатии кнопки закрытия? Т.е. как вставить обработчик OnDestroy, ведь в инспекторе объектов свойств Form2 не видно.
TForm2 = ...
protected
procedure DoClose(var CloseAction: TCloseAction); override;
end;
procedure TForm2.DoClose(var CloseAction: TCloseAction);
begin
inherited DoClose(CloseAction);
CloseAction := caFree;
end;
Climber писал(а):// где-нибудь типа обработчика TForm2.OnCreate написать:
OnClose:=@Form1.FormDestroyer;
[/code]
Form2 := TForm.Create(Application);
Form2.FreeNotification(Self);
TForm1 = ...
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
end;
procedure TForm1.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = Form2) then Form2 := nil;
end;
TForm1 = ...
public
destructor Destroy; override;
end;
destructor TForm1.Destroy;
begin
if Assigned(Form2) then Form2.RemoveFreeNotification(Self);
inherited Destroy;
end;
AbakAngelSoft писал(а):
- Код: Выделить всё
TForm2 = ...
protected
procedure DoClose(var CloseAction: TCloseAction); override;
end;
procedure TForm2.DoClose(var CloseAction: TCloseAction);
begin
inherited DoClose(CloseAction);
CloseAction := caFree;
end;
Александр Яшин писал(а):без предварительного создания класса формы TForm2.
Form2 := TForm.Create(Application);
Form2.FreeNotification(Self);
Form2.OnClose := @Form2Close;
procedure TForm1.Form2Close(Sender: TObject; var CloseAction: TCloseAction);
begin
CloseAction := caFree;
end;
NewComponent := TNewComponent.Create(ParentPanel);
NewComponent.Parent := ParentPanel;
FreeAndNil(ParentPanel);
VirtUX писал(а):У меня такой вопрос: Если компоненты создаются по принципу, то при
- Код: Выделить всё
NewComponent := TNewComponent.Create(ParentPanel);
NewComponent.Parent := ParentPanel;все NewComponent тоже корректно уничтожатся или нужно их вручную уничтожать?
- Код: Выделить всё
FreeAndNil(ParentPanel);
скалогрыз писал(а):y TComponent нету свойства Parent, у них есть свойство Owner.
свойство Parent есть только у TControl-ов
скалогрыз писал(а):так вот, все компоненты, которым ParentPanel приходиться Owner-ом - будут уничтожены.
но контролы, которым, ParentPanel приходиться Owner-ом НЕ БУДУТ уничтожены, зато их Parent обратится в nil!
VirtUX писал(а):Жаль. А было б удобно иметь свойство ClearPredDestroy: boolean;, где TRUE - очищать перед деструкцией все TWinControl созданные с Parent равным этому объекту (Self).
procedure SetChildsOwnerToSelf(AControl: TWinControl);
var
i : integer;
begin
if not Assigned(AControl) then Exit;
for i:=0 to AControl.ContolCount-1 do
AControl.Controls[i].Owner:=AControl;
end;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 48