dockmanager example: experimental LoadFromStream/SaveToStream - not yet working

git-svn-id: trunk@22782 -
This commit is contained in:
dodi 2009-11-26 04:30:08 +00:00
parent dfb5d67e48
commit 5474500b31
8 changed files with 312 additions and 105 deletions

View File

@ -33,14 +33,14 @@
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="40">
<Units Count="42">
<Unit0>
<Filename Value="MakeSite.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="MakeSite"/>
<CursorPos X="51" Y="18"/>
<TopLine Value="1"/>
<UsageCount Value="87"/>
<UsageCount Value="96"/>
</Unit0>
<Unit1>
<Filename Value="fmastersite.pas"/>
@ -48,32 +48,31 @@
<ComponentName Value="MasterSite"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="fMasterSite"/>
<CursorPos X="1" Y="51"/>
<TopLine Value="23"/>
<CursorPos X="1" Y="52"/>
<TopLine Value="28"/>
<EditorIndex Value="0"/>
<UsageCount Value="87"/>
<UsageCount Value="96"/>
<Loaded Value="True"/>
</Unit1>
<Unit2>
<Filename Value="..\package\umakesite.pas"/>
<UnitName Value="uMakeSite"/>
<CursorPos X="1" Y="247"/>
<TopLine Value="214"/>
<CursorPos X="39" Y="289"/>
<TopLine Value="207"/>
<EditorIndex Value="3"/>
<UsageCount Value="77"/>
<Bookmarks Count="2">
<Item0 X="1" Y="165" ID="1"/>
<Item1 X="1" Y="275" ID="2"/>
<UsageCount Value="81"/>
<Bookmarks Count="1">
<Item0 X="1" Y="331" ID="2"/>
</Bookmarks>
<Loaded Value="True"/>
</Unit2>
<Unit3>
<Filename Value="..\..\..\lcl\controls.pp"/>
<UnitName Value="Controls"/>
<CursorPos X="15" Y="1242"/>
<TopLine Value="1218"/>
<EditorIndex Value="9"/>
<UsageCount Value="42"/>
<CursorPos X="15" Y="1790"/>
<TopLine Value="1767"/>
<EditorIndex Value="10"/>
<UsageCount Value="46"/>
<Loaded Value="True"/>
</Unit3>
<Unit4>
@ -95,10 +94,10 @@
</Unit5>
<Unit6>
<Filename Value="..\..\..\..\..\lazarus\fpc\2.2.4\source\rtl\objpas\classes\classesh.inc"/>
<CursorPos X="3" Y="1458"/>
<TopLine Value="1468"/>
<CursorPos X="15" Y="822"/>
<TopLine Value="798"/>
<EditorIndex Value="6"/>
<UsageCount Value="16"/>
<UsageCount Value="20"/>
<Loaded Value="True"/>
</Unit6>
<Unit7>
@ -110,7 +109,7 @@
<UnitName Value="fClientForm"/>
<CursorPos X="10" Y="38"/>
<TopLine Value="12"/>
<UsageCount Value="87"/>
<UsageCount Value="96"/>
</Unit7>
<Unit8>
<Filename Value="..\..\..\lcl\include\winapih.inc"/>
@ -133,10 +132,13 @@
<Unit11>
<Filename Value="..\package\easydocksite.pas"/>
<UnitName Value="EasyDockSite"/>
<CursorPos X="3" Y="303"/>
<TopLine Value="301"/>
<CursorPos X="1" Y="1011"/>
<TopLine Value="988"/>
<EditorIndex Value="4"/>
<UsageCount Value="41"/>
<UsageCount Value="45"/>
<Bookmarks Count="1">
<Item0 X="1" Y="1051" ID="1"/>
</Bookmarks>
<Loaded Value="True"/>
</Unit11>
<Unit12>
@ -145,7 +147,7 @@
<CursorPos X="17" Y="647"/>
<TopLine Value="624"/>
<EditorIndex Value="1"/>
<UsageCount Value="37"/>
<UsageCount Value="41"/>
<Loaded Value="True"/>
</Unit12>
<Unit13>
@ -188,7 +190,7 @@
<CursorPos X="1" Y="14"/>
<TopLine Value="1"/>
<EditorIndex Value="2"/>
<UsageCount Value="39"/>
<UsageCount Value="43"/>
<Loaded Value="True"/>
</Unit18>
<Unit19>
@ -197,10 +199,10 @@
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="fDockBook"/>
<CursorPos X="1" Y="132"/>
<TopLine Value="121"/>
<EditorIndex Value="7"/>
<UsageCount Value="37"/>
<CursorPos X="1" Y="271"/>
<TopLine Value="236"/>
<EditorIndex Value="8"/>
<UsageCount Value="41"/>
<Loaded Value="True"/>
</Unit19>
<Unit20>
@ -276,8 +278,8 @@
<Filename Value="..\..\..\lcl\include\application.inc"/>
<CursorPos X="1" Y="2076"/>
<TopLine Value="2053"/>
<EditorIndex Value="8"/>
<UsageCount Value="22"/>
<EditorIndex Value="9"/>
<UsageCount Value="26"/>
<Loaded Value="True"/>
</Unit30>
<Unit31>
@ -297,7 +299,7 @@
<CursorPos X="41" Y="168"/>
<TopLine Value="145"/>
<EditorIndex Value="5"/>
<UsageCount Value="13"/>
<UsageCount Value="17"/>
<Loaded Value="True"/>
</Unit33>
<Unit34>
@ -305,32 +307,32 @@
<UnitName Value="LCLProc"/>
<CursorPos X="1" Y="2109"/>
<TopLine Value="2086"/>
<EditorIndex Value="10"/>
<UsageCount Value="12"/>
<EditorIndex Value="11"/>
<UsageCount Value="16"/>
<Loaded Value="True"/>
</Unit34>
<Unit35>
<Filename Value="..\..\..\..\..\lazarus\fpc\2.2.4\source\rtl\objpas\sysutils\sysstrh.inc"/>
<CursorPos X="29" Y="123"/>
<TopLine Value="123"/>
<EditorIndex Value="11"/>
<UsageCount Value="12"/>
<EditorIndex Value="12"/>
<UsageCount Value="16"/>
<Loaded Value="True"/>
</Unit35>
<Unit36>
<Filename Value="..\..\..\..\..\lazarus\fpc\2.2.4\source\rtl\objpas\sysutils\sysstr.inc"/>
<CursorPos X="11" Y="915"/>
<TopLine Value="914"/>
<EditorIndex Value="12"/>
<UsageCount Value="12"/>
<EditorIndex Value="13"/>
<UsageCount Value="16"/>
<Loaded Value="True"/>
</Unit36>
<Unit37>
<Filename Value="..\..\..\..\..\lazarus\fpc\2.2.4\source\rtl\objpas\sysutils\sysformt.inc"/>
<CursorPos X="12" Y="115"/>
<TopLine Value="97"/>
<EditorIndex Value="13"/>
<UsageCount Value="12"/>
<EditorIndex Value="14"/>
<UsageCount Value="16"/>
<Loaded Value="True"/>
</Unit37>
<Unit38>
@ -347,120 +349,143 @@
<TopLine Value="53"/>
<UsageCount Value="10"/>
</Unit39>
<Unit40>
<Filename Value="..\..\..\..\..\lazarus\fpc\2.2.4\source\rtl\objpas\classes\streams.inc"/>
<CursorPos X="3" Y="654"/>
<TopLine Value="621"/>
<EditorIndex Value="7"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit40>
<Unit41>
<Filename Value="..\..\..\lcl\lclmessageglue.pas"/>
<UnitName Value="LCLMessageGlue"/>
<CursorPos X="1" Y="109"/>
<TopLine Value="86"/>
<UsageCount Value="10"/>
</Unit41>
</Units>
<JumpHistory Count="28" HistoryIndex="26">
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="..\package\fdockbook.pas"/>
<Caret Line="143" Column="1" TopLine="119"/>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="990" Column="1" TopLine="967"/>
</Position1>
<Position2>
<Filename Value="..\package\fdockbook.pas"/>
<Caret Line="144" Column="1" TopLine="120"/>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="994" Column="1" TopLine="971"/>
</Position2>
<Position3>
<Filename Value="..\package\fdockbook.pas"/>
<Caret Line="145" Column="1" TopLine="121"/>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="997" Column="1" TopLine="974"/>
</Position3>
<Position4>
<Filename Value="..\package\fdockbook.pas"/>
<Caret Line="146" Column="1" TopLine="122"/>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="999" Column="1" TopLine="976"/>
</Position4>
<Position5>
<Filename Value="..\package\fdockbook.pas"/>
<Caret Line="147" Column="1" TopLine="123"/>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="1008" Column="1" TopLine="985"/>
</Position5>
<Position6>
<Filename Value="..\package\fdockbook.pas"/>
<Caret Line="148" Column="1" TopLine="124"/>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="1009" Column="1" TopLine="986"/>
</Position6>
<Position7>
<Filename Value="..\package\fdockbook.pas"/>
<Caret Line="143" Column="1" TopLine="119"/>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="1010" Column="1" TopLine="987"/>
</Position7>
<Position8>
<Filename Value="..\package\fdockbook.pas"/>
<Caret Line="151" Column="5" TopLine="119"/>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="1011" Column="1" TopLine="988"/>
</Position8>
<Position9>
<Filename Value="..\package\ffloatingsite.pas"/>
<Caret Line="88" Column="19" TopLine="58"/>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="296" Column="1" TopLine="273"/>
</Position9>
<Position10>
<Filename Value="..\package\ffloatingsite.pas"/>
<Caret Line="75" Column="1" TopLine="62"/>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="304" Column="1" TopLine="281"/>
</Position10>
<Position11>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="374" Column="68" TopLine="351"/>
<Caret Line="305" Column="1" TopLine="282"/>
</Position11>
<Position12>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="402" Column="7" TopLine="391"/>
<Caret Line="306" Column="1" TopLine="283"/>
</Position12>
<Position13>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="267" Column="18" TopLine="259"/>
<Caret Line="289" Column="1" TopLine="266"/>
</Position13>
<Position14>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="165" Column="10" TopLine="143"/>
<Caret Line="290" Column="1" TopLine="267"/>
</Position14>
<Position15>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="164" Column="18" TopLine="143"/>
<Caret Line="291" Column="1" TopLine="268"/>
</Position15>
<Position16>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="144" Column="52" TopLine="143"/>
<Caret Line="292" Column="1" TopLine="269"/>
</Position16>
<Position17>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="62" Column="25" TopLine="44"/>
<Caret Line="293" Column="1" TopLine="270"/>
</Position17>
<Position18>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="220" Column="20" TopLine="212"/>
<Caret Line="294" Column="1" TopLine="271"/>
</Position18>
<Position19>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="268" Column="24" TopLine="243"/>
<Caret Line="295" Column="1" TopLine="272"/>
</Position19>
<Position20>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="327" Column="1" TopLine="281"/>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="1006" Column="1" TopLine="983"/>
</Position20>
<Position21>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="558" Column="27" TopLine="521"/>
<Caret Line="1008" Column="1" TopLine="985"/>
</Position21>
<Position22>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="240" Column="1" TopLine="225"/>
<Caret Line="1009" Column="1" TopLine="986"/>
</Position22>
<Position23>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="278" Column="1" TopLine="254"/>
<Caret Line="1010" Column="1" TopLine="987"/>
</Position23>
<Position24>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="242" Column="19" TopLine="208"/>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="1011" Column="1" TopLine="988"/>
</Position24>
<Position25>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="265" Column="1" TopLine="219"/>
<Caret Line="296" Column="1" TopLine="273"/>
</Position25>
<Position26>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="257" Column="25" TopLine="234"/>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="309" Column="1" TopLine="286"/>
</Position26>
<Position27>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="247" Column="22" TopLine="213"/>
<Caret Line="310" Column="1" TopLine="287"/>
</Position27>
<Position28>
<Filename Value="..\package\easydocksite.pas"/>
<Caret Line="303" Column="3" TopLine="301"/>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="311" Column="1" TopLine="288"/>
</Position28>
<Position29>
<Filename Value="fmastersite.pas"/>
<Caret Line="52" Column="1" TopLine="28"/>
</Position29>
<Position30>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="274" Column="1" TopLine="251"/>
</Position30>
</JumpHistory>
</ProjectOptions>
<CompilerOptions>
@ -478,6 +503,16 @@
</Other>
</CompilerOptions>
<Debugging>
<BreakPoints Count="2">
<Item1>
<Source Value="fmastersite.pas"/>
<Line Value="52"/>
</Item1>
<Item2>
<Source Value="..\package\umakesite.pas"/>
<Line Value="306"/>
</Item2>
</BreakPoints>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>

View File

@ -32,6 +32,7 @@ object MasterSite: TMasterSite
Top = 48
Width = 75
Caption = 'buSave'
OnClick = buSaveClick
TabOrder = 2
end
object buRestore: TButton

View File

@ -18,6 +18,7 @@ type
procedure buCreateFormClick(Sender: TObject);
procedure buDumpClick(Sender: TObject);
procedure buRestoreClick(Sender: TObject);
procedure buSaveClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
ms: TMemoryStream;
@ -46,10 +47,18 @@ begin
end;
procedure TMasterSite.buRestoreClick(Sender: TObject);
begin
if ms <> nil then
DockMaster.LoadFromStream(ms);
end;
procedure TMasterSite.buSaveClick(Sender: TObject);
begin
if ms = nil then
ms := TMemoryStream.Create;
DockMaster.LoadFromStream(ms);
ms := TMemoryStream.Create
else
ms.Clear;
DockMaster.SaveToStream(ms);
end;
procedure TMasterSite.FormCreate(Sender: TObject);

View File

@ -17,7 +17,7 @@
<Description Value="EasyDocking Manager and Notebook"/>
<License Value="LGPL"/>
<Version Major="1"/>
<Files Count="13">
<Files Count="10">
<Item1>
<Filename Value="easydocksite.pas"/>
<UnitName Value="EasyDockSite"/>
@ -56,21 +56,9 @@
<UnitName Value="uMiniRestore"/>
</Item9>
<Item10>
<Filename Value="fpageframe.lfm"/>
<Type Value="LFM"/>
</Item10>
<Item11>
<Filename Value="fpageframe.lrs"/>
<Type Value="LRS"/>
</Item11>
<Item12>
<Filename Value="fpageframe.pas"/>
<UnitName Value="fPageFrame"/>
</Item12>
<Item13>
<Filename Value="umakesite.pas"/>
<UnitName Value="uMakeSite"/>
</Item13>
</Item10>
</Files>
<Type Value="RunAndDesignTime"/>
<RequiredPkgs Count="2">

View File

@ -8,7 +8,7 @@ interface
uses
EasyDockSite, fDockBook, fFloatingSite, fElasticSite, uMiniRestore,
fPageFrame, uMakeSite, LazarusPackageIntf;
uMakeSite, LazarusPackageIntf;
implementation

View File

@ -248,6 +248,7 @@ type
{$ENDIF}
constructor Create(ADockSite: TWinControl); override;
destructor Destroy; override;
procedure DumpToStream(Stream: TStream);
procedure PaintSite(DC: HDC); override;
procedure SetStyle(NewStyle: TEasyHeaderStyle);
function GetEffectiveStyle: TEasyHeaderStyle;
@ -286,6 +287,10 @@ uses
Themes, LResources,
LCLproc; //debugging
type
TWinControlAccess = class(TWinControl)
end;
const
{$IFDEF restore}
HeaderButtons = [zpCloseButton, zpRestoreButton];
@ -751,11 +756,6 @@ end;
{$ELSE}
{$ENDIF}
procedure TEasyTree.LoadFromStream(Stream: TStream);
begin
//todo
end;
procedure TEasyTree.MessageHandler(Sender: TControl; var Message: TLMessage);
//was: procedure TEasyTree.MouseMessage(var Message: TLMessage);
var
@ -955,7 +955,121 @@ begin
FDockSite.Invalidate; //force repaint of headers
end;
type
RZone = packed record
BottomRight: TPoint;
Level: byte;
Orientation: TDockOrientation;
//Width, Height: word;
NameLen: byte; //+chars
end;
var
ZoneRec: RZone;
ZoneName: string;
procedure TEasyTree.SaveToStream(Stream: TStream);
procedure DoSaveZone(Zone: TEasyZone; Level: byte);
var
child: TControl;
begin
//fill ZoneRec
ZoneRec.Level := Level;
ZoneRec.Orientation := Zone.Orientation;
ZoneRec.BottomRight := Zone.BR;
child := Zone.ChildControl;
if child = nil then
ZoneName := ''
else
ZoneName := child.Name;
ZoneRec.NameLen := Length(ZoneName);
//write descriptor
Stream.Write(ZoneRec, sizeof(ZoneRec));
if ZoneRec.NameLen > 0 then
Stream.Write(ZoneName[1], ZoneRec.NameLen);
{ TODO -oDoDi : WritePages of notebook }
// recurse into first child
if Zone.FirstChild <> nil then
DoSaveZone(Zone.FirstChild, Level + 1); //all children of Level
// recurse into next sibling
if Zone.NextSibling <> nil then
DoSaveZone(Zone.NextSibling, Level); //all siblings of Level
end;
begin
// write top zone data
//Stream.Write(FTopXYLimit, SizeOf(FTopXYLimit));
//WriteLimits(FTopZone);
// write all zones from tree
DoSaveZone(FTopZone, 1);
//write end marker (dummy record of level 0)
ZoneRec.Level := 0;
ZoneRec.NameLen := 0;
Stream.Write(ZoneRec, sizeof(ZoneRec));
end;
procedure TEasyTree.LoadFromStream(Stream: TStream);
function GetRec: integer;
var
NameLen: integer;
begin
Stream.Read(ZoneRec, SizeOf(ZoneRec));
NameLen := ZoneRec.NameLen;
if NameLen > 0 then begin
SetLength(ZoneName, NameLen);
Stream.Read(ZoneName[1], NameLen);
end;
Result := ZoneRec.Level;
end;
procedure MakeZone(InZone: TEasyZone; Level: byte);
var
NewZone, PrevZone: TEasyZone;
NewCtl: TControl;
fSkip: boolean;
begin
//ZoneRec has been read before
NewZone := InZone; //in case this level's zones are skipped
PrevZone := nil; //add as first child
while ZoneRec.Level >= Level do begin
if ZoneRec.Level = Level then begin
//create zone at Level in InZone
if ZoneRec.NameLen > 0 then begin
TWinControlAccess(DockSite).ReloadDockedControl(ZoneName, NewCtl);
fSkip := NewCtl = nil;
end else
fSkip := False;
if not fSkip then begin
//sibling = child of InZone
NewZone := TEasyZone.Create(self);
NewZone.Orientation := ZoneRec.Orientation;
NewZone.BR := ZoneRec.BottomRight;
NewZone.ChildControl := NewCtl;
InZone.InsertAfter(PrevZone, NewZone);
PrevZone := NewZone;
end;
//else skip zone without control - at Level!?
GetRec;
end else begin // > Level, create children
//child = child of last added zone
MakeZone(NewZone, Level+1);
end;
end; //until GetRec < Level;
end;
begin
//read record
if GetRec > 0 then begin
FTopZone.BR := ZoneRec.BottomRight;
MakeZone(FTopZone, 1);
end;
//finish?
end;
procedure TEasyTree.DumpToStream(Stream: TStream);
var
r: TRect;
s: string;

View File

@ -265,7 +265,11 @@ begin
//Dock(nil);
end;
//Release; //Close;
{$IFDEF WIN32}
PostMessage(Self.Handle, WM_CLOSE, 0, 0);
{$ELSE}
//how to close from within an event handler?
{$ENDIF}
end;
//update the host dock site and its DockManager
if HostDockSite <> nil then begin

View File

@ -208,6 +208,15 @@ begin
end;
end;
type
RSiteRec = packed record
Bounds: TRect;
NameLen: byte; //+name
end;
var
SiteRec: RSiteRec;
SiteName: string;
procedure TDockMaster.LoadFromStream(Stream: TStream);
var
ctl, pre: TControl;
@ -220,6 +229,15 @@ var
ctl := CreateDockable('', True, False);
end;
function ReadSite: boolean;
begin
Stream.Read(SiteRec, sizeof(SiteRec));
Result := SiteRec.Bounds.Right > 0;
SetLength(SiteName, SiteRec.NameLen);
if Result and (SiteRec.NameLen > 0) then
Stream.Read(SiteName[1], SiteRec.NameLen);
end;
begin
(* Restore a layout.
- Create all ElasticSites (to come)
@ -234,6 +252,7 @@ Notebooks?
Ownership?
When notebooks are dockable, they cannot be owned by the DockSite!
*)
{$IFDEF old}
//Test0;
site := TFloatingSite.Create(self);
MakeForm; ctl.ManualDock(site, nil, alClient);
@ -248,11 +267,48 @@ Notebooks?
MakeForm; ctl.ManualDock(site, nb, alCustom);
MakeForm; ctl.ManualDock(site, nb, alCustom);
end;
{$ELSE}
{$ENDIF}
//restore all DockSites
//all floating sites
while ReadSite do begin
site := TFloatingSite.Create(self);
site.Name := SiteName;
site.BoundsRect := SiteRec.Bounds;
site.DockManager.LoadFromStream(Stream);
end;
//all ElasticSites - to come
end;
procedure TDockMaster.SaveToStream(Stream: TStream);
begin
procedure SaveSite(Site: TWinControl);
begin
(* what if a site doesn't have an DockManager?
*)
SiteRec.Bounds := Site.BoundsRect;
SiteName := Site.Name;
SiteRec.NameLen := Length(SiteName);
Stream.Write(SiteRec, sizeof(SiteRec));
if SiteName <> '' then
Stream.Write(SiteName[1], Length(SiteName));
Site.DockManager.SaveToStream(Stream);
end;
var
i: integer;
cmp: TComponent;
wc: TWinControl absolute cmp;
begin
for i := 0 to ComponentCount - 1 do begin
cmp := Components[i];
if (cmp is TWinControl) and wc.DockSite then
SaveSite(wc);
end;
//end marker
SiteRec.Bounds.Right := -1;
SiteRec.NameLen := 0;
Stream.Write(SiteRec, sizeof(SiteRec));
end;
function TDockMaster.ReloadForm(const AName: string): TCustomForm;