gpt4 book ai didi

Delphi通过未知类类型选择对象

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

我有几个不同的类,其起源是另一个类。我有一个属性可以扩展到所有其他类。但不同的类对这个属性的处理方式不同。所以我想这样做:

TClass(ObjectPointer).Property:=Value;

但是 TClass 是未知的类类型

我可以做这样的事情吗:

ObjectPointer.ClassType(ObjectPointer).Property:=Value

或者这个

var
ClassRef: TClass;
begin

ClassRef := Sender.ClassType;
ClassRef(ObjectPointer).DoStuff
end;

有没有办法在delphi中做到这一点而不使用if语句

最佳答案

请注意,本文中的代码仅适用于已发布的属性!

要回答您的问题是否有办法在不使用 if 语句的情况下设置属性值,请检查以下重载函数。

第一个用于 char、string、variant、integer、64 位整数、float、枚举、set 和动态数组类型的属性(唷)。第二个仅适用于类类型属性。如果给定属性存在并且值或对象实例已成功分配,则两者都将返回 True,否则返回 False:

uses
TypInfo;

function TrySetPropValue(AInstance: TObject; const APropName: string;
const AValue: Variant): Boolean; overload;
begin
Result := True;
try
SetPropValue(AInstance, APropName, AValue);
except
Result := False;
end;
end;

function TrySetPropValue(AInstance: TObject; const APropName: string;
AValue: TObject): Boolean; overload;
begin
Result := True;
try
SetObjectProp(AInstance, APropName, AValue);
except
Result := False;
end;
end;

以及用法;当设置 Memo1.Lines 时,将调用 TrySetPropValue 的第二个版本:

procedure TForm1.Button1Click(Sender: TObject);
var
Strings: TStringList;
begin
TrySetPropValue(Memo1, 'Width', 250);
TrySetPropValue(Memo1, 'Height', 100);
TrySetPropValue(Memo1, 'ScrollBars', ssBoth);

Strings := TStringList.Create;
try
Strings.Add('First line');
Strings.Add('Second line');
TrySetPropValue(Memo1, 'Lines', Strings);
finally
Strings.Free;
end;

if not TrySetPropValue(Memo1, 'Height', 'String') then
ShowMessage('Property doesn''t exist or the value is invalid...');
if not TrySetPropValue(Memo1, 'Nonsense', 123456) then
ShowMessage('Property doesn''t exist or the value is invalid...');
end;

关于Delphi通过未知类类型选择对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9964483/

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