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

Form 的執行順序問題請教....

答題得分者是:aquarius
laku0121
一般會員


發表:39
回覆:49
積分:17
註冊:2002-10-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-17 23:56:39 IP:202.129.xxx.xxx 未訂閱
請問Form在 Events 的功能執行排序為何,若我有一個INI做為Form啟動時顯示與否(Show/Hide)的判斷值,要設在那毎Events中。 拜託了
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-18 08:46:02 IP:218.16.xxx.xxx 未訂閱
放在 onCreate 最好,只在建立 Form 時才執行一次 放在 onShow 亦可,不過每次程式執行到 Form.Show / Form.ShowModal 時會再執行一次
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-18 12:01:43 IP:211.23.xxx.xxx 未訂閱
引言: 請問Form在 Events 的功能執行排序為何,若我有一個INI做為Form啟動時顯示與否(Show/Hide)的判斷值,要設在那毎Events中。 拜託了
顯示與否應該只能在 OnFormCreate 時判斷, 但若你的 FORM 都是自動生成, 那在 OnFormCreate 判斷就顯得沒意義了. 若是 MainForm , 那一定是放在 OnFormCreate , 不然就是要放到 DPR 中, 用 Application.ShowMainForm 來控制. 若是其他的 FORM, 我個人的建議是在 呼叫 FORM.SHOW 之前來判斷, 不過這樣判斷, 要 HIDE 時連 FORM.SHOW 都可以不用呼叫了... 例如原本的程式可能是
------
水瓶男的blog: http://791909.blogspot.com
laku0121
一般會員


發表:39
回覆:49
積分:17
註冊:2002-10-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-18 16:49:23 IP:211.76.xxx.xxx 未訂閱
上面兩位你好... 你所指示的處理方式其實我在提出這個問題之前已經試過,若我加在OnFormCreate的話, Form.Hide是不會被執行的(但其它的程式有執行),放在Form.Show更是不可能了, 因為以正常的程序來說,有人一執行Show.馬上Hide的嗎?,其實覆複一點用變數的方式判斷也是可以的,但這比較不實際.
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-19 09:53:33 IP:61.221.xxx.xxx 未訂閱
laku0121你好: 順序是 FormCreate FormActivate FormShow 我是設定 FormActivate--隱藏HideTaskbarIcon--不在工具列顯示圖示 FormShow--將視窗拉到超過畫面外面 如果用Form.Hide那麼焦點會再回到Form上面雖然縮小了 但是焦點會跳2次造成不順的感覺...(好討厭的感覺阿.....喵)
------
======================
昏睡~
不昏睡~
不由昏睡~
laku0121
一般會員


發表:39
回覆:49
積分:17
註冊:2002-10-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-19 14:49:47 IP:202.129.xxx.xxx 未訂閱
引言: laku0121你好: 順序是 FormCreate FormActivate FormShow 我是設定 FormActivate--隱藏HideTaskbarIcon--不在工具列顯示圖示 FormShow--將視窗拉到超過畫面外面 如果用Form.Hide那麼焦點會再回到Form上面雖然縮小了 但是焦點會跳2次造成不順的感覺...(好討厭的感覺阿.....喵)
謝謝您告訢我執行順序.... 但好像都不能一開始即有Form1.Hide的動作,而將視窗拉到正常 畫面以外的,再做移回.這個並非我所要的方式,我是看是否能在 Events的其中一個地方,處理這個問題。
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-20 01:39:20 IP:203.204.xxx.xxx 未訂閱
TForm在Create的時候並不會Show,所以在FormCreate呼叫Form.Hide毫無意義,因為它本來就沒有Show何必Hide。而只有當你呼叫Form.Show時Form才會Show出來,此時Show的動作沒有執行完你不能也不可以執行Hide的動作,違反邏輯。 因此, aquarius兄的建議才可行。另外的一個方式是在外部你儘管去Create Form但不要呼叫Form.Show改到FormCreate時呼叫like as: 
procedure TForm1.Button1Click(Sender: TObject);
begin
     Form2 := TForm2.Create(nil);
end;    procedure TForm2.FormCreate(Sender: TObject);
begin
     if 符合條件 then self.Show;
end;
總之,Create及Show是兩回事,而Show總在Create之後才可以呼叫
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-21 12:03:21 IP:211.23.xxx.xxx 未訂閱
引言: 上面兩位你好... 你所指示的處理方式其實我在提出這個問題之前已經試過,若我加在OnFormCreate的話, Form.Hide是不會被執行的(但其它的程式有執行),放在Form.Show更是不可能了, 因為以正常的程序來說,有人一執行Show.馬上Hide的嗎?,其實覆複一點用變數的方式判斷也是可以的,但這比較不實際.
若你執意要用 FORM.HIDE 來做, 那我可以告訴你, 應該是沒辦法的. 至少沒有漂亮的辦法. 你有試過先檢查再決定要不要 SHOW 的方法? 這應該是到目前為止最符合你需求的方式了, 看不出來會有什麼問題? 除了程式要改得比較多一點以外.... ...
------
水瓶男的blog: http://791909.blogspot.com
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-22 13:50:10 IP:61.221.xxx.xxx 未訂閱
laku0121你好: 我想這樣吧!! 再onCreate的時候設定 if not FileExisits('./My.ini') then Form1.WindowState:=wsMinimized;
------
======================
昏睡~
不昏睡~
不由昏睡~
laku0121
一般會員


發表:39
回覆:49
積分:17
註冊:2002-10-30

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-22 15:03:27 IP:211.76.xxx.xxx 未訂閱
我想應該不會說沒有解的, 還有放大,縮小與Show,Hide是不一樣的,在工作列還是有縮小的ITEM在下面的    不知還有沒有人有好的做法??
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-07-22 16:41:08 IP:61.221.xxx.xxx 未訂閱
laku0121你好:  
引言: 我是設定 FormActivate--隱藏HideTaskbarIcon--不在工具列顯示圖示
要隱藏不在工具列顯示圖示 可以用api,ShowWindow(hwnd,SW_HIDE);
------
======================
昏睡~
不昏睡~
不由昏睡~
elase
一般會員


發表:4
回覆:23
積分:10
註冊:2003-06-05

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-07-22 16:54:42 IP:61.219.xxx.xxx 未訂閱
可以在 OnPaint 的事件 寫檢查的程式碼以及Hide 但是當Form重畫時也會觸發這個事件 所以需要一個旗標 來檢查是不是第一次觸發 而且由於Form.show 已經完成 再做Form.hide的指令 會有畫面閃動的問題需要克服
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-07-22 17:15:04 IP:211.23.xxx.xxx 未訂閱
引言: 我想應該不會說沒有解的, 還有放大,縮小與Show,Hide是不一樣的,在工作列還是有縮小的ITEM在下面的 不知還有沒有人有好的做法?? < face="Verdana, Arial, Helvetica"> 你如果一定要寫在 Form 的 Event 中, 那麼很困難做出你想要的效果!! 要是像我上頭舉的那個例子的做法, 那就都可以做得到..... ...
------
水瓶男的blog: http://791909.blogspot.com
laku0121
一般會員


發表:39
回覆:49
積分:17
註冊:2002-10-30

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-07-23 03:14:30 IP:202.129.xxx.xxx 未訂閱
謝謝各位的回覆,在此目前先做個結案....但有新的發現也請不悅告知....    經過多方的測試結果,發現Form的Show/Hide這兩個動作並不能任意放置在任何 Form的Event中,如Create/Show/Hide中(有些不適合放置),最後不得以只好用 插Flag的方式處理,但雖用插Flag的方式,但因為Show/Hide的關係,必須選擇適 當點放置,經過多方前輩的告知,目前發現放置在OnPaint Event最合適(elase提供) 目前的做法如下 ...(我開了兩個Form) ---------------------------------------------------------------------- 第一個Form ---------------------------------------------------------------------- unit Unit1;    interface    uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls;    type   TForm1 = class(TForm)     Button1: TButton;     procedure FormShow(Sender: TObject);     procedure Button1Click(Sender: TObject);     procedure FormCreate(Sender: TObject);     procedure FormPaint(Sender: TObject);   private        { Private declarations }   public     { Public declarations }      end;    var   Form1: TForm1;   OpenWinFlg : Boolean; // 為了讓兩個Form均可使用 implementation uses Unit2; {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); begin Form2.Hide; end; procedure TForm1.Button1Click(Sender: TObject); begin Form2.Show; end; procedure TForm1.FormCreate(Sender: TObject); begin OpenWinFlg := True; // 起始值 end; procedure TForm1.FormPaint(Sender: TObject); begin If OpenWinFlg = True Then Begin Form1.Hide; Form2.Show; OpenWinFlg := False; End; end; end. ---------------------------------------------------------------------- 第二個Form ---------------------------------------------------------------------- unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation uses Unit1; {$R *.dfm} procedure TForm2.FormShow(Sender: TObject); begin Form1.Hide; end; procedure TForm2.Button1Click(Sender: TObject); begin Form1.Show; end; end.
系統時間:2024-04-20 23:57:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!