全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2802
推到 Plurk!
推到 Facebook!

請教 ShowMessage 加強功能

答題得分者是:wameng
cwc65536
初階會員


發表:47
回覆:121
積分:48
註冊:2004-10-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-23 21:45:15 IP:203.203.xxx.xxx 未訂閱
資料處理時, 都會需要一些時間 請教各位先進, 是否有簡單易用的元件或指令, 可以在處理資料前, 先秀個 Message 然後, 處理完畢, 清除該 Message 因為, 若用 ShowMessage 會停在那裏, 等人按 ! 確認, 而且, 按完就消失 所以, 不適用於這個應用
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-23 21:55:40 IP:211.22.xxx.xxx 未訂閱
因為ShowMessage是屬於Modal視窗,你要的是Modaless視窗! 製作一個 class="code"> var aForm:TForm; aForm := MyForm.Create; aForm.MessageLable.Caption := '資料處理中...'; aForm.Show; .......//處理你的事情 aForm.Free; //關掉視窗 ----------------------------------------------- Creation is the fundation of promotion.
cwc65536
初階會員


發表:47
回覆:121
積分:48
註冊:2004-10-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-23 22:33:20 IP:203.203.xxx.xxx 未訂閱
引言: 因為ShowMessage是屬於Modal視窗,你要的是Modaless視窗! 製作一個 class="code"> var aForm:TForm; aForm := MyForm.Create; aForm.MessageLable.Caption := '資料處理中...'; aForm.Show; .......//處理你的事情 aForm.Free; //關掉視窗 ----------------------------------------------- Creation is the fundation of promotion.
可以寫詳細一些嗎 ? Sorry 我是新手 ! >
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-23 22:49:01 IP:211.22.xxx.xxx 未訂閱
引言: 因為ShowMessage是屬於Modal視窗,你要的是Modaless視窗! 製作一個 class="code"> var aForm:TForm; aForm := MyForm.Create(nil); // sorry...打太快,改一下! aForm.MessageLable.Caption := '資料處理中...'; aForm.Show; .......//處理你的事情 aForm.Free; //關掉視窗 ----------------------------------------------- Creation is the fundation of promotion.
1. aForm := MyForm.Create(nil); // sorry...打太快,改一下! 2. MessageLabel是我假設的Label元件名稱,要以你在設計時放在MyForm上的label元件名稱為主。 ----------------------------------------------- Creation is the fundation of promotion. 發表人 - stallion 於 2005/06/23 23:00:01
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-27 10:45:48 IP:61.222.xxx.xxx 未訂閱
事實上,可以用 THintWindow 。無須另外在建立 TForm
var
  NoWaitHint : THintWindow;    Procedure ShowHintMsg(AHint:String);
var
  PtRect :TRect;
begin
  if Not Assigned(NoWaitHint) then NoWaitHint := THintWindow.Create(nil);      With NoWaitHint do
  begin
    { 視窗置中處理  }
    PtRect := CalcHintRect(Screen.Width,AHint,Nil);
    PtRect.TopLeft := Point((Screen.Width  - PtRect.Right) shr 1
                           ,(Screen.Height - PtRect.Bottom) shr 1);
    PtRect.BottomRight := Point(PtRect.Left  PtRect.Right,PtRect.Top PtRect.Bottom);
    { 顯示 }
    ActivateHint(PtRect,AHint);
    Repaint;
  end;
end;    Procedure CloseHintMsg;
begin
  if Assigned(NoWaitHint) then
  begin
    NoWaitHint.ReleaseHandle;
    FreeAndNil(NoWaitHint);
  end;
end;    //----------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
  Try
    ShowHintMsg('作業處理中..... 請稍後 ..');        {處理事件  ...... }
  Finally
    CloseHintMsg;
  end;
end;
使用 THintWindow 好處在於不會轉移焦點。 參考。 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~ 發表人 - wameng 於 2005/06/27 10:47:46
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-27 17:03:51 IP:59.104.xxx.xxx 未訂閱
    procedure TForm1.Test(Sender:TObject);
begin
end;    procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
  i:=0;
  with CreateMessageDialog('訊息',mtWarning,[mbYes])do begin
    for i:=0 to ControlCount-1 do //設定按鍵的事件
      if(Controls[i] is TButton) then
        Case TButton(Controls[i]).ModalResult of
          mrYes:TButton(Controls[i]).OnClick:=Test;
        end;
    //TButton(FindComponent('YES')).OnClick:=Test;        //FormStyle:=fsStayOnTop; 顯示最上方
    Show;
    //處理訊息
    While(i<=1000)and(Not Application.Terminated)do begin
      Application.ProcessMessages;
      Caption:=IntToStr(i);
      //TLabel(FindComponent('MESSAGE')).Caption:=IntToStr(i);
      Sleep(10);
      inc(i);
    end;
    Free; //處理完畢後,釋放
  end;
end;
發表人 - jest0024 於 2005/06/27 17:28:37
cwc65536
初階會員


發表:47
回覆:121
積分:48
註冊:2004-10-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-29 22:02:18 IP:203.203.xxx.xxx 未訂閱
引言:
引言: 因為ShowMessage是屬於Modal視窗,你要的是Modaless視窗! 製作一個 class="code"> var aForm:TForm; aForm := MyForm.Create(nil); // sorry...打太快,改一下! aForm.MessageLable.Caption := '資料處理中...'; aForm.Show; .......//處理你的事情 aForm.Free; //關掉視窗 ----------------------------------------------- Creation is the fundation of promotion.
1. aForm := MyForm.Create(nil); // sorry...打太快,改一下! 2. MessageLabel是我假設的Label元件名稱,要以你在設計時放在MyForm上的label元件名稱為主。 ----------------------------------------------- Creation is the fundation of promotion. 發表人 - stallion 於 2005/06/23 23:00:01
aForm.MessageLabel.caption:='提示訊息'; 會出錯, 說是 MessageLabel 未定義
cwc65536
初階會員


發表:47
回覆:121
積分:48
註冊:2004-10-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-29 22:03:41 IP:203.203.xxx.xxx 未訂閱
引言: 事實上,可以用 THintWindow 。無須另外在建立 TForm
var
  NoWaitHint : THintWindow;    Procedure ShowHintMsg(AHint:String);
var
  PtRect :TRect;
begin
  if Not Assigned(NoWaitHint) then NoWaitHint := THintWindow.Create(nil);      With NoWaitHint do
  begin
    { 視窗置中處理  }
    PtRect := CalcHintRect(Screen.Width,AHint,Nil);
    PtRect.TopLeft := Point((Screen.Width  - PtRect.Right) shr 1
                           ,(Screen.Height - PtRect.Bottom) shr 1);
    PtRect.BottomRight := Point(PtRect.Left  PtRect.Right,PtRect.Top PtRect.Bottom);
    { 顯示 }
    ActivateHint(PtRect,AHint);
    Repaint;
  end;
end;    Procedure CloseHintMsg;
begin
  if Assigned(NoWaitHint) then
  begin
    NoWaitHint.ReleaseHandle;
    FreeAndNil(NoWaitHint);
  end;
end;    //----------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
  Try
    ShowHintMsg('作業處理中..... 請稍後 ..');        {處理事件  ...... }
  Finally
    CloseHintMsg;
  end;
end;
使用 THintWindow 好處在於不會轉移焦點。 參考。 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~ 發表人 - wameng 於 2005/06/27 10:47:46
很棒耶 ! 可是字太小了, 可不可以控制字型大小 ?
cwc65536
初階會員


發表:47
回覆:121
積分:48
註冊:2004-10-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-29 22:27:25 IP:203.203.xxx.xxx 未訂閱
引言:
引言: 因為ShowMessage是屬於Modal視窗,你要的是Modaless視窗! 製作一個 class="code"> var aForm:TForm; aForm := MyForm.Create(nil); // sorry...打太快,改一下! aForm.MessageLable.Caption := '資料處理中...'; aForm.Show; .......//處理你的事情 aForm.Free; //關掉視窗 ----------------------------------------------- Creation is the fundation of promotion.
1. aForm := MyForm.Create(nil); // sorry...打太快,改一下! 2. MessageLabel是我假設的Label元件名稱,要以你在設計時放在MyForm上的label元件名稱為主。 ----------------------------------------------- Creation is the fundation of promotion. 發表人 - stallion 於 2005/06/23 23:00:01
Label 的 Compiler 錯誤, 我找到問題了. but Runtime 會出錯, 請指點
shunaarom
一般會員


發表:8
回覆:34
積分:18
註冊:2003-07-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-29 23:56:49 IP:220.134.xxx.xxx 未訂閱
試一下這看看是不是你要的 var fr:TForm; la:Tlable; begin fr:=CreateMessageDialog('測試',mtInformation,[mbok]); with fr do begin la:=TLabel(FindComponent('Message')); if la<> nil then la.Font.Color:=clred; la.Font.Name:='標楷體'; end; fr.Destroy; FreeAndNil(fr); end; --------------------------------- 試看看!個人覺得還不錯
cwc65536
初階會員


發表:47
回覆:121
積分:48
註冊:2004-10-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-30 10:12:36 IP:203.203.xxx.xxx 未訂閱
引言: 試一下這看看是不是你要的 var fr:TForm; la:Tlable; begin fr:=CreateMessageDialog('測試',mtInformation,[mbok]); with fr do begin la:=TLabel(FindComponent('Message')); if la<> nil then la.Font.Color:=clred; la.Font.Name:='標楷體'; end; fr.Destroy; FreeAndNil(fr); end; --------------------------------- 試看看!個人覺得還不錯
我把 Process 放在 fr.Destroy 之前, 結果: 1. 並沒有 message 出現 2. Process 完畢, 出現錯誤訊息(我將錯誤畫面上傳,不知是否成功)
cwc65536
初階會員


發表:47
回覆:121
積分:48
註冊:2004-10-14

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-30 10:35:09 IP:203.203.xxx.xxx 未訂閱
引言:
引言:
引言: 因為ShowMessage是屬於Modal視窗,你要的是Modaless視窗! 製作一個 class="code"> var aForm:TForm; aForm := MyForm.Create(nil); // sorry...打太快,改一下! aForm.MessageLable.Caption := '資料處理中...'; aForm.Show; .......//處理你的事情 aForm.Free; //關掉視窗 ----------------------------------------------- Creation is the fundation of promotion.
1. aForm := MyForm.Create(nil); // sorry...打太快,改一下! 2. MessageLabel是我假設的Label元件名稱,要以你在設計時放在MyForm上的label元件名稱為主。 ----------------------------------------------- Creation is the fundation of promotion. 發表人 - stallion 於 2005/06/23 23:00:01
aForm.MessageLabel.caption:='提示訊息'; 會出錯, 說是 MessageLabel 未定義
shunaarom
一般會員


發表:8
回覆:34
積分:18
註冊:2003-07-02

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-30 11:26:59 IP:220.134.xxx.xxx 未訂閱
引言: [quote] procedure TForm1.Button1Click(Sender: TObject); var fr:TForm; la:TLabel; begin fr:=CreateMessageDialog('測試',mtInformation,[mbok]); with fr do begin la:=TLabel(FindComponent('Message')); if la<> nil then begin la.Font.Color:=clred; la.Font.Name:='標楷體'; end; fr.ShowModal; end; fr.Destroy; end;
Sorry沒仔細檢查過程式碼~ 有試過了可以用了!!
cwc65536
初階會員


發表:47
回覆:121
積分:48
註冊:2004-10-14

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-06-30 12:13:49 IP:203.203.xxx.xxx 未訂閱
引言:
引言: [quote] procedure TForm1.Button1Click(Sender: TObject); var fr:TForm; la:TLabel; begin fr:=CreateMessageDialog('測試',mtInformation,[mbok]); with fr do begin la:=TLabel(FindComponent('Message')); if la<> nil then begin la.Font.Color:=clred; la.Font.Name:='標楷體'; end; fr.ShowModal; end; fr.Destroy; end;
Sorry沒仔細檢查過程式碼~ 有試過了可以用了!!
歹勢, 因為是生手, 所以看不出錯在哪裏 ! 已經 Error Free ! but 1. 我是要 [顯示Message] -> Process Data -> Close Message 我希望 Message 一直停在畫面上,直到 process 完畢 2. 我試著調 Font Size , 結果有笑, but Message 視窗還是那麼小, 不會變大耶 !
shunaarom
一般會員


發表:8
回覆:34
積分:18
註冊:2003-07-02

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-06-30 13:59:20 IP:220.134.xxx.xxx 未訂閱
要改成大小是要用fr.Width和fr.Height這2個~ 如果第一個方式的話~ 小弟覺得可以用~ 另一個Form來做會比較方便~也比較快~ 在處理前可以先讓他個form.show 等結束了form.close~就好了~ 在把上面那些最大~最小和關閉的~都給false~ 那使用者就沒法自行關閉~ 除非透個強制關閉~ 不知大大覺得如何呢~
cwc65536
初階會員


發表:47
回覆:121
積分:48
註冊:2004-10-14

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-07-01 15:32:12 IP:203.203.xxx.xxx 未訂閱
感謝各位大大熱烈回應 , 測試各種方法的結果及心得如下 : Stallion 之 開一個 Form , 別 Auto-Create , 等要用再 create 因為compiler會出錯,所以乾脆當作一個Auto-Create 的 Form 來用 but 上面的 LabelMessage 用 From.ShowModal 可顯示, 用 Form.Show 不行 wameng版主 之 THintWindow , 符合我的需求, 可惜字太小, 我參考 Help 提到相關的THintInfo 中有 HintWindowClass 可自訂 window, 功力太淺,不會用 jest0024 與 shunaarom 之 CreateMessageDialog 是同一個方法嗎 ? jest0024 寫的我看不大懂, 用 shunaarom 方法, 將 showmodal 改成 show 則 message 來不及顯示, 留下空格 都差一點點, 簡單講, 我要的寫程式的方法如下 : 1. 顯示 Message , 給 User 看, 但不需 user 確認 2. 開始處理資料 3. 處理完畢, 關畢視窗 請各位前輩, 不吝賜教 sho
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-07-01 16:39:43 IP:61.222.xxx.xxx 未訂閱
>wameng版主 之 THintWindow , 符合我的需求, 可惜字太小, 我參考 Help 提到相關的THintInfo 中有 HintWindowClass 可自訂 window, 功力太淺,不會用    字型變大,如下:
Procedure ShowHintMsg(AHint:String);
var
  PtRect :TRect;
begin
  if Not Assigned(NoWaitHint) then NoWaitHint := THintWindow.Create(nil);      With NoWaitHint do
  begin
    Canvas.Font.Size := 20;
    { 視窗置中處理  }
    PtRect := CalcHintRect(Screen.Width,AHint,Nil);
    PtRect.TopLeft := Point((Screen.Width  - PtRect.Right) shr 1
                           ,(Screen.Height - PtRect.Bottom) shr 1);
    PtRect.BottomRight := Point(PtRect.Left  PtRect.Right,PtRect.Top PtRect.Bottom);
    { 顯示 }
    ActivateHint(PtRect,AHint);
    Repaint;
  end;
end;
~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
cwc65536
初階會員


發表:47
回覆:121
積分:48
註冊:2004-10-14

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-07-05 18:10:13 IP:203.203.xxx.xxx 未訂閱
完美, 版主果然厲害 請問 Stallion 提出用 Form.Show 的解決方法 , 所衍生出來的疑問, 也就是 LabelMessage.caption 來不及顯示的問題, 有解嗎 ? 我很想知道 ! 需要另外開一個討論主題嗎 ?
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-07-05 22:29:17 IP:211.22.xxx.xxx 未訂閱
引言: 完美, 版主果然厲害 請問 Stallion 提出用 Form.Show 的解決方法 , 所衍生出來的疑問, 也就是 LabelMessage.caption 來不及顯示的問題, 有解嗎 ?
使用Update或repaint方法,強制視窗重繪所有元件。 ------------------- 學然後知不足. 發表人 - stallion 於 2005/07/05 22:31:04
a6475
高階會員


發表:67
回覆:230
積分:154
註冊:2002-09-15

發送簡訊給我
#20 引用回覆 回覆 發表時間:2005-07-06 22:25:50 IP:61.229.xxx.xxx 未訂閱
引言: [quote] 完美, 版主果然厲害 請問 Stallion 提出用 Form.Show 的解決方法 , 所衍生出來的疑問, 也就是 LabelMessage.caption 來不及顯示的問題, 有解嗎 ?
插花一下,用 Application.ProcessMessages; 應該也可以。 ..-----------βλμε------------..
◎Oo月夜 光明 藍更愁oO◎
藍調月光城v4:http://inping.myweb.hinet.net/ (暫時使用中..) 明日報(藍調.月光):http://mypaper2.ttimes.com.tw/user/a6475
------
月夜 光明 藍更愁
系統時間:2024-06-25 13:48:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!