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

如何調用某些FORM的public過程?

答題得分者是:jow
bayman
一般會員


發表:30
回覆:35
積分:18
註冊:2007-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-07 19:54:33 IP:219.130.xxx.xxx 訂閱
在我一個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-08 11:50:43 IP:61.67.xxx.xxx 未訂閱
在主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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-08 13:20:10 IP:125.93.xxx.xxx 訂閱
但是這樣會提示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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-03-08 21:58:24 IP:61.67.xxx.xxx 未訂閱
請把重點程式段po上來看看吧!
bayman
一般會員


發表:30
回覆:35
積分:18
註冊:2007-04-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-03-09 08:06:45 IP:219.130.xxx.xxx 訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-03-09 12:51:53 IP:220.143.xxx.xxx 訂閱
試試下列吧!

[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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-03-09 15:20:58 IP:219.130.xxx.xxx 訂閱
謝謝樓上回覆.
我想是我的問題陳述得不好.

其實是這樣的.我的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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-03-11 13:09:08 IP:210.66.xxx.xxx 訂閱
在專案之初應該先做好規劃,
利用繼承的方式,來歸類具有相似特性的功能畫面,
以下利用一個小例子來說明:

(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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-03-11 14:13:53 IP:219.132.xxx.xxx 訂閱
謝謝樓上回復...其實我還不知道如何使用繼承,先COPY下來有空再慢慢看,謝謝!!
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-03-11 15:01:16 IP:210.66.xxx.xxx 訂閱
bayman
一般會員


發表:30
回覆:35
積分:18
註冊:2007-04-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-03-11 16:55:06 IP:219.132.xxx.xxx 訂閱
thanks!!
===================引 用 jow 文 章===================
範例程式碼下載(D7)

http://delphi.ktop.com.tw/download.php?download=upload/47d62dd776137_Test053.zip
系統時間:2024-05-06 12:48:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!