Delphi函数SetProperty(ComponentName: string, PropertyName: string, JSONValue: string): boolean;

问题描述 投票:0回答:1

我将如何编写一个函数,该函数获取组件和属性的名称以及 JSON 值字符串,并用该值动态填充该组件的属性? 该属性可以是特定数据类型的单个值,也可能更复杂,但现在我们坚持使用单个值属性(字符串、整数或浮点)。

不确定从哪里开始,因为这意味着动态地根据名称获取组件。

我想我可能还需要将组件和属性类型指定为参数,例如:

 function SetProperty(ComponentType, ComponentName, PropertyType, PropertyName: string; JSONValue: string): boolean;

我不知道如何在代码中动态引用这个组件。

一个例子是:

result := SetProperty('TEdit', 'Edit1', 'Integer', 'Width', '{Value:100}');
function delphi dynamic-programming firemonkey
1个回答
0
投票

我成功了。这是我的看法! 我现在只提供简单类型,但这应该足够了。 (感谢 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;
© www.soinside.com 2019 - 2024. All rights reserved.