2011-10-07 141 views
-1

您好我有这个代码的问题:德尔福typinfo SetPropValue

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. 

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

在此先感谢!

+0

如果您告诉我们什么不起作用,您会得到更好的答案。它不会编译?它不是做你想做的事吗?问题是什么? –

+0

对不起,我忘了。 问题是,在SetPropValue方法中,我尝试为类Data中的属性Name设置一个新值,但每次都使用文本引发一个异常:Property Name不存在。 –

+0

需要在acGoExecute中释放Lst和tmpLst。 –

回答

1

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

+0

尽管'TObject'没有用{$ M +}编译,编译器在TObject后裔中看到'published'属性时会自动添加{$ M +}(带警告)。至少Delphi 2009是这样做的。 – kludg

+0

@Serg:在XE/XE2中依然如此。这是[警告](http://docwiki.embarcadero.com/RADStudio/en/W1055_Published_caused_RTTI_(%24M%2B)_to_be_added_to_type _'%25s'_(德尔福))。谢谢(你的)信息。 –