關於判斷目前開的表單的問題 |
答題得分者是:hagar
|
mi86018
一般會員 發表:20 回覆:39 積分:21 註冊:2003-11-17 發送簡訊給我 |
我寫了一個常駐程式,在點下右鍵可開啟PopupMenu,點選功能之後呢,我會開啟一個form,我想做個功能就是判斷這個form是否已經開啟,如果已經開啟了,再次點選PopupMenu就沒有作用。
因此我參考了站上的一些文章是關於findwindow的,因此寫了下列的程式碼。 procedure TMainForm.N2Click(Sender: TObject);
var isfound:Thandle;
begin
isfound:=findwindow(nil,PChar('通訊設定'));
if isfound <> 0 then
exit;
Application.CreateForm(Tcomform, comform);
comform.ShowModal;
comform.Close;
end; '通訊設定'是那個form顯示的caption,我不知道我這樣的寫法對不對,因該是不對的,因為isfound的值只有第一次是0,之後都是非0,就算這個form關閉了,再次開啟時還非0,因此只開過第一次之後,就沒辦法再開啟。
請問我該怎麼改寫才能正確的達到我要的功能呢??我是API的新手,請多包涵。謝謝~
|
mi86018
一般會員 發表:20 回覆:39 積分:21 註冊:2003-11-17 發送簡訊給我 |
|
迷糊
一般會員 發表:1 回覆:3 積分:0 註冊:2003-11-18 發送簡訊給我 |
|
mi86018
一般會員 發表:20 回覆:39 積分:21 註冊:2003-11-17 發送簡訊給我 |
|
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
void __fastcall TForm1::FormCreate(TObject *Sender) { Application->Title=Form1->Caption; //TrayIcon1->Hint=Form1->Caption; HANDLE PrevInstHandle; HANDLE Mutex = OpenMutex(SYNCHRONIZE,false,Application->Title.c_str()); if (Mutex != null) { String AppTitle=Application->Title; SetWindowText(Application->Handle,null); PrevInstHandle = FindWindow("TApplication", AppTitle.c_str()); if (PrevInstHandle != 0) { if (IsIconic(PrevInstHandle)) ShowWindow(PrevInstHandle, SW_RESTORE); else BringWindowToTop(PrevInstHandle); SetForegroundWindow(PrevInstHandle); } Application->ShowMainForm = false; Application->Terminate(); } else CreateMutex(null, false, Application->Title.c_str()); // 接下來可以插入您其它要寫在 FormCreate 中的程式 } |
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
// 我試著將它轉成Delphi語法
// 個人對Delphi並不熟悉... 若有錯誤請不吝指正。謝謝。
procedure TForm1.FormCreate(Sender: TObject) var PrevInstHandle : HANDLE; Mutex : HANDLE; begin Application.Title:=Form1.Caption; Mutex := OpenMutex(SYNCHRONIZE,false,Application.Title.c_str()); if Mutex <> null then begin String AppTitle := Application.Title; SetWindowText(Application.Handle,null); PrevInstHandle := FindWindow("TApplication", AppTitle.c_str()); if PrevInstHandle <> 0 then begin if IsIconic(PrevInstHandle)) then ShowWindow(PrevInstHandle, SW_RESTORE); else BringWindowToTop(PrevInstHandle); SetForegroundWindow(PrevInstHandle); end; Application.ShowMainForm := false; Application.Terminate(); end; else CreateMutex(null, false, Application.Title.c_str()); // 接下來可以插入您其它要寫在 FormCreate 中的程式 end;數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D 發表人 - anpino 於 2003/11/18 14:16:08 發表人 - anpino 於 2003/11/18 14:17:52 |
mi86018
一般會員 發表:20 回覆:39 積分:21 註冊:2003-11-17 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
mi86018
一般會員 發表:20 回覆:39 積分:21 註冊:2003-11-17 發送簡訊給我 |
用Application.FindComponent解決了!感謝hagar兄的指導也感謝anpino兄的不厭其煩的解說,但是也許我實力太差,沒辦法改寫,總之...謝謝兩位的鼎力相助~
改寫後的程式如下:
procedure TMainForm.N2Click(Sender: TObject);
begin
if Application.FindComponent('comform') <> nil then
exit;
Application.CreateForm(Tcomform, comform);
comform.ShowModal;
comform.Free;
end; 本來comform.Close要改成comform.Free,不然在第二次以後開啟form,Application.FindComponent回傳的值還是不會是null。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |