我将如何编写一个函数,该函数获取组件和属性的名称以及 JSON 值字符串,并用该值动态填充该组件的属性? 该属性可以是特定数据类型的单个值,也可能更复杂,但现在我们坚持使用单个值属性(字符串、整数或浮点)。
不确定从哪里开始,因为这意味着动态地根据名称获取组件。
我想我可能还需要将组件和属性类型指定为参数,例如:
function SetProperty(ComponentType, ComponentName, PropertyType, PropertyName: string; JSONValue: string): boolean;
我不知道如何在代码中动态引用这个组件。
一个例子是:
result := SetProperty('TEdit', 'Edit1', 'Integer', 'Width', '{Value:100}');
我成功了。这是我的看法! 我现在只提供简单类型,但这应该足够了。 (感谢 jamesc 的回复。)
uses
System.Rtti, System.TypInfo;
function SetProperty (pComponentName, pPropertyName: string; pValue: string): boolean;
var
AComponent: TComponent;
APropList: PPropList;
APropCount: integer;
APPropInfo: PPTypeInfo;
APropInfo: TTypeInfo;
I: integer;
begin
AComponent := Form1.FindComponent(pComponentName);
if AComponent <> nil then
begin
APropCount := GetPropList(AComponent, APropList);
try
for I := 0 to APropCount - 1 do
begin
if APropList[I].Name = pPropertyName then
begin
APPropInfo := GetPropInfo(AComponent, pPropertyName).PropType;
APropInfo := APPropInfo^^;
if ((APropInfo.Kind = TTypeKind.tkInteger)
or (APropInfo.Kind = TTypeKind.tkChar)
or (APropInfo.Kind = TTypeKind.tkFloat)
or (APropInfo.Kind = TTypeKind.tkString)
or (APropInfo.Kind = TTypeKind.tkWChar)
or (APropInfo.Kind = TTypeKind.tkLString)
or (APropInfo.Kind = TTypeKind.tkWString)
or (APropInfo.Kind = TTypeKind.tkInt64)
or (APropInfo.Kind = TTypeKind.tkUString)) then
SetPropValue(AComponent, pPropertyName, pValue);
end;
end;
finally
FreeMem(APropList);
end;
end;
end;