gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:35:54 26 4
gpt4 key购买 nike

我创建了几个新对象

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 那么 ...

因为我不知道有多少我的新类将具有属性 Yahoo 和方法 Google(这只是一个简单的示例)。
可能我得用^和@操作符或者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;

结尾;

谢谢

最佳答案

定义一个同时定义了 Google() 方法和 Yahoo 属性的接口(interface)。

让您的 TMyButton、TMyMemo 和 TMyPaintbox 从该接口(interface)继承并覆盖这些方法以执行必要的操作。

在循环中,使用“as”运算符将控件转换为接口(interface)类型,并访问 Yahoo 字段和 Google() 方法。

这是代码 - is 运算符在 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;

关于delphi - 不同类中的相同属性和过程。如何访问它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2680830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com