如何強制關掉所有的form |
答題得分者是:ccchen
|
kenji
一般會員 發表:32 回覆:44 積分:20 註冊:2002-08-05 發送簡訊給我 |
我現在開粉多form,如果我在form1中要開form3,把form1關了,問題是..... ★★情況一、
Form3:=Tform3.create(self);
Form1.close;
Form3.ShowModal;
會先form1自已先關掉,下一行就不執行了 form3就打不開了 ★★情況二、
Form3:=Tform3.create(self);
Form3.ShowModal;
Form1.close;
會先將form3打開,下一行就不執行了 form1就關不掉了 ★★情況三、
Form3:=Tform3.create(self);
Form1.hide;
Form3.ShowModal;
能開form3,也能把form1關掉(隱藏),問題是最後form3離開(close)時form1會關不掉,表面上form1是不見了,但其實只是form1被隱藏起來而已,form1並沒有被關掉,造成一定要用 Ctrl F2 強制關掉form1才關得掉... 唉...做一個系統問題真多,小女子又要麻煩各位高手囉! ^^||
|
hxf_wolf
一般會員 發表:7 回覆:38 積分:9 註冊:2002-03-14 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
Form3:=Tform3.create(self);
在form1中self表示form1, 故如上行form3之owner為form1, 因此form3不可能在離開form1單獨存在 實際上Delphi程式通常有一個mainForm, 當此mainform close時, 整個程式就結束了. 因此若你的程式中form1是mainform, 則不可任意close hxf_wolf所示, 應可解決你表面之問題, 但是吾你要的 要避免mainform close就close ap之問題可直接於 主程式(.dpr)控制 由menu上project|View Source可看到 主程式
改成如此
Application.Initialize; Application.CreateForm(Tform1, form1); form1.showmodal; form1.free; Application.CreateForm(Tform3, form3); form3.showmodal; form3.free; // Application.Run;你可以在主程式變化, 控制各form [NOTE] 其實最好還是永遠有一個mainform, 維持delphi原來之架構 |
markgau
一般會員 發表:4 回覆:10 積分:2 註冊:2002-03-13 發送簡訊給我 |
引言: 我現在開粉多form,如果我在form1中要開form3,把form1關了,問題是..... ★★情況一、 Form3:=Tform3.create(self); Form1.close; Form3.ShowModal; 會先form1自已先關掉,下一行就不執行了 form3就打不開了 ★★情況二、 Form3:=Tform3.create(self); Form3.ShowModal; Form1.close; 會先將form3打開,下一行就不執行了 form1就關不掉了 ★★情況三、 Form3:=Tform3.create(self); Form1.hide; Form3.ShowModal; 能開form3,也能把form1關掉(隱藏),問題是最後form3離開(close)時form1會關不掉,表面上form1是不見了,但其實只是form1被隱藏起來而已,form1並沒有被關掉,造成一定要用 Ctrl F2 強制關掉form1才關得掉... 唉...做一個系統問題真多,小女子又要麻煩各位高手囉! ^^||Unit1 procedure TForm1.Button1Click(Sender: TObject); begin Form3 := TForm3.Create(self); Form1.Hide; Form3.ShowModal; end; Unit3 implementation uses unit1; {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); begin close; Form1.close; (或用application.Terminate代替) end; It's me, but it's also not me.
------
Its me, but its also not me. |
kenji
一般會員 發表:32 回覆:44 積分:20 註冊:2002-08-05 發送簡訊給我 |
|
markgau
一般會員 發表:4 回覆:10 積分:2 註冊:2002-03-13 發送簡訊給我 |
引言: 不太懂耶~~~~~能不能再說清楚點丫~~~Form1應該是你的main form吧(看projcet -> options -> form頁籤 下有一個Main Form的ListBox),如同ccchen兄所說的,main form在delphi中是不可以隨意close的,當main form被關閉時,整個程式就會被關掉。當你把form1.close時,即代表整個程式被關掉了。 所以如果你要在fom3開啟時,不讓使用者看到form1,那麼應該是先讓form1.hide。如果你要在form3關閉時,連同整個程式一起關閉,就應該是在form3的OnButtonClose事件中加入form1.close。 It's me, but it's also not me.
------
Its me, but its also not me. |
markgau
一般會員 發表:4 回覆:10 積分:2 註冊:2002-03-13 發送簡訊給我 |
引言:It's me, but it's also not me.引言: 不太懂耶~~~~~能不能再說清楚點丫~~~Form1應該是你的main form吧(看projcet -> options -> form頁籤 下有一個Main Form的ListBox),如同ccchen兄所說的,main form在delphi中是不可以隨意close的,當main form被關閉時,整個程式就會被關掉。當你把form1.close時,即代表整個程式被關掉了。 所以如果你要在fom3開啟時,不讓使用者看到form1,那麼應該是先讓form1.hide。如果你要在form3關閉時,連同整個程式一起關閉,就應該是在form3的OnButtonClose事件中加入form1.close。這是一般正常的做法。 It's me, but it's also not me.
------
Its me, but its also not me. |
kenji
一般會員 發表:32 回覆:44 積分:20 註冊:2002-08-05 發送簡訊給我 |
|
andersonhsieh
版主 發表:33 回覆:531 積分:439 註冊:2002-06-10 發送簡訊給我 |
|
markgau
一般會員 發表:4 回覆:10 積分:2 註冊:2002-03-13 發送簡訊給我 |
|
kenji
一般會員 發表:32 回覆:44 積分:20 註冊:2002-08-05 發送簡訊給我 |
procedure TForm1.FormCreate(Sender: TObject);
begin
if trim(DataModule1.ADOTable1['echelon_no'])<>'' then //非第一次登入
begin
GroupBox1.Caption:='第 ' ReadStr ' 梯次 ';
end
else //第一次登入
begin
close;
showmessage('第一次登入,請先輸入梯次編號');
Form2:=Tform2.create(self);
Form2.ShowModal;
end;
end; procedure TForm2.dxButton1Click(Sender: TObject);//新增梯次編號確定鈕
begin
if MaskEdit1.Text=' - ' then
showmessage('請輸入梯次編號')
else
begin
DataModule1.ADOTable1.Edit;
DataModule1.ADOTable1['echelon_no']:=MaskEdit1.Text;
DataModule1.ADOTable1.Post;
showmessage('新增梯次編號成功');
Form1:=Tform1.create(self);
MaskEdit1.Clear;
Form1:=Tform1.create(self);
Form2.Hide;
close;
Form1.ShowModal;
end;
end;
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
這程式完全不對, 應po完整程式比較能了解你的意圖
假設你的須求如下:
1. Form1 為mainform
2. Form1 Create 中,若發現無梯次編號則展開form2供輸入,輸入完成回到form1
3. 未交代若在form2放棄輸入.
4. 假設form2上多一個button--"Cancel", user可放棄,且放棄時結束整個程式
可如下修改
procedure TForm1.FormCreate(Sender: TObject); begin if trim(DataModule1.ADOTable1['echelon_no'])<>'' then //非第一次登入 begin GroupBox1.Caption:='第 ' ReadStr ' 梯次 '; end else //第一次登入 begin close; showmessage('第一次登入,請先輸入梯次編號'); Form2:=Tform2.create(self);//此處create form2且parent為form1 try if Form2.ShowModal=mrCancel then //user在form2上按Cancel Button application.terminate; //若完成輸入此處不須做任何動作, 讓form1正確顯示 finally form2.free; form2:=nil; end; end; end; procedure TForm2.dxButton1Click(Sender: TObject);//新增梯次編號確定鈕 begin if MaskEdit1.Text=' - ' then showmessage('請輸入梯次編號') else begin DataModule1.ADOTable1.Edit; DataModule1.ADOTable1['echelon_no']:=MaskEdit1.Text; DataModule1.ADOTable1.Post; showmessage('新增梯次編號成功'); MaskEdit1.Clear; ModalResult:=mrOK; //這會使form2 close並傳回mrOK // Form1:=Tform1.create(self); create form1 owner為form2,不對 // Form2.Hide; // close; // Form1.ShowModal; end; end; procedure TForm2.CancelButton1Click(Sender: TObject);//User放棄輸入begin ModalResult:=mrCancel; //這會使form2 close並傳回mrCancel end; |
kenji
一般會員 發表:32 回覆:44 積分:20 註冊:2002-08-05 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |