線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1125
推到 Plurk!
推到 Facebook!

關於判斷目前開的表單的問題

答題得分者是:hagar
mi86018
一般會員


發表:20
回覆:39
積分:21
註冊:2003-11-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-18 10:34:04 IP:61.222.xxx.xxx 未訂閱
我寫了一個常駐程式,在點下右鍵可開啟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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-18 10:37:33 IP:61.222.xxx.xxx 未訂閱
不好意思..我在說清楚一點點,我希望的功能是,已經開啟這個form了,就不能在開相同的第二個,但是如果這個form關閉了,希望能再度被開啟。 謝謝大家~
迷糊
一般會員


發表:1
回覆:3
積分:0
註冊:2003-11-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-18 11:25:36 IP:61.51.xxx.xxx 未訂閱
把类名加上可以更准确些 isfound:=findwindow('TcomForm','通訊設定');
mi86018
一般會員


發表:20
回覆:39
積分:21
註冊:2003-11-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-18 12:46:03 IP:61.222.xxx.xxx 未訂閱
謝謝你的回應,可是我試過囉...還是不行ㄟ...
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-18 13:11:24 IP:218.32.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-18 14:14:41 IP:218.32.xxx.xxx 未訂閱
// 我試著將它轉成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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-18 19:33:46 IP:61.222.xxx.xxx 未訂閱
還是沒辦法..也許是我資質駑鈍吧...可不可以在稍微解釋一下呢?譬如說寫點註解,我再改寫成Delphi的程式。謝謝~~
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-18 20:40:53 IP:202.39.xxx.xxx 未訂閱
用 Application.FindComponent('The_Form_Name') 的結果是不是 nil 來判斷如何? --- Everything I say is a lie.
mi86018
一般會員


發表:20
回覆:39
積分:21
註冊:2003-11-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-11-19 00:36:17 IP:218.174.xxx.xxx 未訂閱
用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。
系統時間:2024-05-11 0:42:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!