mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-08 02:19:57 +02:00
302 lines
7.6 KiB
ObjectPascal
302 lines
7.6 KiB
ObjectPascal
unit Unit1;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, typinfo, CompWriterPas, LazLogger;
|
|
|
|
type
|
|
TMyEnum = (myEnum1, myEnum2, myEnum3);
|
|
TMySet = set of TMyEnum;
|
|
|
|
{ TMyCollectionItem }
|
|
|
|
TMyCollectionItem = class(TCollectionItem)
|
|
private
|
|
FMyString: string;
|
|
published
|
|
property MyString: string read FMyString write FMyString;
|
|
end;
|
|
|
|
{ TMyPersistent }
|
|
|
|
TMyPersistent = class(TPersistent)
|
|
private
|
|
FMyInteger: integer;
|
|
public
|
|
constructor Create;
|
|
published
|
|
property MyInteger: integer read FMyInteger write FMyInteger;
|
|
end;
|
|
|
|
{ TMyComponent }
|
|
|
|
TMyComponent = class(TComponent)
|
|
private
|
|
FMyBoolean: Boolean;
|
|
FMyCollection: TCollection;
|
|
FMyDouble: Double;
|
|
FMyEnum: TMyEnum;
|
|
FMyEvent: TNotifyEvent;
|
|
FMyInt64: int64;
|
|
FMyInteger: integer;
|
|
FMyPersistent: TMyPersistent;
|
|
FMySet: TMySet;
|
|
FMySingle: Single;
|
|
FMyString: string;
|
|
FMyStrings: TStrings;
|
|
FMyWideString: widestring;
|
|
public
|
|
constructor Create(TheOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure WriteDebugReport;
|
|
procedure GetChildren(Proc: TGetChildProc; Root: TComponent);
|
|
override;
|
|
published
|
|
{property MyDouble: Double read FMyDouble write FMyDouble;
|
|
property MySingle: Single read FMySingle write FMySingle;
|
|
property MyWideString: widestring read FMyWideString write FMyWideString;
|
|
property MyInteger: integer read FMyInteger write FMyInteger;
|
|
property MyString: string read FMyString write FMyString;
|
|
property MyInt64: int64 read FMyInt64 write FMyInt64;
|
|
property MySet: TMySet read FMySet write FMySet;
|
|
property MyBoolean: Boolean read FMyBoolean write FMyBoolean;
|
|
property MyEnum: TMyEnum read FMyEnum write FMyEnum;}
|
|
//property MyPersistent: TMyPersistent read FMyPersistent write FMyPersistent;
|
|
property MyCollection: TCollection read FMyCollection write FMyCollection;
|
|
//property MyStrings: TStrings read FMyStrings write FMyStrings;
|
|
property MyEvent: TNotifyEvent read FMyEvent write FMyEvent;
|
|
procedure DoSomething(Sender: TObject);
|
|
end;
|
|
|
|
{ TMyGroupBox }
|
|
|
|
TMyGroupBox = class(TComponent)
|
|
published
|
|
procedure AnEvent(Sender: TObject);
|
|
end;
|
|
|
|
|
|
{ TStreamAsPasForm }
|
|
|
|
TStreamAsPasForm = class(TComponent)
|
|
//Button1: TButton;
|
|
//SourceGroupBox: TGroupBox;
|
|
//DestinationGroupBox: TGroupBox;
|
|
//procedure FormCreate(Sender: TObject);
|
|
private
|
|
FFilename: string;
|
|
procedure SetFilename(const AValue: string);
|
|
public
|
|
MyComponent: TMyComponent;
|
|
//DemoGroupBox: TMyGroupBox;
|
|
|
|
constructor Create(AOwner: TComponent); override;
|
|
|
|
procedure WriteComponents;
|
|
procedure ReadComponents;
|
|
procedure OnFindComponentClass({%H-}Reader: TReader; const AClassName: string;
|
|
var ComponentClass: TComponentClass);
|
|
property Filename: string read FFilename write SetFilename;
|
|
end;
|
|
|
|
var
|
|
StreamAsPasForm: TStreamAsPasForm;
|
|
|
|
implementation
|
|
|
|
{ TMyGroupBox }
|
|
|
|
procedure TMyGroupBox.AnEvent(Sender: TObject);
|
|
begin
|
|
|
|
end;
|
|
|
|
{ TStreamAsPasForm }
|
|
|
|
procedure TStreamAsPasForm.SetFilename(const AValue: string);
|
|
begin
|
|
if FFilename=AValue then exit;
|
|
FFilename:=AValue;
|
|
end;
|
|
|
|
constructor TStreamAsPasForm.Create(AOwner: TComponent);
|
|
var
|
|
MySubComponent: TMyComponent;
|
|
begin
|
|
inherited Create(AOwner);
|
|
|
|
Filename:='test.xml';
|
|
|
|
MyComponent:=TMyComponent.Create(Self);
|
|
with MyComponent do begin
|
|
Name:='MyComponent';
|
|
end;
|
|
MySubComponent:=TMyComponent.Create(MyComponent);
|
|
with MySubComponent do begin
|
|
Name:='MySubComponent';
|
|
end;
|
|
|
|
{DemoGroupBox:=TMyGroupBox.Create(Self);
|
|
with DemoGroupBox do begin
|
|
Name:='DemoGroupBox';
|
|
SetBounds(100,2,320,180);
|
|
Parent:=SourceGroupBox;
|
|
OnClick:=@DemoGroupBox.AnEvent;
|
|
end;
|
|
|
|
// create nested controls
|
|
DemoGroupBox_1:=TGroupBox.Create(DemoGroupBox);
|
|
with DemoGroupBox_1 do begin
|
|
Name:='DemoGroupBox_1';
|
|
Parent:=DemoGroupBox;
|
|
SetBounds(5,5,150,150);
|
|
with TButton.Create(DemoGroupBox) do begin
|
|
Name:='Button1';
|
|
Parent:=DemoGroupBox_1;
|
|
SetBounds(10,20,80,30);
|
|
end;
|
|
with TButton.Create(DemoGroupBox) do begin
|
|
Name:='Button2';
|
|
Parent:=DemoGroupBox_1;
|
|
SetBounds(10,60,80,20);
|
|
end;
|
|
end;
|
|
DemoGroupBox_2:=TGroupBox.Create(DemoGroupBox);
|
|
with DemoGroupBox_2 do begin
|
|
Name:='DemoGroupBox_2';
|
|
Parent:=DemoGroupBox;
|
|
SetBounds(155,5,150,150);
|
|
with TButton.Create(DemoGroupBox) do begin
|
|
Name:='Button3';
|
|
Parent:=DemoGroupBox_2;
|
|
SetBounds(10,20,80,30);
|
|
end;
|
|
with TButton.Create(DemoGroupBox) do begin
|
|
Name:='Button4';
|
|
Parent:=DemoGroupBox_2;
|
|
SetBounds(10,60,80,20);
|
|
end;
|
|
end; }
|
|
|
|
WriteComponents;
|
|
ReadComponents;
|
|
end;
|
|
|
|
procedure TStreamAsPasForm.WriteComponents;
|
|
var
|
|
ms: TMemoryStream;
|
|
s: string;
|
|
begin
|
|
ms:=TMemoryStream.Create;
|
|
try
|
|
WriteComponentToPasStream(MyComponent,ms);
|
|
ms.Position:=0;
|
|
SetLength(s,ms.Size);
|
|
if s<>'' then
|
|
ms.Read(s[1],length(s));
|
|
DebugLn(['TStreamAsPasForm.WriteComponents ',s]);
|
|
finally
|
|
ms.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TStreamAsPasForm.ReadComponents;
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure TStreamAsPasForm.OnFindComponentClass(Reader: TReader;
|
|
const AClassName: string; var ComponentClass: TComponentClass);
|
|
begin
|
|
//if CompareText(AClassName,'TGroupBox')=0 then
|
|
// ComponentClass:=TGroupBox
|
|
//else if CompareText(AClassName,'TButton')=0 then
|
|
// ComponentClass:=TButton
|
|
//else
|
|
if CompareText(AClassName,'TMyComponent')=0 then
|
|
ComponentClass:=TMyComponent
|
|
else if CompareText(AClassName,'TMyGroupBox')=0 then
|
|
ComponentClass:=TMyGroupBox;
|
|
DebugLn('TStreamAsPasForm.OnFindComponentClass ',AClassName,' ',dbgs(ComponentClass));
|
|
end;
|
|
|
|
{ TMyComponent }
|
|
|
|
constructor TMyComponent.Create(TheOwner: TComponent);
|
|
begin
|
|
inherited Create(TheOwner);
|
|
FMyDouble:=-1.23456789;
|
|
FMySingle:=-1.98765432;
|
|
FMyEnum:=myEnum2;
|
|
FMySet:=[myEnum1,myEnum3];
|
|
FMyString:='Some text as string'#0'Test';
|
|
FMyWideString:='Some text as widestring';
|
|
FMyInteger:=1234;
|
|
FMyBoolean:=true;
|
|
FMyInt64:=1234567890987654321;
|
|
FMyEvent:=@DoSomething;
|
|
FMyPersistent:=TMyPersistent.Create;
|
|
FMyCollection:=TCollection.Create(TMyCollectionItem);
|
|
TMyCollectionItem(FMyCollection.Add).MyString:='First';
|
|
TMyCollectionItem(FMyCollection.Add).MyString:='Second';
|
|
TMyCollectionItem(FMyCollection.Add).MyString:='Third';
|
|
FMyStrings:=TStringList.Create;
|
|
FMyStrings.Text:='FirstLine'#10'NextLine';
|
|
end;
|
|
|
|
destructor TMyComponent.Destroy;
|
|
begin
|
|
FreeAndNil(FMyStrings);
|
|
FreeAndNil(FMyPersistent);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TMyComponent.WriteDebugReport;
|
|
var
|
|
i: Integer;
|
|
Item: TMyCollectionItem;
|
|
begin
|
|
debugln('TMyComponent.WriteDebugReport ');
|
|
debugln([' MyDouble=',FMyDouble]);
|
|
debugln([' MySingle=',FMySingle]);
|
|
debugln([' MyEnum=',GetEnumName(TypeInfo(TMyEnum),ord(FMyEnum))]);
|
|
debugln([' MySet=',HexStr(Cardinal(FMySet),8)]);
|
|
debugln([' MyString=',FMyString]);
|
|
debugln([' MyWideString=',FMyWideString]);
|
|
debugln([' MyInteger=',FMyInteger]);
|
|
debugln([' MyInt64=',FMyInt64]);
|
|
debugln([' MyCollection.Count=',FMyCollection.Count]);
|
|
for i:=0 to FMyCollection.Count-1 do begin
|
|
Item:=TMyCollectionItem(FMyCollection.Items[i]);
|
|
debugln([' ',i,' MyString=',Item.MyString]);
|
|
end;
|
|
//debugln([' MyStrings='+dbgstr(MyStrings.Text)]);
|
|
end;
|
|
|
|
procedure TMyComponent.GetChildren(Proc: TGetChildProc; Root: TComponent);
|
|
var
|
|
i: Integer;
|
|
begin
|
|
if Root=Self then
|
|
for i:=0 to ComponentCount-1 do
|
|
Proc(Components[i]);
|
|
end;
|
|
|
|
procedure TMyComponent.DoSomething(Sender: TObject);
|
|
begin
|
|
|
|
end;
|
|
|
|
{ TMyPersistent }
|
|
|
|
constructor TMyPersistent.Create;
|
|
begin
|
|
FMyInteger:=12345;
|
|
end;
|
|
|
|
end.
|
|
|