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 이기 때문에 안된다는 것은 좀... 이상하다고 생각하거든요..
상황은 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;
프로그램은 간단하죠? 단지 설정된 헨들값에다가 윈도우 메시지만 쏘는 겁니다.
헉헉헉... 장황하게 설명했는 데.. 설명이 잘 되었는 지..??? 잘 모르시겠음, 개인 멜로 연락주세요.. 테스트한 프로젝트 보내 드리져...
오늘도 즐입니다.
구분 : 클래스 , 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 이기 때문에 안된다는 것은 좀... 이상하다고 생각하거든요..
오늘도 즐입니다....