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

關於Now Loading Form的製作

答題得分者是:Justmade
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-12 15:39:21 IP:61.219.xxx.xxx 未訂閱
請問, 目前從 MainForm 到 Form1建立好並載入資料時, 會花一些時間。 所以在MainForm打開Form1時,會先建立一個Now Loading的表單。 但是打開Now Loading的表單時,雖然Form有被畫, Label1上的字卻不會改變(程式在下面的FR05), 請問要如何修改? 程式如下,FR05就是now loading的Form try FR05Form := TFR05Form.Create(Application); FR05Form.Show; Application.ProcessMessage; Form1 := TForm1.create(Application); TMainForm(MainForm).Hide; FR05Form.Free; Form1.ShowModal; finally TMainForm(MainForm).Show; Form1.free; end; 因為在Form1的create有很多東西要跑, 所以要顯示一個Now Loading的Form, 而該Form的程式如下(FR05) unit FR05; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TFR05Form = class(TForm) Label1: TLabel; Timer1: TTimer; procedure FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean); procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); private I_Count : integer; { Private declarations } public { Public declarations } end; var FR05Form: TFR05Form; implementation {$R *.dfm} procedure TFR05Form.FormShow(Sender: TObject); begin I_Count := 3; Label1.Caption := '目前資料讀取中...'; Timer1.Enabled := true; Application.ProcessMessages; end; procedure TFR05Form.Timer1Timer(Sender: TObject); begin Inc(I_Count); if I_Count > 3 then I_Count := 0; case I_Count of 0 : Label1.caption := '目前資料讀取中'; 1 : Label1.caption := '目前資料讀取中.'; 2 : Label1.caption := '目前資料讀取中..'; 3 : Label1.caption := '目前資料讀取中...'; end; Application.ProcessMessages; end; end. 原本以為只要一了Application.ProcessMessages; 就應該可以正常顯示, 請問是否有什麼解決方法。 ---------------- 快滿一年程設師, 日日工作寫程式, 每買樂透眼框溼, 望能早成系分師。 ---------------- 發表人 - skurama 於 2003/05/12 15:40:55 發表人 - skurama 於 2003/05/12 15:50:07
------
----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-12 16:30:52 IP:211.76.xxx.xxx 未訂閱
引言: 請問, 目前從 MainForm 到 Form1建立好並載入資料時, 會花一些時間。 所以在MainForm打開Form1時,會先建立一個Now Loading的表單。 但是打開Now Loading的表單時,雖然Form有被畫, Label1上的字卻不會改變(程式在下面的FR05), 請問要如何修改? 程式如下,FR05就是now loading的Form
  try
     FR05Form := TFR05Form.Create(Application);
     FR05Form.Show;
     FR05Form.Update;
     Application.ProcessMessage;
     Form1 := TForm1.create(Application);
     TMainForm(MainForm).Hide;
     FR05Form.Free;
     Form1.ShowModal;
  finally
     TMainForm(MainForm).Show;
     Form1.free;
  end;
我想您應該要加上紅色那行吧!
------
將問題盡快結案也是一種禮貌!
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-12 16:44:24 IP:61.155.xxx.xxx 未訂閱
供参考!!!    unit Unit1;    interface    uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls;    type   TForm1 = class(TForm)     Label1: TLabel;     procedure FormShow(Sender: TObject);   private     { Private declarations }   public     { Public declarations }   end;    var   Form1: TForm1;    implementation    {$R *.dfm}    procedure TForm1.FormShow(Sender: TObject); var i:integer; SplashForm : TForm; LB:TLabel; begin SplashForm := TForm.Create(Application); LB := TLabel.Create(SplashForm); try SplashForm.Height := 100; SplashFOrm.Width := 300; SplashForm.BorderStyle := bsNone; SplashForm.position := poDesktopCenter; LB.Parent := SplashForm; LB.Caption := '正在準備資料庫,請稍侯...       '; LB.Top := 40; LB.Left := 20; SplashForm.Show; Application.ProcessMessages; { 你的操作 for i:=1 to 1000 do label1.Caption:=label1.Caption+'1'; .... } finally LB.Free; SplashForm.Free; end;    end;    end.    风花雪月 e梦情缘
------
风花雪月 e梦情缘
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-12 17:06:43 IP:61.219.xxx.xxx 未訂閱
To danny 大大: 我試著加入你說的那一行, 可是仍然只是顯示出FR05的Form和其Label一開始的字, 並沒有辦法讓FR05的Timer的程式有任何作用。 To wnhoo 大大: 我也試著加入你的程式, 可是你的方法好像是把Now Loading的Form改成動態建立, 建立後再顯示1~1000, 最後才能建立Form1。 可是我慢是慢在Form1 := TForm1.create(Application); (因為Create寫很多讀資料庫並做一些計算的程式, 大概要花二~五秒多[看電腦], 如果一直停在主畫面時,怕有的客戶會以為當了, 所以想做now loading) 我主要做到如下: 1.FR05必需在TForm1建立之前被建立並顯示。 2.建立TForm1時,讓FR05上的Label可以不斷的改變文字。 3.TForm1建立完,讓FR05消失。 4.TForm1顯示。 而目前1、3、4都正常,但是步驟2上的文字沒有 辦法利用FR05 Form上的Timer不斷的改變, 請問有什麼方法是可以讓我FR05被建立後,再建立TForm1時, 也能同時讓Label1的字一直變? ---------------- 快滿一年程設師, 日日工作寫程式, 每買樂透眼框溼, 望能早成系分師。 ----------------
------
----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
Justmade
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-12 19:26:10 IP:218.16.xxx.xxx 未訂閱
...... 回答問題 : 在你跑那很多東西時要不時使用 Application.ProcessMessages; FRO5Form 才會更新的 若有迴圈最好在迴圈內放這句那便每走一圈便更新一次了。
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-12 20:29:38 IP:61.13.xxx.xxx 未訂閱
嚇我一跳, 我還以為我抄同事的程式被抓到了, 哈,不過我有問他可不可以貼~~~ ^_^ To 以上個位大大: 因為我原本想說寫在 procedure TFR05Form.Timer1Timer(Sender: TObject);中, Interval設為500,具他會每0.5秒跑一次更新Label, 而且最後面都有加上Application.ProcessMessage; 這樣是不是無效(因為Label都不會變) 如果是一直用Application.ProcessMessages;也不是不行啦, 只是當遇到 Application.ProcessMessages; Query.Close; QUery.SQL.text := '....'; QUery.Open; <-----在這一行,有時join一堆Table,也是會停很久 Application.ProcessMessages; Label就停在那邊了,因為之前會動, 跑到那一句不會動了,客戶的電話又來了。 這個時候就不知道要把Application.ProcessMessage;加到哪裡。 而且如果: Query1速度快, QUery2速度中, Query3速度慢時, 在三個之中都加上Application.ProcessMessage;, Query1.Close; Query1.SQL.text.... Query1.Open; Application.ProcessMessage; Query2.Close; Query2.SQL.text.... Query2.Open; Application.ProcessMessage; Query3.Close; Query3.SQL.text.... Query3.Open; Application.ProcessMessage; 這樣到了Query2,3時,Label的字也是不會變。 原本想說小時鐘的程式會和原本程式分開跑,沒想到還是被主程式給托累, 不知到用多個thread能不能做到(@_@|||很不熟)。 時常接到客戶打來時會說以下的對話 客:「喂,我查詢時會當掉。」 我:「我幫你看看,嗯~不會啊....」 客:「你看又當.....A...好了,謝謝」。 尤其是遇到那種要跑年度報表或大量調料的程式。 ~_~||| 難道沒有其他方法了嗎!? ---------------- 快滿一年程設師, 日日工作寫程式, 每買樂透眼框溼, 望能早成系分師。 ----------------
------
----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
Justmade
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-12 21:08:18 IP:218.16.xxx.xxx 未訂閱
Timer 也是在Main Thread 中所以 Query 時也是不會更新的    如你所說,其一是使用 Thread (我也很不熟) 其二是另寫一個無關的小程式開始時跳出來無聊地數呀數之後 準備好叫它關掉就好了。 正式來說當然是用 > < class="code"> var SI : TStartupInfo; PI : TProcessInformation; begin FillChar(SI, SizeOf(SI), 0); SI.cb := SizeOf(SI); // SI 還有很多東西可設可看 Win32 SDK Help CreateProcess(nil,'SplashCount.exe', nil, nil, False,NORMAL_PRIORITY_CLASS, nil, nil, SI,PI); // 你的程式碼 ..... ..... // 最後 TerminateProcess(PI.hProcess,0); // 關掉外部程式 end; 那個外部程式可用你原本的 FRO5Form 改一點點,可設置 show 在中間 及 stayontop 數的數字可以沒意義,若客戶他問你那數字是甚麼你說下期彩票的預測好了 不過,若有高手教你甚用
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-12 22:54:41 IP:61.13.xxx.xxx 未訂閱
哈~~~ 繼http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30011 此篇後,又學到一招。 Justmade 大大, 感謝您再次出手幫忙。 不管是旁門方法,還是正式解法, 只要能解決問題,就是一個好方法。 ---------------- 快滿一年程設師, 日日工作寫程式, 每買樂透眼框溼, 望能早成系分師。 ---------------- 發表人 - skurama 於 2003/05/12 22:57:54
------
----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
系統時間:2024-07-03 1:38:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!