有關Form.create的繼承問題 |
答題得分者是:Justmade
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位: 小弟對物件導向的觀念始終很薄弱, 在此請教一個觀念問題 我自行設計一個類似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 發送簡訊給我 |
把 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 發送簡訊給我 |
引言: 把 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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |