如何讓程式無法重複開啟?? |
答題得分者是:ko
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
channel
尊榮會員 發表:67 回覆:707 積分:854 註冊:2002-05-02 發送簡訊給我 |
引言: 小弟想要讓Delphi開發的程式,不能同時讓一個user連續重複開啟??您可能要在使用者的Table增加一個欄位,例如增加一個InUse的欄位預設為False,當user登錄後,將InUse寫成True,程式結束時將InUse寫成False,所以在登錄畫面時,你就判斷InUse為False才讓他開啟程式。我有用過這種方法,但有一缺點就是您的程式要夠穩定,如果你的程式當掉,那這位user就進不去了(因沒有時間將InUse寫成False)。 ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~ |
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
channel
尊榮會員 發表:67 回覆:707 積分:854 註冊:2002-05-02 發送簡訊給我 |
引言: 前輩: 如果我是某a程式中的MainMemu乎叫b程式,呼叫的時候用ShellExecute的方式,b程式用ParamStr來接收取得的字串參數值,但是當b程式要關閉時,如何丟回參數給a程式ㄋ??sorry!我沒有用這種方式寫過,不過幫您找了一下,您參考一下: http://delphi.ktop.com.tw/topic.php?topic_id=18149 您也可以在搜尋文章打上ShellExecute的關鍵字,裏面還有很多文章,您可以參考看看。
------
~小弟淺見,參考看看~ |
Jeffrey
初階會員 發表:10 回覆:58 積分:38 註冊:2002-04-15 發送簡訊給我 |
開啟.dpr檔案填入以下試試看:
........... var li_HWD:integer; begin CreateMutex(nil,true,pchar('xxx')); //xxx:自行設一個的名稱 if GetLastError=Error_already_exists then //如果已開啟 begin li_HWD:=FindWindow(NIL, 'yyy'); //yyy:Application.Title if ( li_HWD <> 0) then //將該程式Show出來 begin ShowWindow(li_HWD, SW_MINIMIZE); //先最小化,再Show才會 ShowWindow(li_HWD, SW_SHOWNORMAL); //顯示在最上方 end; halt; //結束本程式 exit; end; Application.Initialize; Application.CreateForm(TForm1, Form1); .......不知道有沒有什麼指令可以令某視窗直接顯示在最上方,並取得Focus? 發表人 - jeffrey 於 2003/03/14 08:58:24 |
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
ivankuo 你好:
在程式啟動時,先偵測有無同樣的程式在跑!
如果有則將自己關閉!!!
procedure TForm1.FormCreate(Sender: TObject);
var
PrevWnd: HWnd;
begin
PrevWnd := FindWindow(nil, 'Shuang-Shin');
if PrevWnd = 0 then
begin
Application.MessageBox('有相同主程式',OpError,mb_Ok);
self.Close;
exit ;
end;
end;
------
====================== 昏睡~ 不昏睡~ 不由昏睡~ |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
要令某視窗到最上層並取得 focus, 可以利用以下語法:
procedure TForm1.Button1Click(Sender: TObject); var hw: HWND; begin hw := findwindow(0,'Untitled - Notepad'); if hw <> 0 then SetWindowPos(hw, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); // 或使用 SetForegroundWindow(hw); end;發表人 - timhuang 於 2003/03/13 11:01:07 |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
引言: 在程式啟動時,先偵測有無同樣的程式在跑! 如果有則將自己關閉!!!ko 兄. 可能是你筆誤的關係. 應該是 if PrevWnd <> 0 then 才是找到已開啟的程式...procedure TForm1.FormCreate(Sender: TObject); var PrevWnd: HWnd; begin PrevWnd := FindWindow(nil, 'Shuang-Shin'); if PrevWnd = 0 then begin Application.MessageBox('有相同主程式',OpError,mb_Ok); self.Close; exit ; end; end; |
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
引言: ivankuo 你好: 在程式啟動時,先偵測有無同樣的程式在跑! 如果有則將自己關閉!!! procedure TForm1.FormCreate(Sender: TObject); var PrevWnd: HWnd; begin PrevWnd := FindWindow(nil, 'Shuang-Shin'); if PrevWnd = 0 then begin Application.MessageBox('有相同主程式',OpError,mb_Ok); self.Close; exit ; end; end;請問一下 PrevWnd := FindWindow(nil, 'Shuang-Shin');中的Shuang-Shin是指呼叫程式的form.caption ㄇ??
------
ivankuo |
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
不好意思,小弟發生大烏龍,
因為我以為只有在執行的form才算是會被findWindow找到,
忘記我的被呼叫程式的form正用delphi在修改,所以才會一直說我的程式已經被開啟。感謝各位幫忙。
不過小弟有原先的問題若改變另一種的方式達到目的,不知如何做,如果我的被呼叫的程式b是放在主程式a的MainMemu中,我在呼叫b程式時,就把他enabled為false,問題就在當我b程式要關閉的時候,我要如何將MainMemu中b程式的enabled改為true,我的b程式並未與a程式掛在同一個專案的情況下,也是用ShellExecute的方式來呼叫的。
請問怎做ㄋ??
------
ivankuo |
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
ivankuo你好:
很抱歉!!
程式有錯!!
今天作業環境不佳,空氣中有濃濃的強力膠味,導致精神恍惚..飄飄然...
可惡得裝潢公司.....
我更正程式碼
..
...
> >< face="Verdana, Arial, Helvetica">引言:
我在呼叫b程式時,就把他enabled為false,問題就在當我b程式要關閉的時候,我要如何將MainMemu中b程式的enabled改為true
當然也可以在觸發b程式的時候,觸發一個timer用上述的code偵測b是否存在當b
不存在時將a的功能true...
或者在b.close使用api傳一個訊息Messages給a,不過要使用的技巧比較麻煩
------
====================== 昏睡~ 不昏睡~ 不由昏睡~ |
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
提供一個我的做法
procedure TForm1.FormShow(Sender: TObject);
var
Hwnd: THandle;
SEND: string;
begin
SEND := 'C:\123.exe';
Hwnd := FindWindow(nil, PCHAR('客戶資料'));//該程式的FormCaptionName
if Hwnd = 0 then
begin
WinExec(PChar(SEND), 1);
end
else
begin
BringWindowToTop(Hwnd);
end;
end;
TRY TRY SEE
|
Jeffrey
初階會員 發表:10 回覆:58 積分:38 註冊:2002-04-15 發送簡訊給我 |
引言: 要令某視窗到最上層並取得 focus, 可以利用以下語法:謝謝timhuang,可以了,但還有一個問題,當被啟動的程式在"最小化"的狀態時被Show出來後,其"最小化"的按鈕就失效了,除非,按滑鼠右鍵,點"還原"後才行,再請教前輩,要怎麼讓它"還原"?謝謝!procedure TForm1.Button1Click(Sender: TObject); var hw: HWND; begin hw := findwindow(0,'Untitled - Notepad'); if hw <> 0 then SetWindowPos(hw, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); // 或使用 SetForegroundWindow(hw); end;發表人 - timhuang 於 2003/03/13 11:01:07 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |