全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2074
推到 Plurk!
推到 Facebook!

同一 AP 中重覆 Create 一個 Form 發生的問題

答題得分者是:william
crlin
一般會員


發表:47
回覆:57
積分:20
註冊:2002-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-11-13 09:07:38 IP:211.22.xxx.xxx 未訂閱
在程式中若 user 忘了己開啓過 Form1 且尚未 Close Form1 的情況下又 Create 一次 Form1 則會出現 Name not unique in this context 請問如何讓同一個 Form 可以重覆 Create 而不會出現 error 呢 ?
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-11-13 09:20:10 IP:147.8.xxx.xxx 未訂閱
引言:請問如何讓同一個 Form 可以重覆 Create 而不會出現 error 呢 ?
Change the "Name" of the form after its creation to a unique name. BTW, a form should be able to be created as many times as you want. Maybe you are using TFrame? Frame should be unique in the application.
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-11-13 09:24:58 IP:211.74.xxx.xxx 未訂閱
提供一段我的做法你參考看看.. 我是利用Form的Caption來做判別.. 假設你的Form的Caption是ABC.... begin Hwnd := FindWindow(nil, PCHAR('ABC')); if Hwnd = 0 then begin WinExec(PChar(SEND), 1); end else begin BringWindowToTop(Hwnd); end; end; 如有錯誤敬請指正...
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-11-13 09:38:03 IP:203.204.xxx.xxx 未訂閱
引言: 在程式中若 user 忘了己開啓過 Form1 且尚未 Close Form1 的情況下又 Create 一次 Form1 則會出現 Name not unique in this context 請問如何讓同一個 Form 可以重覆 Create 而不會出現 error 呢 ?
試試Application.CreateForm。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
crlin
一般會員


發表:47
回覆:57
積分:20
註冊:2002-07-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-11-13 10:05:29 IP:211.22.xxx.xxx 未訂閱
我試過了, 用 Application.CreateForm(TForm1, Form1); 結果還是一樣 我原來的寫法是直接呼叫 Form1:=TForm1.Create(Application); Form1.Show; 若要利用 begin Hwnd := FindWindow(nil, PCHAR(''ABC'')); if Hwnd = 0 then begin WinExec(PChar(SEND), 1); end else begin BringWindowToTop(Hwnd); end; end; 這個方式, 是否該再加入 Form1:=TForm1.Create(Application); Form1.Show; 這兩行呢 ? 要加在哪兒呢 ? thanks !
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-11-13 10:44:22 IP:211.74.xxx.xxx 未訂閱
假設你有Form1,Form2... program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); // Application.CreateForm(TForm2, Form2);<--這一行要拿掉 Application.Run; end. 試了一下應該改成這樣 procedure TForm1.Button1Click(Sender: TObject); var Hwnd: THandle; begin Hwnd :=FindWindow(nil, PCHAR('ABC')); if Form2 = nil then begin Application.CreateForm(TForm2, Form2); Form2.Show; end else BringWindowToTop(Hwnd); end; 試試看吧...應該可以...
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-11-13 11:07:46 IP:61.219.xxx.xxx 未訂閱
Form本來就可以重複Create的. Design Time設計了Form只是完成了一個類別設計, 用此類別當然可重複Create Instance    你會有問題, 主要是用了Global參數 當 Design完Form時, Delphi自動宣告了一個Global參數
var 
  Form1:TForm1;  //Form1只是個變數
你重複Create, 變數均用一樣, 當然有問題 在你要Create 此Form之procedure內用local變數就沒問題了 例:
procedure TMainForm.xxxClick(Sender: TObject);
var f:TForm1;
begin
  f:=TForm1.create(self);
  f.show;
end;
[NOTE] 將所有Form之Global參數刪除,且不要auto create, 要create form時自己宣吞變數, 你可以更快了解Delphi
crlin
一般會員


發表:47
回覆:57
積分:20
註冊:2002-07-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-11-14 10:00:01 IP:211.22.xxx.xxx 未訂閱
依照 chih 先生的指示, 現在若 Form2 己開過未關閉, 再開一次時 程式會自動將舊的 Window 拿到最上面, 但若將 Form2 關閉, 再開啓 Form2 時整個程式主視窗都會被最小化後 縮到最下一行的 bar 上, 到 bar 上將程式再叫出來, Form2 並不會出現 請問這個問題該如何解決呢 ? thanks !
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-11-14 10:31:18 IP:61.219.xxx.xxx 未訂閱
chih 先生所說為避免重覆 Create ,你不是要重覆 Create 嗎?
procedure TForm1.Button1Click(Sender: TObject);
var form2:TForm2;  //加此行用local變數就可以了
begin
  Form2:=TForm2.Create(Application);
  Form2.Show;
end;
每次按Form上之Button1就有一個新的form2,由於位置一樣, 須拉開才看的到
crlin
一般會員


發表:47
回覆:57
積分:20
註冊:2002-07-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-11-14 16:40:46 IP:211.22.xxx.xxx 未訂閱
我試了 ccchen 先生的方式, 改用 local 變數 可是重復開啟時依然出現 name not unique in this context 怎麼會這樣呢 ??
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-11-14 16:44:36 IP:147.8.xxx.xxx 未訂閱
Can you give more details about what controls are on Form1? e.g. used any TFrame inside?
crlin
一般會員


發表:47
回覆:57
積分:20
註冊:2002-07-23

發送簡訊給我
#12 引用回覆 回覆 發表時間:2002-11-18 17:19:55 IP:211.22.xxx.xxx 未訂閱
我並沒有使用任何 TFrame 元件 我的 Form1 是在 TMenuItem 被點選後直接開出來的 ex. procedure TForm2.N2Click(Sender: TObject); begin Application.CreateForm(TForm1, Form1); Form1.Show; end; 若是這個 MenuItem 被點選了兩次, 問題就出現了 我己試過 chih 和 ccchen 的方式, 但是都沒有效耶 !
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#13 引用回覆 回覆 發表時間:2002-11-18 17:48:42 IP:147.8.xxx.xxx 未訂閱
After some research on the web and I found that "name not unique in this context" is a BDE error. It raises because you are having 2 TDatabase component using the same Databasename. Is is truth that you are putting TDatabase on the form? I would recommend using a separate database module and share the connection (since every TDatabase need its own connection to the DB).
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#14 引用回覆 回覆 發表時間:2002-11-19 07:38:15 IP:61.219.xxx.xxx 未訂閱
    procedure TForm2.N2Click(Sender: TObject);     var form1:TForm1; begin Application.CreateForm(TForm1, Form1); Form1.Show; end;
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#15 引用回覆 回覆 發表時間:2002-11-21 08:42:53 IP:211.74.xxx.xxx 未訂閱
題外話... 想請問一下這樣的設計原理是作何使用... 因為我們一般Form如果連接資料庫... 你又讓user同時開二個Form.. 那資料的異動會不會有問題ㄋ?? 滿好奇的.. thanks...
引言: 請問如何讓同一個 Form 可以重覆 Create 而不會出現 error 呢 ?
crlin
一般會員


發表:47
回覆:57
積分:20
註冊:2002-07-23

發送簡訊給我
#16 引用回覆 回覆 發表時間:2002-11-21 16:34:14 IP:211.22.xxx.xxx 未訂閱
>題外話... >想請問一下這樣的設計原理是作何使用... >因為我們一般Form如果連接資料庫... >你又讓user同時開二個Form.. >那資料的異動會不會有問題ㄋ?? >滿好奇的.. >thanks... >當然有問題,而且問題多多,細節部分你可以隨便拿一本討論 Database 的>書,查閱其中關於 MultiUser 的部分。 有時同一 Client 端的同一 user 會不小心又重開了一次 Form 然後就發現跑出一個奇怪的 error ! 若是有很多個 Client 端, 每個 Client 端的 user 還是有可能在同一時間點 Access 到同一個 Table 啊 ! 若是這種情況發生, 總該要有一個保護機制吧 ? 只是不知 Delphi PostgreSQL 要如何做 ?? 有網友知道嗎 ? 教教我吧, thanks !
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#17 引用回覆 回覆 發表時間:2002-11-21 16:48:48 IP:61.219.xxx.xxx 未訂閱
因為我們一般Form如果連接資料庫...你又讓user同時開二個Form.. 那資料的異動會不會有問題ㄋ?? thanks... 你必須使你的程式沒問題, 除非你是單機版, LocalDataBase. 否則多人同時改同一資料之情形本來就是正常也必須的 多人同時執行同一程式, 和一人開兩個同一功能之Form執行資料修改沒什麼不同,都必須可以執行.
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#18 引用回覆 回覆 發表時間:2002-11-22 08:36:49 IP:211.74.xxx.xxx 未訂閱
我想你的問題跟做法應該是要改為.. 按了按鈕後...如果Form尚未開啟..就將Form開啟.. 如果已經開啟..就將Form帶到最上層.. 這樣子你的Form單獨控制程式資料異動的部分會比較單純...
引言: 有時同一 Client 端的同一 user 會不小心又重開了一次 Form 然後就發現跑出一個奇怪的 error ! 若是有很多個 Client 端, 每個 Client 端的 user 還是有可能在同一時間點 Access 到同一個 Table 啊 ! 若是這種情況發生, 總該要有一個保護機制吧 ? 只是不知 Delphi PostgreSQL 要如何做 ?? 有網友知道嗎 ? 教教我吧, thanks !
yhk
一般會員


發表:11
回覆:7
積分:3
註冊:2002-10-29

發送簡訊給我
#19 引用回覆 回覆 發表時間:2002-11-22 17:43:28 IP:61.220.xxx.xxx 未訂閱
我都用成一個 Array 如 Tlabel *TestLabel[20];    if(TestLabel[i]==NULL); TestLabel[i]=new TLabel(Appliacation); else ShowMessage("Duplication");    FYI     
系統時間:2024-11-23 11:45:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!