我有几个不同的类,其中origin是另一个类。我有一个属性扩展到所有其他类。 但不同的类处理此属性的方式不同。 所以我想这样做:
TClass(ObjectPointer).Property:=值;
但是TClass是未知类类型
我能做那样的事吗:
ObjectPointer.ClassType(ObjectPointer).Property:=值
或者
var
ClassRef: TClass;
begin
ClassRef := Sender.ClassType;
ClassRef(ObjectPointer).DoStuff
end;
有没有办法在delphi中执行此操作而不使用if语句
答案 0 :(得分:9)
请注意,此帖子中的代码仅适用于已发布的媒体资源!
要回答您的问题如果有办法在不使用if语句的情况下设置属性值,请检查以下重载函数。
第一个是char,string,variant,integer,64位整数,float,枚举,set和动态数组类型的属性(phew)。第二个是仅用于类类型属性。如果存在给定属性并且成功分配了值或对象实例,则两者都将返回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;