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

有關Form.create的繼承問題

答題得分者是:Justmade
P.D.
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-03 16:34:23 IP:61.66.xxx.xxx 未訂閱
請問各位:     小弟對物件導向的觀念始終很薄弱, 在此請教一個觀念問題    我自行設計一個類似messagedialog的功能如下    
此段程式是放在一個 util.pas 中
procedure TSysUT.MsgDialog(vMessage: string);
          var wForm: TForm;
begin
     if Assigned(wForm) then wForm.Free;
     wForm:= TForm.Create(self);
     wForm.BorderIcons:= [biSystemMenu];
     wForm.Name:= 'Form_Wait';
     wForm.Caption:= '作業訊息';
     wForm.FormStyle:= fsStayOnTop;
     wLabel:= TLabel.Create(self);
     wLabel.Parent:= wForm;
     wForm.Top:= 210;
     wForm.Left:= 85;
     wForm.Height:= 150;
     wForm.Width:= 550;
     wLabel.Caption:= vMessage;
     wLabel.Align:= alClient;
     wLabel.WordWrap:= True;
     wLabel.Font.Name:= '標楷體';
     wLabel.Font.Size:= 20;
     wLabel.Font.Color:= clNavy;
     wLabel.Layout:= tlCenter;
     wLabel.Alignment:= taCenter;
     wForm.Show;
     wForm.Update;
end;    
當我在 form1 由buttonclick下達 SysUt.MsgDialog('這是一個訊息視窗') 時, 如何才能以 if Assigned(Form_Wait) then Form_Wait.Close 方式操作 我現在的做法是
Form1.Button1Click(Sender: Tobject);
begin
   // 顯示
   SysUt.MsgDialog('這是一個訊息視窗');
end;    Form1.Button2Click(Sender: Tobject);
begin
   // 關閉, 想這樣做, 但不行
   if Form_Wait<> nil then Form_Wait.Close;
   // 也有嘗試這樣做
   
   for i:= 0 to Application.ComponentCount-1 do
       if TForm(FindComponent('Form_Wait'))<> nil then TFormFindComponent('Form_Wait')).Close;
   
   end;
不知道要如何才能達成第一種的方式? 為何要指定第一種呢? 因為早期寫這個功能時, 功力仍淺, 只能以一個先建好的form及lable , 然後 在有需要的form上以uses方式引用, 可是每一支專案都要把這支程式add進來, 而我把一些參數設定都寫在sysut.pas中, 但sysut.pas不只包括這一組form而已, 還有uses 很多不同功能的form, 所以當我某一支程式要使用msgdialog, 必須引用 sysut.pas, 但sysut.pas 又引用不少form, 相對的我也必須把這些form也add進來(雖然用不到), 實在很麻煩, 所以才會想乾脆直接以code來create! 原因在此!
shaofu
高階會員


發表:5
回覆:136
積分:103
註冊:2003-01-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-03 17:58:17 IP:210.243.xxx.xxx 未訂閱
把 form 存起來 @@...    
procedure TSysUT.MsgDialog(var wForm: Tform; vMessage: string);
begin
  if Assigned(wForm) then 
  begin
    wForm.Free;
    wForm := nil;
  end;
  wForm:= TForm.Create(self); 
  ...  
end;    Form1.Button1Click(Sender: Tobject);
begin
   // 顯示
   SysUt.MsgDialog(FwForm, '這是一個訊息視窗');
end;    Form1.Button2Click(Sender: Tobject);
begin
  if FwForm <> nil then FwForm.Close;
end;
FwForm 是主程式的 Member 不知道這樣可以嗎
P.D.
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-03 21:48:21 IP:61.66.xxx.xxx 未訂閱
引言: 把 form 存起來 @@...
procedure TSysUT.MsgDialog(var wForm: Tform; vMessage: string);
begin
  if Assigned(wForm) then 
  begin
    wForm.Free;
    wForm := nil;
  end;
  wForm:= TForm.Create(self); 
  ...  
end;    Form1.Button1Click(Sender: Tobject);
begin
   // 顯示
   SysUt.MsgDialog(FwForm, '這是一個訊息視窗');
end;    Form1.Button2Click(Sender: Tobject);
begin
  if FwForm <> nil then FwForm.Close;
end;
FwForm 是主程式的 Member 不知道這樣可以嗎 < face="Verdana, Arial, Helvetica"> 實在很抱歉! 我忘了說明一點, 由於在程式中之前曾大量引用這組function 如果要這樣改的話, 我的程式勢必做大幅度的修正, 有一支程式一共有450支pas 會改死了, 早先我曾有想過這樣的方法, 但後來想到要改那麼多, 怕了! 所以, 我才想說是否有其他方法可以在不改code下可以直接取代掉 if Form_Wait <> nil then Form_Wait.Free; 或改少少就可以完成! 謝謝!
Justmade
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-03 22:02:06 IP:218.16.xxx.xxx 未訂閱
請問你的所有 pas 有沒有共同 uses 某 unit 的 因為你若要保留 Form_Wait 這個變數,就必定要定義這個變數 若你所有 Form 都有 uses mainform 的話 可以在 MainForm 的 Var 加上 Form_Wait : TForm 然後,動態建立的不要使用 wForm 直接將 所有 wForm 換成 Form_Wait 即可。
P.D.
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-03 23:31:16 IP:61.66.xxx.xxx 未訂閱
引言: 請問你的所有 pas 有沒有共同 uses 某 unit 的 因為你若要保留 Form_Wait 這個變數,就必定要定義這個變數 若你所有 Form 都有 uses mainform 的話 可以在 MainForm 的 Var 加上 Form_Wait : TForm 然後,動態建立的不要使用 wForm 直接將 所有 wForm 換成 Form_Wait 即可。
一語點醒夢中人, 謝謝! 同時也謝謝shaofu的做法, 其實也是可以, 不過在 這個案子中比較不適用.
系統時間:2024-05-06 4:29:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!