我创建了几个新对象
TMyMemo = class (TMemo)
private
FYahoo = Integer;
procedure SetYahoo(Value:integer)
public
procedure Google(A,B:integer; S:string);
published
property Yahoo:integer read FYahoo write SetYahoo;
end;
TMyPaintbox = class (TPaintbox)
private
FYahoo = Integer;
procedure SetYahoo(Value:integer)
public
procedure Google(A,B:integer; S:string);
published
property Yahoo:integer read FYahoo write SetYahoo;
end;
TMyButton = class (TButton)
private
FYahoo = Integer;
procedure SetYahoo(Value:integer)
public
procedure Google(A,B:integer; S:string);
published
property Yahoo:integer read FYahoo write SetYahoo;
end;
。 。
这些控件放在Form1上。有没有办法,我怎么能改变相同的属性(雅虎)并运行程序(谷歌),一般在不同的对象中声明?
我不想手动检查类类型,如: 如果Controls [i]是TMyMemo那么...... 如果controls [i]是TMyPaintbox那么...
因为我不知道我的新课程中有多少会拥有雅虎和谷歌的方法(这只是一个简单的例子)。 可能我必须使用^和@运算符或FieldAdress,MethodAddress我不知道还有什么。你能帮我找到一般的解决方案吗?
procedure Form1.Button1Click(Sender:TObject);
var i:integer;
begin
for i:=0 to Form1.ControlCount-1 do
begin
Controls[i].Google(4,5, 'Web'); // this should be changed somehow
Controls[i].Yahoo:=6; // this should be changed somehow
end;
end;
端;
由于
答案 0 :(得分:4)
定义一个界面,其中包含Google()和Yahoo定义的属性。
让您的TMyButton,TMyMemo和TMyPaintbox从该界面继承并覆盖这些方法以执行必要的操作。
在循环中,使用“as”运算符将控件转换为接口类型,并访问Yahoo字段和Google()方法。
以下是代码 - 运算符在Delphi 2009及以下版本中无法正常工作,因此我必须为此编写一个函数 - 它需要依赖捕获强制转换异常,因此它不是最干净的解决方案:
type
TMyInterface = interface(IInterface)
['{1F379072-BBFE-4052-89F9-D4297B9A826F}']
function GetYahoo : Integer;
procedure PutYahoo(i : Integer);
property Yahoo : Integer read GetYahoo write PutYahoo;
procedure Google(A, B : integer; S : string);
end;
TMyButton = class (TButton, TMyInterface)
private
FStr : String;
FYah : Integer;
public
function GetYahoo : Integer;
procedure PutYahoo(i : Integer);
procedure Google(A, B : integer; S : string);
end;
TMyMemo = class (TMemo, TMyInterface)
private
FStr : String;
FYah : Integer;
public
function GetYahoo : Integer;
procedure PutYahoo(i : Integer);
procedure Google(A, B : integer; S : string);
end;
{ TMyButton }
function TMyButton.GetYahoo: Integer;
begin
Result := 0;
end;
procedure TMyButton.Google(A, B: integer; S: string);
begin
FStr := S + '=' + IntToStr(A + B);
end;
procedure TMyButton.PutYahoo(i: Integer);
begin
FYah := 42;
end;
{ TMyMemo }
function TMyMemo.GetYahoo: Integer;
begin
//
end;
procedure TMyMemo.Google(A, B: integer; S: string);
begin
//
end;
procedure TMyMemo.PutYahoo(i: Integer);
begin
//
end;
function IsMyIntf(c : TControl) : TMyInterface;
begin
try
Result := c as TMyInterface;
except on e : Exception do
Result := nil;
end;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
i: Integer;
p : TMyInterface;
begin
for i := 0 to ControlCount - 1 do
begin
p := IsMyIntf(Controls[i]);
if (p <> nil) then
begin
p.PutYahoo(i);
p.Google(i, i, 'Hah!');
end;
end;
end;
答案 1 :(得分:1)
答案 2 :(得分:0)
@lyborko,Controls [i]返回一个TControl类,它没有Google
方法和Yahoo
属性的实现。为了解决您的问题,您可以检查{的类{1}}使用Controls[i]
属性,然后执行类似的操作。
ClassType
答案 3 :(得分:0)
最好使用带有不同类的 IF ... ELSE 来了解组件类,您可以使用RTTI来了解对象是否具有específic属性。你可以在这里找到代码和解释:
Modify control properties using RTTI
Here您可以使用RTTI找到更多代码访问组件的代码。
问候。
答案 4 :(得分:-1)
你正在寻找RTTI 请参阅有关http://delphi.about.com/od/vclusing/a/coloringfocused.htm的文章(请参阅第3页)
唯一的问题是它不能公开属性/方法,只能发布(我不知道在delphi 2010中stil是否为真)。可以在http://robstechcorner.blogspot.com/2009/09/so-what-is-rtti-rtti-is-acronym-for-run.html找到很多delphi 2010的RTTI信息。
按名称调用方法(通过RTTI):Se http://delphi.about.com/cs/adptips2004/a/bltip0204_3.htm