Q&A

  • 폼을 Show로 보일때 엑세스바이올레이션 에러가...
폼 102에서 폼 1021을 보여줍니다.
폼1021이 보여진 상태에서 커서가 폼102에 갈 수 있게 하기위해...
다음과 같이 보여줍니다.
(폼1021은 Auto Create로 설정했습니다)

procedure TFm102.R1Click(Sender: TObject);
begin    
    if not Fm1021.Visible then
       Fm1021:= tFm1021.create(Self);----->여러번이벤트가 있으면 에러..

    Fm1021.ac_bmyy.text := ac_bmyy.text;
    Fm1021.ac_bmmm.text := ac_bmmm.text;
    Fm1021.Show;
end;
이후 폼1021의 데이터(Query)를 폼102에 넘겨줍니다.
폼 1021에서도 여러가지 조회 등을 합니다.폼 1021에는 Grid도 Query도
버튼도... 컴포넌트가 여러개 있습니다.

폼1021을 닫을때 다음과 같이 메모리에서 해제를 해 줍니다.
procedure TFm1021.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    SQLpm.Close;
    Action := CaFree;
end;

폼 102를 닫을때 다음과 같이 메모리에서 해제 해 줍니다.
procedure TFm102.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   if Fm1021.Visible then begin   ----->여러번이벤트가 있으면 에러..
      try
        Fm1021.Close;
      finally
       Fm1021.Free;
      end;
   end;
   Action := caFree;
end;

문제: 1021폼을 여러번 닫았다가 생성(TFm102.R1Click) 할 경우
       엑세스 바이올레이션이 걸립니다.
       이럴경우 102폼을 닫아도 역시 엑세스 바이올레이션이 걸립니다.

매번 질문이 소설을 쓰는것 같아 죄송합니다.
고수님들 어떻게 해야 합니까?..
2  COMMENTS
  • Profile
    김수경 2002.09.12 00:07
    자동생성 Form을 중간에 재생성(tFm1021.create(Self))하게 하는
    식으로 만드시면 프로그램 종료시 Check해야 하는 부분이 더 많아
    지므로 비 효율적인 프로그램이 됩니다.

    님의 프로그램의 경우 Form1021를 자동 생성 Form을 사용했으므로
    자동 생성/해제되기 때문에

      Fm1021:= tFm1021.create(Self);----->여러번이벤트가 있으면 에러..
      TFm1021.FormClose procedure에서
        Action := CaFree

      TFm102.FormClose procedure에서
        Fm1021.Close

    등은 필요 없게 됩니다.
    만약 이 부분이 남아 있게되면 메모리상에서 제거된
    Form을 참조하는 형태가 되기 때문에 오류가 발생하게 됩니다.

    굳이 현재 처럼 작성하길 원한다면
    수동으로 Form 생성, 수동으로 해제
    하는 형태로 만드세요

    즐프하세요.

  • Profile
    강재규 2002.09.11 22:34

    이렇게 한번해보세요.
    도움이 될런지.
    제가 알고있기로는  메모리에서 완전히 지우는 방법이
    fr1021 := nil 이라고 알고있어서...
    그럼 즐코하세요.

    procedure TFm102.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
          Action := caFree;
          Fm1021 := nil;
    end;