Q&A

  • nil 이랑 cafree랑 친한가요?
안녕하세요. 다름이 아니라 Tform1.formclose에서 말이죠.

parameter로 넘어오는 action에다가 cafree줘서 해체하는거랑

form1 에다가 nil줘서 죽이는거랑 어떤 차이가 있는지 모르겠습니다.

지금은 두개 다 씁니다.



procedure TForm1.FormClose(Sender: TObject;

var Action: TCloseAction);

begin

action := cafree;

form1 := nil;

end;



문제는 이렇게 죽인 폼을 나중에 다른 폼에서 findwindow('TForm1', nil)하면 엉뚱하게 0 이상의 값을 리턴한다는 것이죠..그런데 또다른 문제는 다른사람은 안그렇대요..호호.

이게 대체 무슨 일인지 분석좀 해주세요..두 방법의 진짜진짜 효과가 어떻게 다른지..

그럼 답변을 기다리며....좋은 하루 되세요



3  COMMENTS
  • Profile
    이정욱 2000.04.07 03:39
    만약 폼을 동적으로 생성하셨다면...

    그냥 nil로 주시면 안됩니다.

    꼭 action := caFree를 해주세요.

    nil로 해주시면 그 폼을 가리키는 포인터만 없어지는것이지 메모리에는 그대로 남아있는것입니다.

    그냥 nil로만 해주셨다면 계속 폼을 만들다보면 맛이 가게 되어있죠. ^^;

    Action := caFree를 꼭 해주세요.

    참고로 Free하면서 nil로 만들어주는 함수가 델5에서 생겼네요.

    바로 FreeAndNil이라는 함수입니다.

    이것은 자신을 FreeAndNil을 할 수는 없습니다.. 참고하세요.



    박수연 wrote:

    > 안녕하세요. 다름이 아니라 Tform1.formclose에서 말이죠.

    > parameter로 넘어오는 action에다가 cafree줘서 해체하는거랑

    > form1 에다가 nil줘서 죽이는거랑 어떤 차이가 있는지 모르겠습니다.

    > 지금은 두개 다 씁니다.

    >

    > procedure TForm1.FormClose(Sender: TObject;

    > var Action: TCloseAction);

    > begin

    > action := cafree;

    > form1 := nil;

    > end;

    >

    > 문제는 이렇게 죽인 폼을 나중에 다른 폼에서 findwindow('TForm1', nil)하면 엉뚱하게 0 이상의 값을 리턴한다는 것이죠..그런데 또다른 문제는 다른사람은 안그렇대요..호호.

    > 이게 대체 무슨 일인지 분석좀 해주세요..두 방법의 진짜진짜 효과가 어떻게 다른지..

    > 그럼 답변을 기다리며....좋은 하루 되세요

    >

  • Profile
    박수연 2000.04.07 22:34
    감사합니다.

    근데, cafree한 다음에 nil로 마무리하는 것이 꼭 필요한가요? cafree만 해도 되는데?

    거듭 감사합니다.

  • Profile
    조규춘 2000.04.07 03:29
    좋은 답변이 될지 모르것지만 cafree에 관하여 한번 적어보도록 하것습니다.



    관련된 내용을 적어 보겠습니다.

    일반적임 폼이 아닌 폼은 보통 메모리 해제를 할때 free를 사용합니다.

    그렇지만 다른(MDI나 SDI폼) 같은 경우에는 완전히 해제가 되지 않습니다.

    그리하여 완전해제할수 있는 cafree를 사용한다고 하네요!

    보통의 폼에서는 close로도 free의 역할을 한다네요!(실질적으로 느끼지 못해서버리)

    또 다른 것들....



    cafree - 메모리에서 폼을 완전히 해제한다.

    cahide - 메모리에는 남아 있고 단순히 폼만 숨긴다.

    caminimize - 폼을 최소화 한다.

    canone - 아무런 역활도 하지 않는다.



    또 free에 관하여 사전에서 찾아 적습니다.

    -------------------------------------------------------------------------

    Free

    이 프로시저를 호출한 인스턴스가 nil인지를 점검해 보고 nil이 아닐경우

    Destroy를 호출하여 객체를 메모리에서 해제한다. 인스턴스가 nil일 경우

    Free호출은 무시된다.

    -------------------------------------------------------------------------

    지리산 노고단에서 백지현인가? (히~ 썰렁한 유머)

    객지에서 조규춘이었습니다. 히 garam4g@chollian.net







    박수연 wrote:

    > 안녕하세요. 다름이 아니라 Tform1.formclose에서 말이죠.

    > parameter로 넘어오는 action에다가 cafree줘서 해체하는거랑

    > form1 에다가 nil줘서 죽이는거랑 어떤 차이가 있는지 모르겠습니다.

    > 지금은 두개 다 씁니다.

    >

    > procedure TForm1.FormClose(Sender: TObject;

    > var Action: TCloseAction);

    > begin

    > action := cafree;

    > form1 := nil;

    > end;

    >

    > 문제는 이렇게 죽인 폼을 나중에 다른 폼에서 findwindow('TForm1', nil)하면 엉뚱하게 0 이상의 값을 리턴한다는 것이죠..그런데 또다른 문제는 다른사람은 안그렇대요..호호.

    > 이게 대체 무슨 일인지 분석좀 해주세요..두 방법의 진짜진짜 효과가 어떻게 다른지..

    > 그럼 답변을 기다리며....좋은 하루 되세요

    >