不同类中的相同属性和过程。如何访问它们?

时间:2010-04-21 06:47:33

标签: delphi

我创建了几个新对象

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;

端;

由于

5 个答案:

答案 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)

  1. 使用相同的基类
  2. 使用界面
  3. 使用D2010 RTTI
  4. 在所有控件上实现自定义消息并对其进行处理。

答案 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