如何列举出一个控件的所有属性,并且得到属性值 用DevExpress Inspector RTTI可以搞定。到www.51delphi.com去下载吧。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 给你一个范例《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' endendobject OpenDialog1: TOpenDialog DefaultExt = 'prs' Filter = 'Persistent File (*.prs)|*.prs|Any file (*.*)|*.*' Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist] Left = 32 Top = 64endobject SaveDialog1: TSaveDialog DefaultExt = 'prs' Filter = 'Persistent File (*.prs)|*.prs|Any file (*.*)|*.*' Options = [ofHideReadOnly, ofPathMustExist, ofCreatePrompt] Left = 112 Top = 65end baxp(一头雾水) 不太明白,能不能介绍一下用法:果然是“一头雾水”,:),找一本《Delphi 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即可。 能不能具体的说明一下,如何把button的属性列表读出到stringtrid?马上给分 把mail 留下,我作好例子后发给你。 [email protected]写了,货到付款 delphi 语句编译不过去 devhp再进来领米 老菜鸟又碰上了头痛的报表问题 小问题,但是很难: 我问一个Form的问题 treeview的问题,请各位帮给以解决! 一个我不得不说,非说不可的重要问题!!! delphi的整除符号是....? 关于线程问题 主细表问题求助 我想做一控件,请大家帮帮忙。 关于动态生成控件数组的问题!
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
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即可。
马上给分
写了,货到付款