Q&A

  • 메모리상에서 프로그램이 사라지지 않습니다.
안녕하세요!

궁금한 것이 있어 글을 올립니다.



메인 화면과 로그 온 화면이 있습니다.

물론, 로그 온 화면에서는 사용자ID 와 패스워드를 입력받아서

사용자 확인을 하지요.

로그 온 화면에서 확인하여 메인 화면으로 들어온후 프로그램을 정상종료

하면 문제가 발생하지 않습니다.

하지만, 로그온 화면에서 취소버튼을 누르면 프로그램이 메모리 상에서

삭제되지 않습니다.



아래 소스가 있으니 보시고 아시는 분은 답변 좀 해주세요.

그럼, 좋은 하루 되세요.



*** 메인 화면

procedure Tfrm_Main.FormShow(Sender: TObject);

begin

frm_Login := Tfrm_Login.Create(Application);

frm_Login.ShowModal;

end;





procedure Tfrm_Main.FormClose(Sender: TObject; var Action: TCloseAction);

begin

if CancleCHK = 'N' then // 정상로깅시 DB에 LogOut 값을 남김.

LogInsert(frm_Main.tren_qry, 'LogOut', Caption);



action := caFree;

end;



*** 로그온 화면



// 취소버튼 누를시

procedure Tfrm_Login.nok_sbtnClick(Sender: TObject);

begin

close;



CancleCHK := 'Y';

frm_Main.Close;

end;



procedure Tfrm_Login.FormClose(Sender: TObject; var Action: TCloseAction);

begin

action := caFree;

end;



3  COMMENTS
  • Profile
    류한규 1999.11.24 18:38
    안녕하십니까?



    CancleChk 같은 사용자 변수를 사용하지 않고 ModalResult를 사용하면 보다

    프로그램이 세련되지 않을까 감히 제안합니다.

    아래의 문영미님의 frm_Login.ShowModal후 폼을 메로리상에서 제거할

    frm_LogIn.Free가 없네요.



    제가 아래부분에 예제를 적어봅니다.



    // 메인화면

    procedure Tfrm_Main.FormShow(Sender: TObject);

    var

    mr: boolean;

    begin

    mr := false;

    try

    frm_Login := Tfrm_Login.Create(Application);

    frm_Login.ShowModal;

    mr := frm_Login.ModalResult;

    frm_LogIn.ShowModal;

    finally

    fmr_LogIn.free;

    end;

    if mr = mrCancle then

    begin

    LogInsert(frm_Main.tren_qry, 'LogOut', Caption);

    Close;

    end;

    end;



    // 로그온 화면



    // 취소버튼 누를시

    procedure Tfrm_Login.nok_sbtnClick(Sender: TObject);

    begin

    ModalResult := mrCancle;

    end;



    // OK버튼 누를시

    procedure Tfrm_Login.ok_sbtnClick(Sender: TObject);

    begin

    ModalResult := mrOK;

    end;









    *** 메인 화면

    procedure Tfrm_Main.FormShow(Sender: TObject);

    begin

    frm_Login := Tfrm_Login.Create(Application);

    frm_Login.ShowModal;

    >>>>> 제거부분 누락됨

    end;









    문영미 wrote:

    > 안녕하세요!

    > 궁금한 것이 있어 글을 올립니다.

    >

    > 메인 화면과 로그 온 화면이 있습니다.

    > 물론, 로그 온 화면에서는 사용자ID 와 패스워드를 입력받아서

    > 사용자 확인을 하지요.

    > 로그 온 화면에서 확인하여 메인 화면으로 들어온후 프로그램을 정상종료

    > 하면 문제가 발생하지 않습니다.

    > 하지만, 로그온 화면에서 취소버튼을 누르면 프로그램이 메모리 상에서

    > 삭제되지 않습니다.

    >

    > 아래 소스가 있으니 보시고 아시는 분은 답변 좀 해주세요.

    > 그럼, 좋은 하루 되세요.

    >

    > *** 메인 화면

    > procedure Tfrm_Main.FormShow(Sender: TObject);

    > begin

    > frm_Login := Tfrm_Login.Create(Application);

    > frm_Login.ShowModal;

    > end;

    >

    >

    > procedure Tfrm_Main.FormClose(Sender: TObject; var Action: TCloseAction);

    > begin

    > if CancleCHK = 'N' then // 정상로깅시 DB에 LogOut 값을 남김.

    > LogInsert(frm_Main.tren_qry, 'LogOut', Caption);

    >

    > action := caFree;

    > end;

    >

    > *** 로그온 화면

    >

    > // 취소버튼 누를시

    > procedure Tfrm_Login.nok_sbtnClick(Sender: TObject);

    > begin

    > close;

    >

    > CancleCHK := 'Y';

    > frm_Main.Close;

    > end;

    >

    > procedure Tfrm_Login.FormClose(Sender: TObject; var Action: TCloseAction);

    > begin

    > action := caFree;

    > end;

    >

  • Profile
    구창민 1999.11.24 10:36
    문영미 wrote:

    > 안녕하세요!

    > 궁금한 것이 있어 글을 올립니다.

    >

    > 메인 화면과 로그 온 화면이 있습니다.

    > 물론, 로그 온 화면에서는 사용자ID 와 패스워드를 입력받아서

    > 사용자 확인을 하지요.

    > 로그 온 화면에서 확인하여 메인 화면으로 들어온후 프로그램을 정상종료

    > 하면 문제가 발생하지 않습니다.

    > 하지만, 로그온 화면에서 취소버튼을 누르면 프로그램이 메모리 상에서

    > 삭제되지 않습니다.

    >

    > 아래 소스가 있으니 보시고 아시는 분은 답변 좀 해주세요.

    > 그럼, 좋은 하루 되세요.

    >

    > *** 메인 화면

    > procedure Tfrm_Main.FormShow(Sender: TObject);

    > begin

    > frm_Login := Tfrm_Login.Create(Application);

    > frm_Login.ShowModal;

    > end;

    >

    >

    > procedure Tfrm_Main.FormClose(Sender: TObject; var Action: TCloseAction);

    > begin

    > if CancleCHK = 'N' then // 정상로깅시 DB에 LogOut 값을 남김.

    > LogInsert(frm_Main.tren_qry, 'LogOut', Caption);

    >

    > action := caFree;

    > end;

    >

    > *** 로그온 화면

    >

    > // 취소버튼 누를시

    > procedure Tfrm_Login.nok_sbtnClick(Sender: TObject);

    > begin

    > close;

    >

    > CancleCHK := 'Y';

    > frm_Main.Close;

    > end;

    >

    > procedure Tfrm_Login.FormClose(Sender: TObject; var Action: TCloseAction);

    > begin

    > action := caFree;

    > end;

    >



    프로젝트 소스코드에다 로그인 폼을 부르는 코드를 작성해보세요.

    사용자 ID와 Password가 잘못 입력될 경우 바로 종료하게 하시면

    그런 문제가 발생하지 않을 것입니다.

    직접 코드를 작성해서 올려드리면 더욱 좋겠지만

    제가 지금 겜방에 와 있어서..

    잘 되지 않으시면 다시 질문올려 주시길 바랍니다.

    그럼.. 즐거운 프로그래밍 되시길~

  • Profile
    문영미 1999.11.25 01:47
    답변을 주신 분들께 감사드립니다. 꾸우뻑 ^^

    도움을 주신 덕에 문제 해결을 했습니다.



    but, 한가지 해결을 하지 못한 부분이 있어서 다시 글을 올립니다.

    소스코드를 올리오니 보시고 답변 부탁 드립니다.

    아래와 같이 showmodal 리턴값 체크가 되지 않아서 현재는 일반 변수를

    선언하여 제어 했습니다.



    더불어서, 아래의 함수 사용법에 알고 싶습니다.

    - 중복 실행 했을시 사용하는 것으로 알고 있는데요. 제대로 수행되지 않네요.

    AlreadyRun('프로그램명')

    - 해상도 검사 하는 법

    InvalidResolution then Halt;





    // 해결하지 못한 소스코드

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

    -- 프로젝트 화면

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

    function CheckUser: Boolean;

    begin

    Result := False;



    try

    frm_Login := Tfrm_Login.Create(Application);



    if frm_Login.ShowModal = mrOk then ====> 요기에서 에러가 납니다.

    Result := True; (Undeclared identifier: 'mrok')

    라는 메세지와 함께

    finally

    frm_Login.Free;

    end;

    end;



    begin



    Application.Initialize;

    Application.Title := 'Bill';



    Application.CreateForm(TDM1, DM1);



    if CheckUser then

    begin

    Application.CreateForm(Tfrm_Main, frm_Main);

    Application.Run; // 프로그램 수행

    end;



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

    -- 로깅 화면

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

    procedure Tfrm_Login.ok_sbtnClick(Sender: TObject);

    begin

    ModalResult := mrOk;

    end;



    procedure Tfrm_Login.nok_sbtnClick(Sender: TObject);

    begin

    ModalResult := mrCancel;

    end;





    // 대체 해결한 소스코드

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

    -- 프로젝트 화면

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

    procedure CheckUser;

    begin

    try

    frm_Login := Tfrm_Login.Create(Application);

    frm_Login.ShowModal;

    finally

    frm_Login.Free;

    end;

    end;



    begin

    Application.Initialize;

    Application.Title := 'Bill ...';



    Application.CreateForm(TDM1, DM1);



    // Login 화면

    CheckUser;



    if CANCELCHK = 'N' then ====> login 화면에서 정상 로깅 했을시 메인 화면을

    보여줍니다.

    begin

    Application.CreateForm(Tfrm_Main, frm_Main);

    Application.Run;

    end;



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

    -- 로깅 화면

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

    procedure Tfrm_Login.ok_sbtnClick(Sender: TObject);

    begin

    CANCELCHK := 'N';

    end;



    procedure Tfrm_Login.nok_sbtnClick(Sender: TObject);

    begin

    CANCELCHK := 'Y';

    end;