delphi typinfo SetPropValue - PullRequest
       0

delphi typinfo SetPropValue

0 голосов
/ 07 октября 2011

Привет, у меня проблема с этим кодом:

    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 Ответ

1 голос
/ 07 октября 2011

RTTI генерируется для классов, скомпилированных с директивой {$TYPEINFO ON} (или {$M+}).TObject не является одним из них;это начинается в TPersistent.Поэтому либо наследуйте ваш класс от TPersistent, либо используйте директиву {$M+} в своем коде (до объявления вашего класса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...