delphi typinfo SetPropValue

时间:2011-10-07 14:31:39

标签: delphi reflection

您好我的代码有问题:

    unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ActnList, StdCtrls, Buttons, MSObjCtrls, StrUtils;
type
  Data = class(TObject)
    FName : string;
    FValue : string;
  private
  public
  published
    property Name : string read FName write FName;
    property Value : string read FValue write FValue;
  end;
type
  TForm1 = class(TForm)
    edtResult : TMSObjectText;
    btnGo : TMSBitBtn;
    ActionList1 : TActionList;
    acGo : TAction;
    procedure acGoExecute(Sender : TObject);
  private
    procedure Split(Delimiter, S : string; Strings : TStrings);
  public
    { Public declarations }
  end;

var
  Form1                                 : TForm1;

implementation

uses TypInfo;

{$R *.dfm}

procedure TForm1.Split(Delimiter, S : string; Strings : TStrings);
var
  P, OldP                               : integer;
  Token                                 : string;
begin
  if (Strings = nil) or (Length(S) = 0) or (Length(Delimiter) = 0) then
    exit;
  P := Pos(Delimiter, S);
  OldP := 1;
  while P > 0 do
  begin
    Token := Copy(S, OldP, P - OldP);
    Strings.Add(Token);

    OldP := P + 1;
    P := PosEx(Delimiter, S, OldP);
  end;
  if P = 0 then
    Strings.Add(Copy(S, OldP, Length(S)));
end;

procedure TForm1.acGoExecute(Sender : TObject);
var
  Lst, tmpLst                           : TStringList;
  i                                     : Integer;
  Obj                                   : Data;
  str                                   : string;
begin
  str := 'Name=Jordan Borisov;Value=man';
  Lst := TStringList.Create;
  tmpLst := TStringList.Create;
  Split(';', str, Lst);
  Obj := Data.Create;
  for i := 0 to Lst.Count - 1 do
  begin
    Split('=', Lst[i], tmpLst);
    try
      SetPropValue(Obj, tmpLst[0], tmpLst[1]);
    except
      ShowMessage(Format('Invalid  property name %s', [tmpLst[0]]));
    end;

    tmpLst.Clear;
  end;
  edtResult.Text := 'Name[' + Obj.Name + '],Value[' + Obj.Value + ']';
end;

end.

有人能告诉我问题出在哪里吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

为使用{$TYPEINFO ON}(或{$M+})指令编译的类生成RTTI。 TObject不是其中之一;它从TPersistent开始。因此要么从TPersistent派生你的类,要么在代码中使用{$M+}指令(在你的类声明之前)。