gpt4 book ai didi

delphi - 对象参数为零,无法确定原因

转载 作者:行者123 更新时间:2023-12-03 15:28:31 24 4
gpt4 key购买 nike

我认为这应该非常简单,但我不知道为什么这不起作用。

我已经接管了遗留代码,并且 dll 中使用的一些对象变得难以管理。几个对象有相同的过程

SetPropertyValue(propName,propValue:string);

现在,这些方法基本上都是巨大的 if..else检查 propName 的语句并分配 propValue如果它与对象属性匹配:

if propName='name' then
name:=propValue
else if propName='address' then
address:=propValue

等等。

每次对象获取新属性(或属性类型发生变化,因此传入的值参数需要进行不同的转换)时,此方法都需要更新 - 显然这是一项不需要的苦差事。

我选择编写一个全局方法来设置动态的对象属性,并且需要最少的维护。

这是我迄今为止正在做的事情的一个简短示例。有两个单元,Obj 和 Main - 其中 Main 是一个带有 2 个编辑框和一个按钮的 VCL 表单,我使用按钮单击来触发 SetPropertyValue:

对象

unit Obj;

interface

uses
RTTI;

{$RTTI INHERIT}
type TmyObj = class(TObject)
Name:String;
Address:String;
City:String;

procedure SetPropertyValue(sPropName, sPropValue:String);
end;


procedure SetObjProperty(AObject : TObject; propName, propValue:String);

implementation

procedure SetObjProperty(AObject : TObject; propName, propValue:String);
var
context:TRttiContext;
rt: TRttiType;
prop: TRttiProperty;
begin

if not Assigned(AObject) then
exit;

context:=RTTIContext.Create;
rt:=Context.GetType(AObject.ClassType);

for prop in rt.GetProperties do
begin

//do some stuff

end;

Context.Free;

end;

{ TmyObj }

procedure TmyObj.SetPropertyValue(sPropName, sPropValue: String);
begin
SetObjProperty(self, sPropName, sPropValue);
end;

end.

主要

unit Main;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
TForm1 = class(TForm)
edtPropName: TEdit;
Label1: TLabel;
edtPropValue: TEdit;
btnGo: TButton;
procedure btnGoClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses
Obj;

{$R *.dfm}

procedure TForm1.btnGoClick(Sender: TObject);
var
myObj:TMyObj;
begin

myObj:=TMyObj.Create;
myObj.SetPropertyValue(edtPropName.Text, edtPropValue.Text);

end;

end.

而不是更改 obj.SetPropertyValue (因为我必须在代码中一遍又一遍地更改它),我只是引用了新过程。

不幸的是,无论我如何尝试引用Obj.SetPropertyValyue中的对象SetObjectProperty 中始终为空- 所以rt始终为空,循环不执行任何操作。

我知道在传递对象时,我们只是传递一个指针,所以即使我将参数类型更改为 CONST ,当我进入新过程时,我仍然得到相同的空/零值。

对我的错误有什么想法吗?我什至尝试引用 SetObjProperty在单位之外,所以:

thisObj:=TMyObj.Create;
SetObjProperty(thisObj,sThisName, sThisValue);

但我仍然得到相同的 nil obj 在我的新方法中。

任何和所有的帮助将不胜感激!

最佳答案

Any thoughts on what I have down wrong?

您正在使用RTTI循环属性,但您的 TMyObj 没有声明 properties

这是一个小示例,说明如何操作:

program Project62;

{$APPTYPE CONSOLE}

uses
System.SysUtils,
RTTI;

{$RTTI INHERIT}
type
TmyObj = class(TObject)
private
FName:String;
FAddress:String;
FCity:String;
public
property Name: String read FName write FName;
property Address: String read FAddress write FAddress;

procedure SetPropertyValue(sPropName, sPropValue:String);
end;

procedure SetObjProperty(AObject : TObject; propName, propValue:String);
var
context:TRttiContext;
rt: TRttiType;
prop: TRttiProperty;
begin
if not Assigned(AObject) then begin
WriteLn('Not assigned');
exit;
end;
rt:= Context.GetType(AObject.ClassType);
for prop in rt.GetProperties do
begin
if (propName = 'Name') then
prop.SetValue(AObject,propValue)
else if (propName = 'Address') then
prop.SetValue(AObject,propValue);
end;
end;

procedure TmyObj.SetPropertyValue(sPropName, sPropValue: String);
begin
SetObjProperty(self, sPropName, sPropValue);
end;

var
myObj:TMyObj;
begin

myObj:= TMyObj.Create;
myObj.SetPropertyValue('Name', '1');
WriteLn(myObj.Name);
ReadLn;
end.

关于delphi - 对象参数为零,无法确定原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36089354/

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