Form 的關閉問題 |
答題得分者是:P.D.
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
各位前輩 ~
我有一個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 發送簡訊給我 |
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 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
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 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
如下做法, 你把要判斷關閉的程式段寫在 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 發送簡訊給我 |
這個 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |