컴포넌트를 동적으로 생성한 후 소멸을 시킬려고 합니다.
폼에서 버튼1을 클릭하면
Panel에 TMemo가 생성되고
버튼 2를 클릭하면
TMemo가 없어집니다.
근데 버튼3을 눌러서
Assigned()를 확인해보면 소멸되지 않고 남아있어서
다시 버튼1을 눌러도 생성되지 않습니다.
한번 동적으로 생성한 컴포넌트를 소멸시킬때
Free 나 Destroy 둘 해보았지만 되지않는데...
답변 부탁합니다.
unit TestEMemo;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
eMemo : TMemo;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(eMemo) then
begin
eMemo := TMemo.Create(self);
eMemo.Parent := Panel1;
eMemo.Align := alClient;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(eMemo) then
begin
eMemo.Free;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if Assigned(eMemo) then
ShowMessage('Assigned!!')
else
ShowMessage('Not Assigned!!');
end;
end.
객체를 Free한다해도 참조변수에는 nil이 할당되지 않습니다. 이전에 생성되었던 객체의
번지를 그대로 가지고 있죠. Free하고난 후에 nil을 직접 할당해주시거나
FreeAndNil함수를 이용하세요...
procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(eMemo) then
begin
eMemo.Free;
eMemo := nil;
// 이 두가지 동작을 동시에 하려면
// FreeAndNil(eMemo);
end;
end;
^^ 항상 즐코하세요...
델초보 wrote:
> 컴포넌트를 동적으로 생성한 후 소멸을 시킬려고 합니다.
> 폼에서 버튼1을 클릭하면
> Panel에 TMemo가 생성되고
> 버튼 2를 클릭하면
> TMemo가 없어집니다.
>
> 근데 버튼3을 눌러서
> Assigned()를 확인해보면 소멸되지 않고 남아있어서
> 다시 버튼1을 눌러도 생성되지 않습니다.
>
> 한번 동적으로 생성한 컴포넌트를 소멸시킬때
> Free 나 Destroy 둘 해보았지만 되지않는데...
> 답변 부탁합니다.
>
> unit TestEMemo;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
> StdCtrls, ExtCtrls;
>
>
> type
> TForm1 = class(TForm)
> Button1: TButton;
> Button2: TButton;
> Button3: TButton;
> Panel1: TPanel;
> procedure Button1Click(Sender: TObject);
> procedure Button2Click(Sender: TObject);
> procedure Button3Click(Sender: TObject);
> private
> { Private declarations }
> public
> { Public declarations }
> eMemo : TMemo;
> end;
>
> var
> Form1: TForm1;
>
> implementation
>
> {$R *.DFM}
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> if not Assigned(eMemo) then
> begin
> eMemo := TMemo.Create(self);
> eMemo.Parent := Panel1;
> eMemo.Align := alClient;
> end;
> end;
>
> procedure TForm1.Button2Click(Sender: TObject);
> begin
> if Assigned(eMemo) then
> begin
> eMemo.Free;
> end;
> end;
>
> procedure TForm1.Button3Click(Sender: TObject);
> begin
> if Assigned(eMemo) then
> ShowMessage('Assigned!!')
> else
> ShowMessage('Not Assigned!!');
> end;
>
> end.