如何编写Delphi动态设置组件属性的SetProperty函数?
Delphi 动态组件属性赋值函数实现方案
完整函数代码
uses System.Classes, System.SysUtils, System.JSON, System.TypInfo, Vcl.Controls; function SetProperty(ComponentType, ComponentName, PropertyType, PropertyName: string; JSONValue: string): boolean; var LComponent: TComponent; LJSONObj: TJSONObject; LValue: TJSONValue; LIntValue: Integer; LFloatValue: Double; LStrValue: string; begin Result := False; // 1. 查找指定名称的组件 LComponent := Screen.FindComponent(ComponentName); if not Assigned(LComponent) then Exit; // 2. 验证组件类型匹配 if not LComponent.InheritsFrom(FindClass(ComponentType)) then Exit; // 3. 解析JSON值字符串 try LJSONObj := TJSONObject.ParseJSONValue(JSONValue) as TJSONObject; if not Assigned(LJSONObj) then Exit; LValue := LJSONObj.GetValue('Value'); if not Assigned(LValue) then Exit; // 4. 按属性类型转换并赋值 try case UpperCase(PropertyType) of 'INTEGER': begin if LValue is TJSONNumber then begin LIntValue := TJSONNumber(LValue).AsInt; SetPropValue(LComponent, PropertyName, LIntValue); Result := True; end; end; 'FLOAT', 'DOUBLE': begin if LValue is TJSONNumber then begin LFloatValue := TJSONNumber(LValue).AsDouble; SetPropValue(LComponent, PropertyName, LFloatValue); Result := True; end; end; 'STRING': begin LStrValue := LValue.Value; SetPropValue(LComponent, PropertyName, LStrValue); Result := True; end; end; finally LJSONObj.Free; end; except on E: Exception do Result := False; end; end;
关键逻辑说明
- 动态查找组件:使用
Screen.FindComponent全局搜索名称匹配的组件;如果组件仅存在于特定容器(如某Form),可替换为Form1.FindComponent以提升效率。 - 类型校验:通过
FindClass获取目标组件类,再用InheritsFrom验证找到的组件是否为目标类型或其子类,避免类型不匹配错误。 - JSON解析:借助
TJSONObject.ParseJSONValue解析输入的JSON字符串,提取Value字段的实际值。 - 属性赋值:使用
SetPropValue(来自System.TypInfo单元)完成动态属性赋值,该函数会自动处理属性的读写权限检查。 - 异常防护:包裹JSON解析与赋值逻辑,防止因格式错误、无效属性等情况导致程序崩溃。
示例调用
// 给Edit1的Width属性赋值为100 Result := SetProperty('TEdit', 'Edit1', 'Integer', 'Width', '{Value:100}'); // 给Label1的Caption属性赋值为"测试文本" Result := SetProperty('TLabel', 'Label1', 'STRING', 'Caption', '{Value:"测试文本"}');
注意事项
- 传入的
ComponentType必须是已注册的VCL组件类名(如TEdit、TButton)。 PropertyName需为组件的公开可写属性,比如TEdit的Text、Height。- JSON格式需符合规范,字符串类型的
Value必须加双引号。 - 如需支持更多属性类型(如布尔值),可扩展
case语句分支。
内容的提问来源于stack exchange,提问作者JohanS
相关产品推荐
相关产品推荐

