请教-RTTI如何读写TStrings,比如TListBox,我要用RTTI的话,如何写它的Items的属性?
我要实现的就是传入字符串,设置Items(TStrings)的Strings的值。

解决方案 »

  1.   

    不太明白你的意思。如果是想通过RTTI直接访问TSTRINGS的TEXT数据应该是不可能。主要的原因是因为TSTRINGS只是一个很单纯的基类,在TSTRINGS里根本没有保存该数据,他的核心方法    procedure Insert(Index: Integer; const S: string); virtual; abstract;  是一个抽象方法(没有实现)。而你讲的TLISTBOX里的STRINGS实际在创建的时候使用的是TListBoxStrings,而这个是直接调用了WINS32的API来读取WINS32控件的数据的。
      

  2.   

    var
      S: string;
      vStringList: TStringList;
    begin
      S := '1'#13#10'2'#13#10'3'#13#10'4'#13#10;
      vStringList := TStringList.Create;
      vStringList.Text := S;
      SetObjectProp(ListBox1, 'Items', vStringList);
      vStringList.Free;
    end;
      

  3.   

    其实我想问的是如何给某个Item赋值,通过RTTI.
      

  4.   

    其实伴水的方法已经说得很清楚了....至少对TSTRINGS中某一项...
    你应该是GetObjectProp而非SetObjectProp..procedure TForm1.Button1Click(Sender: TObject);
    var
      S: string;
      vStringList: TStringList;
    begin
      S := '1'#13#10'2'#13#10'3'#13#10'4'#13#10;
      vStringList := TStringList.Create;
      vStringList.Text := S;
      SetObjectProp(ListBox1, 'Items', vStringList);
      vStringList.Free;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      list:TStrings;
    begin
      list:=GetObjectProp(ListBox1,'Items') as TStrings;
      list.Strings[0]:='不要问我从哪里来';
    end;
      

  5.   

    用RTTI就是想不去知道到底是什么类型,就可以给它赋值或取值,否则就没什么意义了。
      

  6.   

    也许是因为安全与效率原因.DELPHI对象模型设计的时候,RTTI这样只能访问PUBLISHED的属性与方法,
    也就是说..你可以RTTI方式访问listbox的items属性,因为它是PUBLISHED的.
    但你不能RTTI方式访问TStrings的item属性,因为它不是.