如何根据属性名称给属性赋值?

ShallowShrimp 2004-08-30 05:01:12
请教各位高手,我自己创建一个类:
TWorker = class(TObject)
private
FsWorkerName:string;
public
published
property sWorkerName:string read FsWorkerName write FsWorkerName;
end;

引用下面语句赋值:
var NewWorker:TWorker;
begin
NewWorker:=TWorker.Create;
SetPropValue(NewWorker,'sWorkerName','shallowshrimp');
end;

结果系统报错,为什么?
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EPropertyError with message 'Property sWorkerName does not exist'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
...全文
296 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wx1452 2004-08-30
  • 打赏
  • 举报
回复
alphax:
最近怎么样,好久没有联系了
最近想用这个wx1452来升颗星
本来想一直隐藏下去,,,
呵呵,可能是有点无聊吧
不过有很多问题弄不懂

ShallowShrimp 2004-08-30
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3312/3312749.xml?temp=.6168024
不知道各位能否帮我解决这个问题?
beyondtkl 2004-08-30
  • 打赏
  • 举报
回复
没写过 学习
ly_liuyang 2004-08-30
  • 打赏
  • 举报
回复
N年写的,翻出来:)

unit SetControlProp_Unit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TypInfo;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function SetControlProp(ComStr, value: string): boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.SetControlProp(ComStr, value: string): boolean;
var
ComName, ComProp: string;
i: integer;
PropInfo: PPropInfo;
cp: TComponent;
begin
i := Pos('.', ComStr);
if i > 0 then
begin
ComName := copy(ComStr, 1, i-1);
ComProp := Copy(Comstr, i+1, 1000);
cp := FindComponent(ComName);
PropInfo := GetPropInfo(cp.ClassInfo, ComProp);
if Assigned(PropInfo) then
SetStrProp(cp, PropInfo, value);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SetControlProp('button1.caption', 'hello');
end;

end.
alphax 2004-08-30
  • 打赏
  • 举报
回复
老达摩为什么要用马甲呢?
Eastunfail 2004-08-30
  • 打赏
  • 举报
回复
而且还要按照wx1452()说的,从TPersistent继承或者手动添加产生RTTI的编译开关
Eastunfail 2004-08-30
  • 打赏
  • 举报
回复
uses TypInfo.pas;

var Worker:TWorker;
begin
....
SetStrProp(Worker,'sWorkerName','工人名字')
end;


你的TWorker类已经表示是工人类了,如果在属性中还重复出现Worker则有点看起来不爽。建议你用Name代替sWorkerName
wx1452 2004-08-30
  • 打赏
  • 举报
回复
{$M+}
TWorker = class(TObject)
private
FsWorkerName:string;
public
published
property sWorkerName:string read FsWorkerName write FsWorkerName;
end;
{$M-}

用{$M+}让编译器为TWorker产生RTTI,
或者让TWorker从TPersistent派生
wanwangzhiwang 2004-08-30
  • 打赏
  • 举报
回复
按一下Ctrl+shift+C,马上解决问题
luke5678 2004-08-30
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
NewWorker:TWorker;
begin
NewWorker:=TWorker.Create;
NewWorker.FsWorkerName := 'FsWorkerName';
ShowMessage(NewWorker.sWorkerName);
end;

这样楼主应该明白了吧!
yinweixian 2004-08-30
  • 打赏
  • 举报
回复
'Property sWorkerName does not exist'是没有找到属性

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧