开发者

delphi typinfo SetPropValue

开发者 https://www.devze.com 2023-04-12 00:19 出处:网络
Hi I have a problem with this code: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Hi I have a problem with this code:

    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.C开发者_如何学Goreate;
  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.

Could someone tell me where is the problem?

Thanks in advance!


RTTI is generated for classes compiled with {$TYPEINFO ON} (or {$M+}) directive. TObject is not one of them; it starts at TPersistent. So either derive your class from TPersistent, or use the {$M+} directive in your code (before the declaration of your class).

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号