Q&A

  • 버튼 이벤트좀 가르쳐 주세요 ...
음. .

프로그램 시작할때 .... 폼이 나온후에 ,, 버튼을 누르면 .

그 폼이 사라지고 , 메인 폼이 나오게 하는법좀 가르쳐 주세요 ..

아 .. 그리고 ; 배포할때는 .. exe 파일만 배포하면 ... 다른컴에서 실행이 되나요 ... 친구한테 exe 만 줬는데 .. 안된데요 -_-; xp에서 안되는거 같아요 ;;
3  COMMENTS
  • Profile
    고지범 2002.08.10 02:32
    가정을 아래와 같이 한다면...
    구분          : 클래스     , unit 이름, 자동 생성 여부..
    Main Form : TForm1   , unit1     , Auto-Create
    Sub Form  : TForm2   , unit2      , no auto-create

    interface
    uses ... 쭉...;
    type
      TForm1 = class(TForm)
         ..... 컴포넌트들...쭉...
      protected
        procedure WMMYShow(var M:TMessage);message WM_USER+4444;
      end;

    implementation
    uses
       unit2;

    ... 다른 코드들... 쭉....

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      // TApplication.Run 코드를 보시면 첨에 이렇게 설정해야 하는 이유가 나옵니다...
       Application.ShowMainForm := false;
       Self.visible := false;

       with TForm2.Create(nil) do begin
          OutHandle := Self.Handle;
          Show();
       end;
    // 여기서 부터는 TForm2 만 보이게 되죠...
    end;

    procedure TForm1.WMMYShow(var M: TMessage);
    begin
    // 원래 밑의 코드는 없어두 되는 데... 처음과 같은 상태로 만드는 것이 좋을 듯해서 사족 삼아 달아 둡니다..
       Application.ShowMainForm := true;
       Visible := true;
    end;

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

    type
      TForm2 = class(TForm)
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        OutHandle  :THandle;
      end;
    .....
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    // 만들때 자동 생성이 아니라 직접 만들었으므로 죽이는 것두 직접 죽여야 함...
       Action := caFree;
    // 전체 프로그램으로 보면 IsWindow(OutHandle) 호출은 사족이나... 안전한게 좋은 거죠 모... ^^
       if IsWindow(OutHandle) then SendMessage(OutHandle,  
                                                                      WM_USER+4444, 0,0)
    end;

    글구... 필요한 파일이나 dll이 Win32 공통이면 거의 돌텐데요...
    사용하는 api 쪽이나 환경 등은 MSDN 참고하셔야 할 듯합니다..
    제 생각에는 XP 이기 때문에 안된다는 것은 좀... 이상하다고 생각하거든요..

    오늘도 즐입니다....  

  • Profile
    구름다리 2002.08.10 03:26
    자꾸 ... 오류나고 ;;

    이해가 안되요 ;; 그저께;; 시작했거든요 ;;
    ------------------------------------------------------------------
  • Profile
    고지범 2002.08.12 19:15
    상황은 TForm2 가 메인 폼이 아닌데 먼저 보이다가 TForm2가 종료될 때,
    메인 폼인 TForm1이 다시 보이면 되는 것이죠??(상황이 맞나 몰겠네요...)
    여러 방법이 있겠지만 제가 사용한 방법만 말씀드리면... 먼저,
    델파이 프로젝트 파일을 소스보기로 보시면, 맨 처음에 CreateForm에서
    불리는 것이 Application의 메인 폼으로 설정이 됩니다. 지금 상황에서는
    TForm1이죠.. 원래 델파이에서 동작하는 것을 건들이지 않고 제일 처음
    설정하여 건들수 있는 부분이 TForm1.FormCreate (OnCreate 헨들러)입다.

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    // TApplication.Run 코드를 보시면 첨에 이렇게 설정해야 하는
    // 이유가 나옵니다... 메인 message loop 돌기 전에 메인 폼이 visible이
    // 아님 visible = true 시키면서 보이게 되니깐.. 일단 보이지 않게 하기
    // 위해서
       Application.ShowMainForm := false;
       Self.visible := false;

       with TForm2.Create(nil) do begin
          OutHandle := Self.Handle;
          Show();
       end;
      // 여기서 부터는 TForm2 만 보이게 되죠...
    end;

    TForm2가 죽을 때, 즉 폼이 닫힐 때 TForm1에 알려 주어야 하는 데...
    예전 프로그래머라 간단하게 하는 방법이 Windows Message 사용하는
    겁니다... 그래서 Windows message 쓴다고 다음과 같이 선언하고...
      protected
        procedure WMMYShow(var M:TMessage);message WM_USER+4444;
    보통 윈도우 메시지 헨들러는 protected로 선언하는 것이 델파이쪽 관례
    거든요... 따라서 위 코드는 WMMyShow라는 procedure는 윈도우 메시지
    WM_USER+4444라는 메시지가 오면 실행된다라는 의미입니다.. 인자 부분의
    var M:TMessage 형식은 꼭 들어가야 됩니다. 그럼 WMMYShow을 살펴보면
    procedure TForm1.WMMYShow(var M: TMessage);
    begin
    // 원래 밑의 코드는 없어두 되는 데...
    //처음과 같은 상태로 만드는 것이 좋을 듯해서 사족 삼아 달아 둡니다..
       Application.ShowMainForm := true;
       Visible := true;
    end;
    단순히 Visible := true;를 사용해서 폼을 다시 보여주는 것이죠..

    TForm2를 살펴보면 넣어주어야 하는 것은...
    TForm2.FormClose(OnClose handler)부분만 신경써주면 됩니다.
    Action := caFree;는 메모리에서 현재 객체를 없애겠다는 것입니다.
    TForm.Close를 따라가보시면 caFree인경우 Free();를 호출하는 것을 알 수
    있습니다.
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    // 만들때 자동 생성이 아니라 직접 만들었으므로 죽이는 것두
    //직접 죽여야 함...
       Action := caFree;
    // 전체 프로그램으로 보면 IsWindow(OutHandle) 호출은 사족이나...
    // 안전한게 좋은 거죠 모... ^^
       if IsWindow(OutHandle) then SendMessage(OutHandle,  
                                                                      WM_USER+4444, 0,0)
    end;
    프로그램은 간단하죠? 단지 설정된 헨들값에다가 윈도우 메시지만 쏘는 겁니다.
    헉헉헉... 장황하게 설명했는 데.. 설명이 잘 되었는 지..??? 잘 모르시겠음, 개인 멜로 연락주세요.. 테스트한 프로젝트 보내 드리져...
    오늘도 즐입니다.