Q&A

  • 모달폼에 대하여..
완존 쌩초보입니다.

모달폼을 열구 닫을때...

Modalresult:=mrok;

글구 엄마폼에서 모달폼을 여는 버튼 클릭이벤트

procedure TfrmRegMater.SpeedButton5Click(Sender: TObject);
begin
    if not(assigned(FrmRegMaterm)) then  //아직 생성안되있으면 생성
        FrmRegMaterm := TFrmRegMaterm.Create(nil);


      frmregmaterm.showmodal;

      if frmregmaterm.ModalResult = mrok then
         begin
           frmregmaterm.Close;
           frmregmaterm.Free;
         end;


end;

end.

이렇게 했습니다..
근데..실행시켜서..
모달폼 한번 열구 닫을때는 상관이 없는데..
다시 두번째 열라구 버튼을 클릭하면 에라가 발생합니다..
이유가 먼지 몰겠슴다...
모달폼이 닫히면서 free가 실행되서 그런것 같은데..
(그부분을 없애면 에러 없음..)
책에보니 free라는것이 메모리를 모달폼에 할당된 메모리를 해제해 준다고 하더군요..
그럼.. 다시 모달폼 부르는 버튼 누를때..
뭔가가 다시 메모리를 할당해 주어야 하는것 같은데..
그게 안되는 모냥입니다..
그것좀 알려주심 고맙겠습니다..

구럼.. 항상 즐플, 즐델 하시궁..
행복한 하루 보내세욥~~!!!!


4  COMMENTS
  • Profile
    mute 2002.04.25 21:34
    쩝 아냐세염 전 돌파리 입니다. 걍 참고만 하세요 캬캬캬..

    우선 문제의 원인은 이부분입니다.

    쩝 뭐라고 설명해야 쉬울까여...쩝 지두 욜라 아는게 움써서리..움헤헤...^^;;

    걍 무식하게 지가 아는데로 적겠습니다....

    물론 처음 한번은 잘 될것입니다.

    FrmRegMaterm <- 이넘이 생성이 안돼어있고 메모리 할당이 안돼어 있으니까여

    그래서 처음에는  FrmRegMaterm := TFrmRegMaterm.Create(nil);

    이넘을  잘 실행 하져....바뚜....그러나

    frmregmaterm.Free;  이넘을 만나고 난뒤 분명히 free를 시켰음에도

    불구 하고 frmregmaterm 이넘은 완전한 메모리 해제를 하지 못합니다.

    한마디로 nil 이 아니라는 얘기죠 도움말에도 보면(지가 욜라 영어 몬해서 정확한지는 알수 움쑴 ^^) 어떤 개체는 소유주가 메모리 해제 될때가지 완전히 메모리 헤제를 하지 못한다고 나와있습니다.

    쩝 비유가 될런지 모르지만 밥그릇 안에 밥만 제거시키고 밥 그릇만 남은 상태죠.. 원래는 밥그릇 까지 치워야 하는데.....밥상이 없어질때까지는 밥 그릇도 남아있다는 거죠.... 쩝 이거 말이 되는겨? 캬캬캬...^^;;

    고로 다음번
    이넘을 만나면 밥 그릇은 아직 남아 있으니 걍 넘어가서

    다음 코드를 실행 안하는거죠...

    그러면 다음 코드에서는
    아뛰 밥두 없는데 뭘 먹으라는겨 하면서 밥 내놓으라고 땡강을 부리는 거져...

    캬캬캬..

    그럼 어케 하느냐....
    걍 쉽게 하자면 frmregmaterm :=nil ; 요렇게 하면 됩니다만...
    전 어디에서도 요렇게 쓰는걸 못봤습니다..... 왜그러쥐?
    지두 이렇게는 안쓰걸라여........^^
    고수님둘...왜그러죠? 쩝 갑자기 궁금하당....에궁 생각하는거 정말 구찮어...
    여하튼 정리해서 써보면 요렇게 쓰시면 됩니다.


      if not(assigned(FrmRegMaterm)) then  //아직 생성안되있으면 생성
      FrmRegMaterm := TFrmRegMaterm.Create(Application);
      if frmregmaterm.showmodal = mrok then
      begin
          frmregmaterm:=nil;
       end;

    이상 정리 안돼는 허접 답변이었습니다.



  • Profile
    프로초보 2002.04.26 01:21
    하하.. 이처럼 답변을 해주시니..어렴풋이 이해가 갈듯(?)하네요..
    딱 저의 수준에 맞는 설명이었슴다..ㅋㅋ
    제가 쓴 소스는 책에 있는거 보구 쓴거거덩여..
    물론 제가 할거랑 딱맞는 예제가 없어서 제가 이것저것 덧붙인거지만요..-_-;

    암튼..
    님의 말씀대로라면..

       if not(assigned(FrmRegMaterm)) then  //아직 생성안되있으면 생성
            FrmRegMaterm := TFrmRegMaterm.Create(nil);

    요부분에서 if 문을 없애면 될것 같아서 없애봤더니 되더라구염..
    님의 말씀대루 하는것과 비교하면..

    밥상을 치우든 말든.. 상관 없이
    밥을 담아줘라.. 머 이런얘기가 되겠슴다..

    사실.. 제가 굳이

    frmregmaterm.Free;

    요걸 써먹을라구 하는건..
    머.. 다 아시리라 생각됩니다만..
    쓸데없는 메모리를 절약하자는..
    (책에 그렇게 나와 있더라구염.. 배운거슨 써먹는닷~!! 아쟈~!!..-_-;)
    프로그래머로써의 근성을 보여주기 위해서 인데..^^;;

    님의 말씀대로 하면.. 더욱 확실히 절약이 되는 건가요??
    아예 밥상까지 치웠다가 다시 차려주는거니깐..
    근데 그렇게 하면.. 아주 근소한 차이일지 몰겠지만..
    시스템 부하 라든지... 속도면에서 차이가 있을것 같다는 생각이 들었습니다..
    걍 쌩초보의 추측인데..
    제 생각이 맞는 건가요??
    흠.. 어떻게 하는거시 더 효율적인건가요??

    비록 쌩초보이긴 하지만..
    걍 이래저래 프로그램만 실행되는..
    효율성은 전혀 고려하지 않은..
    그런 프로그램은 하구 싶지 않아서리..
    확실히 배우고 시푼 욕심이니깐.. 이해해 주시기 바람당..^^;

    구럼..답변 부탁드리구욤..

    이미 보여주신 친절한 답변..진따루 감사드림다..

    즐델 하시구욤~~
    항상 행복하시길...


  • Profile
    mute 2002.04.26 20:13
    아따 그냥반 참말로 지가 엄청나게 생각하는거 싫어하는 넘인데
    이케 또 질문을 던져 불믄 머리가 참말로 아프지라우....

    쩝... 다음은 지가 구찮어서 팁에있는 다른 님꺼 샥 배껴 왔습니다. 헤헤
    begin
    if not(assigned(FrmRegMaterm)) then
       FrmRegMaterm := TFrmRegMaterm.Create(Application);

    try
    if FrmRegMaterm.ShowModal = mrOK then
    begin
      // TODO
    end;

    finally
    FrmModal.Free;
    FrmModal := nil;  // 폼의 포인터를 nil 로 설정
    end;
    end;

    Note : try..finally..end 구문은 예상못한 예외가 발생해도 폼의 인스턴스를 정상적으로 해제시킴다.

    Note : 폼의 인스턴스를 해제후 폼 포인터에 nil을 설정하는 것은 예기치 못한 버그를 막기 위해 좋은 코딩습관 임다. 선언한 클래스변수인 FrmModal 은 클래스를 가르키는 포인터 입니다. Free 하면 FrmModal에 할당된 메모리는 해제 되겠지만, FrmModal는 여전히 어떤 어드레스를 가지고 있습니다. 실수로 또는 버그로 다시 FrmModal의 메모리를 해제시키려고 시도한다면 최악의 경우 커널영역의 메모리를 지울수도 있습니다. nil은 어드레스 넘버 0번을 가르키며, 시스템은 O번 어드레스영역을 삭제하는 것을 금지합니다.



  • Profile
    프로초보 2002.04.27 00:46
    고맙습니다~!!!!

    항상 행복하시길.......



    • mute
      2002.04.25 21:34
      쩝 아냐세염 전 돌파리 입니다. 걍 참고만 하세요 캬캬캬.. 우선 문제의 원인은 이부분입니다. 쩝 뭐...
    • 프로초보
      2002.04.26 01:21
      하하.. 이처럼 답변을 해주시니..어렴풋이 이해가 갈듯(?)하네요.. 딱 저의 수준에 맞는 설명이었슴다..ㅋ...
    • mute
      2002.04.26 20:13
      아따 그냥반 참말로 지가 엄청나게 생각하는거 싫어하는 넘인데 이케 또 질문을 던져 불믄 머리가 참말로 ...
    • 프로초보
      2002.04.27 00:46
      고맙습니다~!!!! 항상 행복하시길.......
    • 이승준
    • 2002.04.25 19:29
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김영철
      2002.04.26 02:44
      혹시 인터넷으로 사용하는 프로그램이 ASP 아닌가요?? 그렇다면 IIS에 설정된 SetsoTimeOut(맞나?) 설정을...
    • 서종환
    • 2002.04.25 18:47
    • 0 COMMENTS
    • /
    • 0 LIKES
    • Tk
      2002.04.26 00:04
      date ->  timestamp
    • 송효철
    • 2002.04.25 15:05
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신석기
      2002.04.25 19:18
      uses절에   ShellAPI을 추가하시고 클릭적에 ShellExecute(Handle,'open','화일명',nil,nil,S...
    • 유은진
    • 2002.04.25 12:15
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김영철
    • 2002.04.25 11:55
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최은석
      2002.04.26 20:58
      in-line view & group by, having을 사용하시면 될듯하네여... 먼저 테이블명을 sample 라 가정하고... ...
    • 공성환
      2002.04.25 18:32
      데이타베이스가 뭔가요? 서브쿼리를 이용하면 될것같은데...
    • 원유훈
    • 2002.04.25 09:27
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박현수
    • 2002.04.25 08:32
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 정규성
    • 2002.04.25 05:57
    • 1 COMMENTS
    • /
    • 0 LIKES
    • mute
      2002.04.25 20:47
      자... 걍 허접 답변 들어주세요... ^_^ 이부분에 틀린 부분은 2개 있습니다. 우선 문법상 틀린점은 For...
    • 김상래
    • 2002.04.25 05:49
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 염상철
      2002.04.25 19:04
      quickRep 에 dataset이 지정 안되서 그런거에여.. 지정하세여..그럼..다 나와여..
    • 김상래
      2002.04.25 19:54
      답변은 고맙습니다. 근데요 DateSet 정의 했는데요. db에 데이타가 5건 있습니다. 근데 출력을 해보면 ...
    • 나원용
    • 2002.04.25 04:51
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 염상철
      2002.04.25 19:28
      dbgrid의 onCellClick이벤트에 datetimepicker1.visible:=true;
    • 최수림
    • 2002.04.25 04:26
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이기택
      2002.04.25 06:39
      제가 정확히 해보진 않았지만 format 함수를 쓰신거면 풀로 적어 주어보세요 Cells[0,i] := Formatda...
    • 최용일
      2002.04.25 04:30
      안녕하세요. 최용일입니다. 그냥 Now함수 쓰시면 안되나요? Now함수는 날짜와 시간을 구하는 함수인데.....
    • 최수림
      2002.04.25 04:58
      ^^ 감사합니다..!! 근에요..!! 날짜 시간 현재 날짜로 구해지는데요..!! 날짜와 시간사이..!! 그러니까...
    • 유현성
    • 2002.04.25 03:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.04.25 04:28
      안녕하세요. 최용일입니다. 그냥 TSpeedButton쓰시죠... 자료실에 FlatStyle컴포넌트가 있는데 그것...
    • 박선지
    • 2002.04.25 03:12
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.04.25 04:16
      안녕하세요. 최용일입니다. 엑셀 쉬트의 마지막 셀을 얻는 함수입니다... 조금 수정해서 사용하세요... ...
    • 전영민
      2002.04.25 03:15
      델파이가 아니라 vba로 예전에 개발했던중에서.. 저도 마지막 row를 알 수가 없어서 for 대신에 whil...
    • 최용일
      2002.04.25 04:08
      안녕하세요. 최용일입니다. 잘 알고 계시네요... 타입이 안맞아서 그럽니다. 님이 작성하신거는 그냥...
    • 정진영
    • 2002.04.25 02:17
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.04.25 04:33
      안녕하세요. 최용일입니다. EAccessViolation는 메모리 참조 오류인데... 생성되지 않은 객체나 이미 해...
    • 정진영
      2002.04.25 19:46
      close하기전에 폼을 변수로 선언하고 닫아주니 되네요.. 근데 거기서 문제가... 닫고자 하는 폼이 TfrmA...
    • 신석기
      2002.04.25 02:26
      if DBGrid1.SelectedField.FieldName = 'Field1' then begin // end; 위방법은 이상이 없습니다. G...
    • 서종환
      2002.04.25 18:15
      우선 답변에 감사드립니다. 음, RowSelect가 True인 상태이더군요... False로 하면 다 먹습니다. 그러나 ...
    • 이희정
    • 2002.04.25 01:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신석기
      2002.04.25 02:13
      환경설정을 검사해봐야 정확히 진단을 할 수 있을것 같습니다 일반적으로 import/Export 할때 option문제...