자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
uses
UAnotherUnit;
버튼 이벤트
var
AForm : UAnotherUnit.TTestForm;
begin
//직접 생성, 해제 제대로 안 됌
try
AForm := UAnotherUnit.TTestForm.Create(self);
AForm .ShowModal;
finally
// FreeAndNil(AForm);
// TestForm .Free;
end;
//자동 생성, 해제도 자동(아마도)
TestForm.Form_Parent_Class_Find.ShowModal;
첫 번재로 생성한 AForm은 생성할 때마다 이전 위치와 안 겹치게 이동하여 폼이 생성됩니다. 이걸 보고 메모리가 제대로 해제가 안 됐구나 생각했습니다. 자동 생성되는 TestForm은 항상 똑같은 위치에 생성됩니다.
TTestForm 클래스에 클로즈 이벤트에 Action := CaFree;를 넣으면 이 버튼의 이벤트가 두 번째에서는 먹통이 됩니다. 보이지 않는 모달 폼이 띄워져 있어서 첫 번째 폼(직접 생성한)을 닫고 난 뒤에는 아무것도 안 됩니다.
폼을 해제 해보려고 Free, FreeAndNil, CarFree 다 써봤습니다. 3시간이나 뒤졌는데 원하는 답이 없네요. 제가 폼을 생성하는 것이 잘 못 된 것인가요?
uses
UAnotherUnit;
버튼 이벤트
var
AForm : UAnotherUnit.TTestForm;
begin
//직접 생성, 해제 제대로 안 됌
try
AForm := UAnotherUnit.TTestForm.Create(self);
AForm .ShowModal;
finally
// FreeAndNil(AForm);
// TestForm .Free;
end;
//자동 생성, 해제도 자동(아마도)
TestForm.Form_Parent_Class_Find.ShowModal;
첫 번재로 생성한 AForm은 생성할 때마다 이전 위치와 안 겹치게 이동하여 폼이 생성됩니다. 이걸 보고 메모리가 제대로 해제가 안 됐구나 생각했습니다. 자동 생성되는 TestForm은 항상 똑같은 위치에 생성됩니다.
TTestForm 클래스에 클로즈 이벤트에 Action := CaFree;를 넣으면 이 버튼의 이벤트가 두 번째에서는 먹통이 됩니다. 보이지 않는 모달 폼이 띄워져 있어서 첫 번째 폼(직접 생성한)을 닫고 난 뒤에는 아무것도 안 됩니다.
폼을 해제 해보려고 Free, FreeAndNil, CarFree 다 써봤습니다. 3시간이나 뒤졌는데 원하는 답이 없네요. 제가 폼을 생성하는 것이 잘 못 된 것인가요?
먼저 자동 생성폼은 개발자가 별도로 free하지 않습니다. Application 개체에서 해제합니다. 즉 OnClose 이벤트에서 Action := caFree는 코딩하지 않습니다.
수동 create의 경우 프로젝트 옵션에서 Available form으로 이동하시고, 폼의 변수는 따로 선언해서 사용하지 마십시오.
위의 소스처럼 사용하시면 지역변수를 사용하여 제어하시면 다른 화면에서는 지역변수를 억세스 할 수 없기때문에(다른 곳에서 화면을 사용하지 않는 경우는 제외) 에를 들어 아래 폼에 선언된 변수 Form1을 사용합니다.
예를 들면
type
TForm1 = class(Tform)
..
end;
var
Form1:TForm1
그래서
uses
UAnotherUnit;
버튼 이벤트
begin
//직접 생성, 해제 제대로 안 됌
try
TestForm := TTestForm.Create(self);
TestForm .ShowModal;
finally
TestForm .Free;
end;
이렇게 작성하시면 됩니다.
Free와 FreeAndNil 의 차이점은 다음 주소를 참조하십시오.
https://tech.devgear.co.kr/index.php?mid=delphi_news&search_keyword=freeandnil&search_target=title_content&document_srl=429651