2009-05-27 2 views
9

Delphi 온라인 도움말에 따르면 메모리에서 양식을 제거하려면 릴리스를 사용해야합니다. 그러나 모달 형식의 많은 예제에서이 구조를 보았습니다.델파이의 모달 폼에서 Release 대신 Free를 사용하는 것이 안전합니까?

MyForm := TMyForm.Create(nil); 
try 
    MyForm.ShowModal; 
finally 
    MyForm.Free; 
end; 

모달 형식을 안전하게 삭제하는 안전한 방법은 없습니까? ShowModal 소스에서 알 수 있듯이, Application.HandleMessage는 ModalResult가 0이 될 때까지 호출됩니다. Free가 보류중인 Windows 메시지를 방해 할 수없는 이유는 무엇입니까?

+0

관련 항목 : http://stackoverflow.com/questions/274523/form-release-nil – mjn

답변

14

예, ShowModal 전화 후 Free을 사용해도 안전합니다.

Release을 사용해야하는 경우는 이벤트 처리기 (예 : OnClick)의 중간에있는 경우로 이벤트 이후 추가 처리시 양식에 액세스해야하는 경우입니다. 이 경우 Release을 호출하면 이벤트 핸들러가 완료되고 컨트롤이 메시지 펌프 (ProcessMessages/Application.Run)로 반환 될 때까지 이벤트를 해제하지 않는 메시지 CM_RELEASE이 대신 게시됩니다. ShowModal은 이벤트 처리기가 완료되고 제어를 통해 스택을 백업 할 때까지 반환되지 않으므로 나중에 Free을 호출하면 실제로 CM_RELEASE 메시지가 처리되는 동일한 위치가됩니다.

+0

그리고 Application.ProcessMessages 호출이 없도록주의하십시오! –

+0

@GerryColl 왜? 정확히 어디에서? – Bozzy

+0

@Bozzy'Release'를 사용하고 나서'Application.ProcessMessages'를 호출하면'WM_RELEASE' 메시지가 처리되고 폼이 해제됩니다. Gerry의 관심사는 Release를 사용하여 파기를 연기 한 다음 실수로 양식을 완성하기 전에 실수로 양식을 해제하는 것입니다. –

3

물론 FreeAndNil 루틴을 사용할 수도 있습니다. FreeAndNil 루틴은 객체가 이미 nil이 아닌 경우에만 해제하고 자유 후에 nil로 설정합니다. 이미 해제 된 개체에서 무료로 직접 전화하면 액세스 위반이 발생합니다.

MyForm := TMyForm.Create(nil); 
try 
    MyForm.ShowModal; 
finally 
    FreeAndNil(MyForm); 
end; 
+4

작은 nitpick : Free는 객체가 아직 nil이 아닌 경우에만 해제하고 두 번째 부분은 중요한 객체입니다. – mghie

+3

MyForm이 지역 변수 인 경우, FreeAndNil()을 사용하면 확실히 과도한 것입니다. MyForm.Free만으로도 충분합니다. 사실 MyForm.Destroy도 제대로 작동합니다. –

+1

+ for Allen - FreeAndNil을 과도하게 사용하면 컴파일러에서 가져온 오류를 숨길 수 있습니다. 객체가 초기화되지 않았을 때 불평하지 않습니다 (대개 조건부 작성). 또한 질문에 답변하지 않습니다 (예). –

4

에 달려 있습니다. FreeRelease이 수행하는 이벤트 처리기를 호출하지 않으며 양식에 게시되고 대기중인 메시지는 처리되지 않습니다. 대부분의 경우, Free (또는 FreeAndNil)을 호출하는 대부분의 경우에 정상적으로 작동하지만 겉으로보기에 임의의 이유로 인해 매우 이상한 동작이 발생할 수 있습니다.

난으로 onClose 이벤트에서이 같은 caFree에 액션, 설정 좋을 것 대안 :

procedure FormClose(Sender : TObject; Action : TCloseAction) 
begin 
    Action := caFree; 
end; 

당신은 다음과 같은 코드를 작성할 수 있습니다

TMyForm.Create(nil).ShowModal; 

그리고 돈을 그것이 완료되면 자유로울 것이기 때문에 특별히 형식을 자유롭게 할 필요가 없습니다.

+0

저는이 창의력이 마음에 들지만 질문에 표시된 코드는 그 일을하는 관용적 인 방법 일 뿐이므로 절대 사용하지 않을 것입니다. 코드를 사용하면 몇 달 후에이 문제가 넘어 질 때 양식이 올바르게 해제되었는지 항상 궁금해 할 것입니다. . – mghie

+0

네, 기분이 어떻든간에 최고입니다. 그러나 이것은 폼의 기능을 완전히 캡슐화하고이를 잊어 버릴 가능성을 줄여줍니다. –

+0

caFree에 조치를 설정하면 단순히 Release가 호출됩니다. 무언가 (깨짐?)가 발생할 경우를 대비하여 showmodal 이후에 폼의 속성에 액세스하려면주의해야합니다. ProcessMessages –

관련 문제