자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi 파이어몽키 데크스탑! 폼이 메모리에서 안내려갑니다;;;
2019.04.08 23:13
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
안녕하세요. 밤에는 날씨가 많이 쌀쌀하네요/
FireMonkey 데스크탑 공부중인데요.
아래 질문은 플랫폼과 상관없이 제가 잘 몰라서 발생하는 문제인듯 합니다.
Available Forms에 디자인과 코딩이 되어 있는 FormMon이라는 폼을 여러개 동적 생성하려고 합니다.
FormMain에서 아래와 같이 Available Forms에 속해있는 FormMon을 생성합니다.
procedure TFormMain.Button1Click(Sender as TObject);
begin
with TFormMon.Create(Self) do
begin
try
Name := 'FormMon_'+IntToStr(i_Mon_Num); // 생성시 TFormMon의 Name을 바꿈.
i_My_Mon_Num := i_Mon_Num;
finally
...
...
end;
end;
FormMon.MakeObjects(7, 'N'); // FormMon 폼의 Public 프로시저 실행.
FormMon.Show;
end;
이렇게 FormMon_1, FormMon_2, FormMon_3 과 같은 이름으로 계속 생성했습니다.
각 TFormMon에서 Self.Close; 하면, 메모리가 반환이 안됩니다.
(TForm(Self.FindComponent('FormMon_'+IntToStr(i_Mon_Num))) as TFormMon).btnOpen.Caption := 'Close'; 와 같이
동적생성된 폼과 그 폼의 오브젝트를 이런식으로 참조한게 문제일까요? 의도대로 수행은 잘 하는것 같습니다.
동성생성된 폼 역시 제대로 구분이 되구요;
Modal폼이 아니어서 Action := TCloseAction.caFree; 같은 코드는 MemoryLeak이 발생하더군요;;
Self := nil; 도 해보고 OnCloseQuery 이벤트에 동적으로 만들었던 Object들을 날려도 보고 .DisposeOf;도 해보고 별짓을 다 했는데도
메모리 반환이 안됩니다 ㅠ.ㅠ
댓글 6
-
지병철
2019.04.10 18:11
-
아크나톤
2019.04.11 19:59
작업관리자에서요.
딱 올라간 수준만큼 메모리를 먹고 종료를 하면 내려가질 않습니다 ㅠ.ㅠ
-
지병철
2019.04.12 09:48
메모리 없어지는 것 확인했습니다.
1. Create 하는 부분
procedure TFormMain.btnCreateFormsClick(Sender: TObject);
var
aForm: TFormMon;
i: integer;
begin
for i := 0 to 20 do
begin
aForm := TFormMon.Create(nil);
aForm.Name := 'Form' + inttostr(i);
aForm.Show;
end;
end;
2. Free 하는 부분
procedure TFormMon.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
-
아크나톤
2019.04.12 17:33
감사합니다.
말씀드린데로 파이어몽키에서 테스트하는거라 FormClose 이벤트에서 Action := caFree; 를 Action := TCloseAction.caFree; 했는데
폼은 종료되나 메모리에 그대로 남아있고 다시 동일한 폼을 띄우고 닫고 반복하면 메모리가 동일하게 누적되어 증가하고 있습니다 ㅠ.ㅠ
혹, 동적 폼생성에 문제가 있거나 동적폼 안에서 동적 컴포넌트 생성에 문제가 있으면 그럴수도 있을까요?
외견상 의도된대로 실행은 잘 되고 있습니다 ㅠ.ㅠ
-
지병철
2019.04.15 15:31
음... 제가 드린 소스를 실행하면, 메모리가 정상적으로 반환됩니다.
제가 메모리 반환되는 것 까지 확인한 것 입니다.
작업하신 소스를 올려 주시면, 다시 확인해 보겠습니다.
-
지병철
2019.04.16 16:36
실제 소스가 올라오지 않아서, 위에 질문하신 소스만을 참고로 이야기 하자면...
procedure TFormMain.Button1Click(Sender as TObject);
begin
with TFormMon.Create(Self) do
begin
try
Name := 'FormMon_'+IntToStr(i_Mon_Num); // 생성시 TFormMon의 Name을 바꿈.
i_My_Mon_Num := i_Mon_Num;
finally
...
...
end;
end;
>>> 여기까지 TFormMon 을 계승한 새로운 Form이 만들어 졌습니다.
FormMon.MakeObjects(7, 'N'); // FormMon 폼의 Public 프로시저 실행.
FormMon.Show;
>>> FormMon 은 새롭게 만들어진 것이 아닌 디자인시에 만든 Form 으로 생각됩니다.
>>> 따라서, 여기서 FormMon.Show 를 하면, 기존 폼이 화면에 보이게 되며,
>>> 위에서 새롭게 만든 Form이 보여지는 것이 아닌 것으로 파악됩니다.
>>> 그러므로, FormMon을 close 하더라도, 새로이 만들어진 Form 은 메모리에서 없어지지 않는 것 같습니다.
end;
Delphi 파이어몽키 데크스탑! 폼이 메모리에서 안내려갑니다;;;
2019.04.08 23:13
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
안녕하세요. 밤에는 날씨가 많이 쌀쌀하네요/
FireMonkey 데스크탑 공부중인데요.
아래 질문은 플랫폼과 상관없이 제가 잘 몰라서 발생하는 문제인듯 합니다.
Available Forms에 디자인과 코딩이 되어 있는 FormMon이라는 폼을 여러개 동적 생성하려고 합니다.
FormMain에서 아래와 같이 Available Forms에 속해있는 FormMon을 생성합니다.
procedure TFormMain.Button1Click(Sender as TObject);
begin
with TFormMon.Create(Self) do
begin
try
Name := 'FormMon_'+IntToStr(i_Mon_Num); // 생성시 TFormMon의 Name을 바꿈.
i_My_Mon_Num := i_Mon_Num;
finally
...
...
end;
end;
FormMon.MakeObjects(7, 'N'); // FormMon 폼의 Public 프로시저 실행.
FormMon.Show;
end;
이렇게 FormMon_1, FormMon_2, FormMon_3 과 같은 이름으로 계속 생성했습니다.
각 TFormMon에서 Self.Close; 하면, 메모리가 반환이 안됩니다.
(TForm(Self.FindComponent('FormMon_'+IntToStr(i_Mon_Num))) as TFormMon).btnOpen.Caption := 'Close'; 와 같이
동적생성된 폼과 그 폼의 오브젝트를 이런식으로 참조한게 문제일까요? 의도대로 수행은 잘 하는것 같습니다.
동성생성된 폼 역시 제대로 구분이 되구요;
Modal폼이 아니어서 Action := TCloseAction.caFree; 같은 코드는 MemoryLeak이 발생하더군요;;
Self := nil; 도 해보고 OnCloseQuery 이벤트에 동적으로 만들었던 Object들을 날려도 보고 .DisposeOf;도 해보고 별짓을 다 했는데도
메모리 반환이 안됩니다 ㅠ.ㅠ
댓글 6
-
지병철
2019.04.10 18:11
-
아크나톤
2019.04.11 19:59
작업관리자에서요.
딱 올라간 수준만큼 메모리를 먹고 종료를 하면 내려가질 않습니다 ㅠ.ㅠ
-
지병철
2019.04.12 09:48
메모리 없어지는 것 확인했습니다.
1. Create 하는 부분
procedure TFormMain.btnCreateFormsClick(Sender: TObject);
var
aForm: TFormMon;
i: integer;
begin
for i := 0 to 20 do
begin
aForm := TFormMon.Create(nil);
aForm.Name := 'Form' + inttostr(i);
aForm.Show;
end;
end;
2. Free 하는 부분procedure TFormMon.FormClose(Sender: TObject; var Action: TCloseAction);beginAction := caFree;end; -
아크나톤
2019.04.12 17:33
감사합니다.
말씀드린데로 파이어몽키에서 테스트하는거라 FormClose 이벤트에서 Action := caFree; 를 Action := TCloseAction.caFree; 했는데
폼은 종료되나 메모리에 그대로 남아있고 다시 동일한 폼을 띄우고 닫고 반복하면 메모리가 동일하게 누적되어 증가하고 있습니다 ㅠ.ㅠ
혹, 동적 폼생성에 문제가 있거나 동적폼 안에서 동적 컴포넌트 생성에 문제가 있으면 그럴수도 있을까요?
외견상 의도된대로 실행은 잘 되고 있습니다 ㅠ.ㅠ
-
지병철
2019.04.15 15:31
음... 제가 드린 소스를 실행하면, 메모리가 정상적으로 반환됩니다.
제가 메모리 반환되는 것 까지 확인한 것 입니다.
작업하신 소스를 올려 주시면, 다시 확인해 보겠습니다.
-
지병철
2019.04.16 16:36
실제 소스가 올라오지 않아서, 위에 질문하신 소스만을 참고로 이야기 하자면...
procedure TFormMain.Button1Click(Sender as TObject);
begin
with TFormMon.Create(Self) do
begin
try
Name := 'FormMon_'+IntToStr(i_Mon_Num); // 생성시 TFormMon의 Name을 바꿈.
i_My_Mon_Num := i_Mon_Num;
finally
...
...
end;
end;>>> 여기까지 TFormMon 을 계승한 새로운 Form이 만들어 졌습니다.
FormMon.MakeObjects(7, 'N'); // FormMon 폼의 Public 프로시저 실행.
FormMon.Show;>>> FormMon 은 새롭게 만들어진 것이 아닌 디자인시에 만든 Form 으로 생각됩니다.
>>> 따라서, 여기서 FormMon.Show 를 하면, 기존 폼이 화면에 보이게 되며,
>>> 위에서 새롭게 만든 Form이 보여지는 것이 아닌 것으로 파악됩니다.
>>> 그러므로, FormMon을 close 하더라도, 새로이 만들어진 Form 은 메모리에서 없어지지 않는 것 같습니다.
end;
메모리 반환이 안되는 것을 어떠한 방식으로 확인 하셨는지요?
알려 주시면 확인해 보도록 하겠습니다.