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

Form 的關閉問題

答題得分者是:P.D.
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-11-30 12:57:31 IP:210.201.xxx.xxx 訂閱
各位前輩 ~
我有一個MainForm會去呼叫另一個Form (使用 ShowModal 的方式,且該在 Form 的 Public 有一個全域變數 aFlag),在其 OnShow 的時候會去觸發一個 Query 事件,亦即當其Form開好的時候資料也勾進來了。
但在 ShowModal 之前,我 Create 該 Form 之後,會指定一個值給它 aFlag:=0; ~~~
若所給的值為 0 則會在其 OnShow 時去觸發一個 Query 事件;但是..若所給的值為 1 則會在其觸發 Query 事件之後再去執行另一個 AFunction(該 Function 執行完後會自行關閉該 Form : ModalResult:=MrOK;) ~~
若在該 Form 開好之後才去點選按鈕以執行 AFunction ,則確實可以再該功能執行完後正常關閉,但是若透傳參數(aFlag:=1)的方式,雖在觸發 Query 事件之後會去執行AFunction,但該Form 最後卻沒有自行關閉。
似乎在一個 Form 的 Create 流程中( Create > onshow > onPaint > onResize > onPaint > onActive...) 是不能去把 Form 關閉的,但不知目前我的需求有何方式可以解決?
以上,謝謝。
------
我也在努力學習中,若有錯謬請見諒。
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-11-30 13:41:47 IP:220.130.xxx.xxx 未訂閱
type
TForm2 = class(TForm)
constructor Create(AOwner : TComponent; aFlag : integer);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormPaint(Sender: TObject);
private
fFlag : integer;
procedure fCustomProc;
procedure fAutoProc;
{ Private declarations }
public
{ Public declarations }
end;

implementation

{$R *.dfm}

procedure TForm2.fCustomProc;
begin
ShowMessage('CustomProc called and form2 will be closed now');
Close;
end;
procedure TForm2.fAutoProc;
begin
showMessage('AutoProc called');
end;
constructor TForm2.Create(AOwner : TComponent; aFlag : integer);
begin
inherited Create(Owner);
fFlag:=aFlag;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Release;
end;

procedure TForm2.FormPaint(Sender: TObject);
begin
case fFlag of
0: fAutoProc;
1:
begin
fAutoProc;
fCustomProc;
end;
else showMessage('incorrect flag is set');
end;
Caption:='Caption TFrom2 Changed';
end;


//in MainForm, just call the TForm2 custom constructor and showmodal
//I put the show event to onPaint, and it works.
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-11-30 14:51:29 IP:210.201.xxx.xxx 訂閱
謝謝您的回覆 ~
但不知為何操作在 OnShow or OnActive 時卻不行,在 OnPaint 時卻可以??
謝謝 ~
------
我也在努力學習中,若有錯謬請見諒。
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-11-30 15:57:08 IP:220.130.xxx.xxx 未訂閱
the sequence of a from event seems to be Create -> Show->Activate->Paint
and the you can try yourself and find there's a runtime exception that told you could not place the close function into a show event if you try to do this. And once you put it on Activate, there is a problem that MainForm cannot be focus(test with my code). So, if you want to know why, may be a TForm source review is necessary. I don't exactly know the mechanism that TForm does.
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-11-30 16:50:51 IP:210.201.xxx.xxx 訂閱
天哪.. 我竟如此迷糊...... 順序應為 Create > onShow > onResize > onActive> onPaint  ...
但仍不解的是,AFounction 若放在 OnActive 為何也不行?
------
我也在努力學習中,若有錯謬請見諒。
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-12-01 10:28:53 IP:220.130.xxx.xxx 未訂閱
maybe you need to trace source yourself.
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2006-12-01 17:16:22 IP:61.67.xxx.xxx 未訂閱
如下做法, 你把要判斷關閉的程式段寫在 StartRun procedure 即可
private
{ Private declarations }
.......
procedure StartRun(Sender: Tobject; var Done: boolean);

......

procedure TForm_MembFee.FormCreate(Sender: TObject);
begin
.......
Application.OnIdle:= StartRun; // onCreate事件加入此行
end;
procedure TForm1.StartRun(Sender: Tobject; var Done: boolean);
var xhandle: longInt;
begin
xhandle:= FindWindow('TForm1',nil);
if xhandle = 0 then exit;
Application.ProcessMessages;
Application.OnIdle:= nil;
Done:= True;
..................
if fFlag= .... then Form1.Close; // 此處加入你的判斷式
end;


原理, 使用 ShowModal 時, 當視窗已完整建立之後, 會觸發Application.OnIdle:= StartRun這個程式, 這個時候由Startrun接手執行程式, 因為視窗已經開完, 所以在StartRun中執行Form1.Close 就可以順利關閉 Form1, 但要注意, 如果使用 Form1.Show 並不會觸發Application.OnIdle這件事, 請特別注意(也就是說, 這樣的寫法並不適用於Show的方式)
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#8 引用回覆 回覆 發表時間:2006-12-01 23:23:35 IP:124.10.xxx.xxx 未訂閱
這個 Form 執行過程之中,需要與使用者互動嗎?
如果不需和使用者互動,而且執行完 aFunction 之後,Form 就要關閉,那麼根本就不需要秀 Form
在不秀 Form 的狀況之下,你要做的只有
1. create Form
2. 查詢資料,執行 aFunction
3. release Form
如果如此,那根本也不需要用到 Form 了,用一個 DataModule 來作為元件的容器就行了
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2006-12-05 15:49:16 IP:210.201.xxx.xxx 訂閱
謝謝前輩們的熱心,目前問題已解決 ~~
嗯,每一位的解法都有其道理,真不知該將分數給寫.... 最後還是決定給 P.D前輩,因為他給了我一個明確的方向,謝謝大家。
------
我也在努力學習中,若有錯謬請見諒。
系統時間:2024-05-17 9:49:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!