用DevExpress Inspector RTTI可以搞定。
到www.51delphi.com去下载吧。

解决方案 »

  1.   

    给你一个范例《Delphi 3 高级开发指南》unit DelphiPt;interfaceuses
      Classes, Graphics;type
      TDDHPoint = class (TCollectionItem)
      private
        fX, fY: Integer;
      public
        Text: string;
        procedure WriteText (Writer: TWriter);
        procedure ReadText (Reader: TReader);
        procedure DefineProperties (Filer: TFiler); override;
        procedure Paint (Canvas: TCanvas);
        procedure Assign (Pt: TPersistent); override;
      published
        property X: Integer read fX write fX;
        property Y: Integer read fY write fY;
      end;  TWrapper = class (TComponent)
      private
        FColl: TCollection;
      published
        property MyColl: TCollection read FColl write FColl;
      public
        constructor Create (Owner: TComponent); override;
        destructor Destroy; override;
      end;implementation// TWrapper constructor and destructorconstructor TWrapper.Create (Owner: TComponent);
    begin
      inherited Create (Owner);
      FColl := TCollection.Create (TDDHPoint);
    end;destructor TWrapper.Destroy;
    begin
      FColl.Clear;
      FColl.Free;
      inherited Destroy;
    end;
    // class TDDHPoint methodsprocedure TDDHPoint.WriteText (Writer: TWriter);
    begin
      Writer.WriteString (Text);
    end;procedure TDDHPoint.ReadText (Reader: TReader);
    begin
      Text := Reader.ReadString;
    end;procedure TDDHPoint.DefineProperties (Filer: TFiler);
    begin
      Filer.DefineProperty (
        'Text', ReadText, WriteText, (Text <> ''));
    end;procedure TDDHPoint.Paint (Canvas: TCanvas);
    begin
      Canvas.Ellipse (fX - 3, fY - 3, fX + 3, fY + 3);
      Canvas.TextOut (fX + 5, fY + 5, Text);
    end;procedure TDDHPoint.Assign (Pt: TPersistent);
    begin
      if Pt is TDDHPoint then
      begin
        fx := TDDHPoint (Pt).fX;
        fY := TDDHPoint (Pt).fY;
        Text := TDDHPoint (Pt).Text;
      end
      else
        // raise an exception
        inherited Assign (pt);
    end;//initialization
    //RegisterClass (TWrapper);
    end.unit PersForm;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Buttons, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Label1: TLabel;
        Edit1: TEdit;
        SpeedButtonLoad: TSpeedButton;
        SpeedButtonSave: TSpeedButton;
        OpenDialog1: TOpenDialog;
        SaveDialog1: TSaveDialog;
        procedure FormCreate(Sender: TObject);
        procedure SpeedButtonSaveClick(Sender: TObject);
        procedure SpeedButtonLoadClick(Sender: TObject);
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormDestroy(Sender: TObject);
        procedure FormPaint(Sender: TObject);
      private
        PtList: TCollection;
      end;var
      Form1: TForm1;implementation{$R *.DFM}uses
      DelphiPt;procedure TForm1.FormCreate(Sender: TObject);
    begin
      PtList := TCollection.Create (TDDHPoint);
    end;procedure TForm1.SpeedButtonSaveClick(Sender: TObject);
    var
      Str1: TFileStream;
      Wrap: TWrapper;
    begin
      if SaveDialog1.Execute then
      begin
        Str1 := TFileStream.Create (SaveDialog1.FileName,
          fmOpenWrite or fmCreate);
        try
          Wrap := TWrapper.Create (self);
          try
            Wrap.MyColl.Assign (ptList);
            Str1.WriteComponent (Wrap);
          finally
            Wrap.Free;
          end;
        finally
          Str1.Free;
        end;
      end;
    end;procedure TForm1.SpeedButtonLoadClick(Sender: TObject);
    var
      Str1: TFileStream;
      Wrap: TWrapper;
    begin
      if OpenDialog1.Execute then
      begin
        Str1 := TFileStream.Create (
          OpenDialog1.Filename, fmOpenRead);
        try
          Wrap := TWrapper.Create (self);
          try
            Wrap := Str1.ReadComponent (Wrap) as TWrapper;
            ptList.Assign (Wrap.MyColl);
          finally
            Wrap.Free;
          end;
        finally
          Str1.Free;
          Invalidate;
          Edit1.Text := 'Point ' + IntToStr (PtList.Count + 1);
        end;
      end;
    end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      Pt: TDDHPoint;
    begin
      Pt := PtList.Add as TDDHPoint;
      Pt.X := X;
      Pt.Y := Y;
      Pt.Text := Edit1.Text;
      Edit1.Text := 'Point ' + IntToStr (PtList.Count + 1);
      Invalidate;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      // empty and destroy the list
      PtList.Clear;
      PtList.Free;
    end;procedure TForm1.FormPaint(Sender: TObject);
    var
      I: Integer;
    begin
      for I := 0 to PtList.Count - 1 do
        TDDHPoint (PtList.Items [I]).Paint (Canvas);
    end;end.object Panel1: TPanel
      Left = 0
      Top = 0
      Width = 454
      Height = 48
      Align = alTop
      ParentShowHint = False
      ShowHint = False
      TabOrder = 0
      object Label1: TLabel
        Left = 10
        Top = 15
        Width = 129
        Height = 16
        Caption = 'Enter name then click:'
      end
      object SpeedButtonLoad: TSpeedButton
        Left = 315
        Top = 10
        Width = 60
        Height = 31
        Caption = 'Load...'
        NumGlyphs = 2
        OnClick = SpeedButtonLoadClick
      end
      object SpeedButtonSave: TSpeedButton
        Left = 374
        Top = 10
        Width = 60
        Height = 31
        Caption = 'Save...'
        NumGlyphs = 2
        OnClick = SpeedButtonSaveClick
      end
      object Edit1: TEdit
        Left = 148
        Top = 10
        Width = 149
        Height = 24
        TabOrder = 0
        Text = 'Point 1'
      end
    end
    object OpenDialog1: TOpenDialog
      DefaultExt = 'prs'
      Filter = 'Persistent File (*.prs)|*.prs|Any file (*.*)|*.*'
      Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist]
      Left = 32
      Top = 64
    end
    object SaveDialog1: TSaveDialog
      DefaultExt = 'prs'
      Filter = 'Persistent File (*.prs)|*.prs|Any file (*.*)|*.*'
      Options = [ofHideReadOnly, ofPathMustExist, ofCreatePrompt]
      Left = 112
      Top = 65
    end
      

  2.   

    baxp(一头雾水) 不太明白,能不能介绍一下用法:果然是“一头雾水”,:),找一本《Delphi 3 高级开发指南》看看吧,讲得很明白。另外,我比较喜欢看名家的源程序,很能提高。
      

  3.   

    你新建一个工程,把代码拷进去,编译运行。就明白了 。
    Delphi中的帮助:
    关于TStream的function ComponentToString(Component: TComponent): string;var
      BinStream:TMemoryStream;
      StrStream: TStringStream;
      s: string;
    begin
      BinStream := TMemoryStream.Create;
      try
        StrStream := TStringStream.Create(s);
        try
          BinStream.WriteComponent(Component);
          BinStream.Seek(0, soFromBeginning);
          ObjectBinaryToText(BinStream, StrStream);
          StrStream.Seek(0, soFromBeginning);
          Result:= StrStream.DataString;
        finally
          StrStream.Free;    end;
      finally
        BinStream.Free
      end;
    end;function StringToComponent(Value: string): TComponent;
    var
      StrStream:TStringStream;
      BinStream: TMemoryStream;
    begin
      StrStream := TStringStream.Create(Value);
      try
        BinStream := TMemoryStream.Create;
        try
          ObjectTextToBinary(StrStream, BinStream);
          BinStream.Seek(0, soFromBeginning);
          Result := BinStream.ReadComponent(nil);    finally
          BinStream.Free;
        end;
      finally
        StrStream.Free;
      end;
    end;TStringStream读到stringgrid即可。
      

  4.   

    能不能具体的说明一下,如何把button的属性列表读出到stringtrid?
    马上给分
      

  5.   

    把mail 留下,我作好例子后发给你。
      

  6.   

    [email protected]
    写了,货到付款