흑흑.. 정말 초보델파이 개발잔데요..
없는 실력으로 고수님들 쫓아가려니 무지 힘듭니다..
그래두 어쩌겠습니까. 개발은 해야 하니.
이전 게시판에 써있는 초미소년님(게시번호 60420)과 훈님의 질문과 답변글을 잘 읽어 보았습니다.
초미소년님이 하려고 했던 것이 지금 제가 하려고 하는 것과 동일합니다.
동적으로 메뉴를 생성하고 그 메뉴를 클릭하면 해당 윈도우가 맨 앞으로 나오는 것이지요.
초미소년님이 했던 동적으로 메뉴를 만드는 작업까지는 따라갔습니다.
훈님이 가르쳐 주셨던 부분으로, 메뉴의 onclick 이벤트가 다음 부분인데요.
제가 너무 모르다 보니 쪼금만 응용할라치면 계속 문제가 생깁니다.
고수님들의 조언 부탁 드리겠습니다.
바로밑에는 훈님이 이렇게 해보라고 올리신 소스구여.
>>procedure TForm1.MyClickMenuItem(Sender: TObject);
>>var
>> winHandle: THandle;
>>begin
>> winHandle := Findwindow(nil, ExtractFormName(TMenuItem(Sender).Caption));//폼의 캡션과 메뉴아이템의 캡션이 같음
>> if winHandle = nil then
>> //폼을 찾을 수 없음. --> 이 루틴으로 들어온다면, 메뉴아이템을 잘못 작성한것이겠죠..
>> else
>> if not IsWindowVisible(winHandle) then
>> ShowWindow(winHandle, SW_RESTORE);
>> SetForegroundWindow(winHandle);
>>end;
>>이렇게 하면, 원하는 폼을 불러올 수 있을 것 같군요.
>>ExtractFormName이라는 function 은 메뉴아이템의 Caption으로부터 Form Name을 추출하는 것입니다. 메뉴아이템의 Caption은 단축키를 나타내는 string(&A)이 포함되어 있으니까요. 그건 직접 구현하시고요.
이제부턴 제가 짠 쏘스를 올려보지요.
procedure TFormMain.MyClickMenuItem(Sender: TObject);
var
winHandle: THandle;
i : integer;
szFormName : string;
szMenuCaption : string;
PosNameEnd : integer;
begin
szMenuCaption := TMenuItem(Sender).Caption;
PosNameEnd := Pos(' (', szMenuCaption);
szMenuCaption := Trim(Copy(szMenuCaption, 1, PosNameEnd-1));
//위에 세줄은 메뉴 caption을 form caption 과 비교할 수 있도록 변형한 작업입니다.
for i := 0 to Screen.FormCount-1 do
begin
if Screen.Forms[i].caption = szMenuCaption then
begin
winHandle := Findwindow(nil, PChar(Screen.Forms[i].Name));
break;
end;
end;
if winHandle = NULL then // <- 훈님의 소스와 다르죠? 따라하니 에러가 나더라구여. 그래서 수정했지요.
begin
// 잘못된 경우
ShowMessage('winHandle null');
end
else
begin
if not IsWindowVisible(winHandle) then
begin
ShowMessage('Not IsWindowVisible');
ShowWindow(winHandle, SW_RESTORE);
end;
if SetForegroundWindow(winHandle) = true then
begin
ShowMessage('SetForegroundWindow true');
end else
begin
ShowMessage('SetForegroundWindow false');
end;
end;
end;
요지는.. 제가 FindWindow 를 잘못 쓰고 있는 것 같습니다.
제가 ExtractFormName의 기능을 제대로 수행하지 못한걸까요?
handle 을 제대로 넘겨받은건지 아닌지도 알수가 없습니다.
실행을 해보면
1. winHandle 가 NULL 인지 체크에서는 걸리지 않습니다.
2. IsWindowVisible 는 false 가,
3. 'SetForegroundWindow 도 false 가 return 됩니다.
아마도 제가 너무나 모르기때문에 헤메고 있는 것 같군요..
어디서 부터 잘못된 것인지 제발 가르쳐 주세요..