如何調用某些FORM的public過程? |
答題得分者是:jow
|
bayman
一般會員 發表:30 回覆:35 積分:18 註冊:2007-04-24 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
在主form 中 user AFORM 或 BFORM
然後確定 AFORM被CREATE成功的狀況下, 呼叫 AFORM.ABC(xxx)即可 ===================引 用 bayman 文 章=================== 在我一個porject裡面,某些form有public一個同名的procedure(比如叫ABC) 現在我想在主FORM裡面通過procedure或者function調用這個ABC該如何處理呢? 比如:Aform、Bform里面有procedure ABC Cform里面没有 而我想在MainForm里面 procedure (AForm : Tform); begin AForm.ABC; end; 这样调用,该如何处理呢? 表达能力不好,希望各位大大能看明白,tks! |
bayman
一般會員 發表:30 回覆:35 積分:18 註冊:2007-04-24 發送簡訊給我 |
但是這樣會提示Undeclared identifier: ABC
===================引 用 P.D. 文 章=================== 在主form 中 user AFORM 或 BFORM 然後確定 AFORM被CREATE成功的狀況下, 呼叫 AFORM.ABC(xxx)即可 ===================引 用 bayman 文 章=================== 在我一個porject裡面,某些form有public一個同名的procedure(比如叫ABC) 現在我想在主FORM裡面通過procedure或者function調用這個ABC該如何處理呢? 比如:Aform、Bform里面有procedure ABC Cform里面没有 而我想在MainForm里面 procedure (AForm : Tform); begin AForm.ABC; end; 这样调用,该如何处理呢? 表达能力不好,希望各位大大能看明白,tks! |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
bayman
一般會員 發表:30 回覆:35 積分:18 註冊:2007-04-24 發送簡訊給我 |
unit untMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TfrmMain = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); private procedure color(AForm:TForm); public end; var frmMain: TfrmMain; implementation uses unt1; {$R *.dfm} procedure TfrmMain.color(AForm:TForm); begin AForm.ABC; end; procedure TfrmMain.Button1Click(Sender: TObject); begin color(frm1); end; end. //-----------------------------以下是frm1 unit unt1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type Tfrm1 = class(TForm) private { Private declarations } public procedure ABC; end; var frm1: Tfrm1; implementation {$R *.dfm} procedure tfrm1.ABC; begin color := clgreen; end; end. |
cobraliu
中階會員 發表:15 回覆:75 積分:83 註冊:2007-11-22 發送簡訊給我 |
試試下列吧!
[code delphi] unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,unit2;//使用的Unit2 type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } procedure acolor(AForm:TForm2);//用Unit2的TForm2才呼叫得到ABC public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.acolor(AForm:TForm2); begin aform.ABC; end; procedure TForm1.Button1Click(Sender: TObject); begin acolor(form2); end; procedure TForm1.Button2Click(Sender: TObject); begin form2.show; end; end. [/code] [code delphi] unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm2 = class(TForm) private { Private declarations } public { Public declarations } procedure ABC; end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.ABC; begin color := clgreen; end; end. [/code]
------
初學、初學、學了很久...還是在初學階段..Orz |
bayman
一般會員 發表:30 回覆:35 積分:18 註冊:2007-04-24 發送簡訊給我 |
謝謝樓上回覆.
我想是我的問題陳述得不好. 其實是這樣的.我的project有上百個form,大部分form都有一個叫myappend的procedure(有些form沒有) Mainform裡面我通過 case formindex of 1: form1.myappend; 2: from2.myappend; . . . 101:from101.myappend... 中間也有些form沒有這個procedure,我的目的就是簡化這種寫法, 變成AForm.myappend这样
編輯記錄
bayman 重新編輯於 2008-03-09 15:22:45, 註解 無‧
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
在專案之初應該先做好規劃,
利用繼承的方式,來歸類具有相似特性的功能畫面, 以下利用一個小例子來說明: (1)TfrmMain - 程式主畫面 (2)TfrmBase - 功能畫面基礎類別 (3)TfrmBase000 - 功能畫面 ID=000, 使用New->Other...->專案頁之下,選擇繼承自TfrmBase. (4)TfrmBase001~TfrmBase010, 手動新增一個Unit, 然後繼承自TfrmBase. (5)上述(3)與(4)知不同點為 TfrmBase000, 包含一個 *.dfm. 其改寫動作包括 拖曳新的元件到TfrmBase000的Form上...而TfrmBase001~TfrmBase010則 要手動去新增所需要的元件... (6)宣告TfrmBaseClass, 用來動態產生各個不同的TfrmBase Form. (7)RegisterClass() & UnregisterClass() (8)TfrmBase 宣告虛擬函式 procedure ABC; virtual; TfrmBase000與TfrmBase001有重新改寫此函式, 其餘則沿用. (9)TfrmMain 宣告了兩個overload函式, procedure Set_Color(), 差異性在於其所接受的參數型態. 程式範例 [code delphi] unit fMain; interface uses Classes, SysUtils, Forms, fBase, Controls, StdCtrls; type TfrmMain = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private FTheForm: TfrmBase; function GetTheForm(Index: Integer): TfrmBase; public procedure Set_Color(AForm: TForm); overload; procedure Set_Color(AForm: TfrmBase); overload; property TheForm[Index: Integer]: TfrmBase read GetTheForm; end; var frmMain: TfrmMain; implementation uses fBase000; {$R *.dfm} { TfrmMain } procedure TfrmMain.Set_Color(AForm: TForm); begin if AForm is TfrmBase then TfrmBase(AForm).ABC; end; procedure TfrmMain.Set_Color(AForm: TfrmBase); begin AForm.ABC; end; function TfrmMain.GetTheForm(Index: Integer): TfrmBase; var f: TfrmBase; cn: string;//ClassName fc: TfrmBaseClass; begin if (FTheForm = nil) or (FTheForm.ID <> Index)then begin f := FTheForm; try cn := 'TfrmBase' Format('%3.3d', [Index]); fc := TfrmBaseClass(FindClass(cn)); if fc <> nil then FTheForm := fc.Create(Self) as TfrmBase else FTheForm := TfrmBase000.Create(Self);//Default finally if f <> nil then f.Free; end; end; Result := FTheForm; end; procedure TfrmMain.Button1Click(Sender: TObject); var I: Integer; F: TfrmBase; begin I := Random(11); F := TheForm[I]; F.Show; Set_Color(F); end; procedure TfrmMain.Button2Click(Sender: TObject); var I: Integer; F: TForm; begin I := Random(11); F := TheForm[I]; F.Show; Set_Color(F); end; end. [/code] [code delphi] unit fBase; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TfrmBase = class(TForm) private function GetID: Integer; public procedure AfterConstruction; override; procedure ABC; virtual; property ID: Integer read GetID; end; TfrmBaseClass = class of TfrmBase; var frmBase: TfrmBase; implementation uses fBase000, fBase001; {$R *.dfm} { TfrmBase } procedure TfrmBase.ABC; begin Color := RGB(Random($100),Random($100),Random($100)); end; procedure TfrmBase.AfterConstruction; begin FormStyle := fsStayOnTop; Position := poOwnerFormCenter; Caption := ClassName; end; function TfrmBase.GetID: Integer; begin //與Form命名有關, 如 TfrmBase000, TfrmBase001... //取得最後三碼數字,當作Form ID Result := StrToInt(Copy(ClassName,9,3)); end; initialization RegisterClass(TfrmBase); RegisterClass(TfrmBase000); RegisterClass(TfrmBase001); RegisterClass(TfrmBase002); RegisterClass(TfrmBase003); RegisterClass(TfrmBase004); RegisterClass(TfrmBase005); RegisterClass(TfrmBase006); RegisterClass(TfrmBase007); RegisterClass(TfrmBase008); RegisterClass(TfrmBase009); RegisterClass(TfrmBase010); finalization UnregisterClass(TfrmBase000); UnregisterClass(TfrmBase001); UnregisterClass(TfrmBase002); UnregisterClass(TfrmBase003); UnregisterClass(TfrmBase004); UnregisterClass(TfrmBase005); UnregisterClass(TfrmBase006); UnregisterClass(TfrmBase007); UnregisterClass(TfrmBase008); UnregisterClass(TfrmBase009); UnregisterClass(TfrmBase010); UnregisterClass(TfrmBase); end. [/code] [code delphi] unit fBase000; interface uses Graphics, Dialogs, fBase; type TfrmBase000 = class(TfrmBase) public procedure ABC; override; end; var frmBase000: TfrmBase000; implementation {$R *.dfm} { TfrmBase000 } procedure TfrmBase000.ABC; begin Color := clRed; end; end. [/code] [code delphi] unit fBase001; interface uses Graphics, fBase; type //以下10個TForm皆繼承字TfrmBase TfrmBase001 = class(TfrmBase) public procedure ABC; override; end; TfrmBase002 = class(TfrmBase); TfrmBase003 = class(TfrmBase); TfrmBase004 = class(TfrmBase); TfrmBase005 = class(TfrmBase); TfrmBase006 = class(TfrmBase); TfrmBase007 = class(TfrmBase); TfrmBase008 = class(TfrmBase); TfrmBase009 = class(TfrmBase); TfrmBase010 = class(TfrmBase); implementation { TfrmBase001 } procedure TfrmBase001.ABC; begin Color := clNavy; end; end. [/code] 個人建議僅供參考... |
bayman
一般會員 發表:30 回覆:35 積分:18 註冊:2007-04-24 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
|
bayman
一般會員 發表:30 回覆:35 積分:18 註冊:2007-04-24 發送簡訊給我 |
thanks!!
===================引 用 jow 文 章=================== 範例程式碼下載(D7) http://delphi.ktop.com.tw/download.php?download=upload/47d62dd776137_Test053.zip |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |