на нримере 
http://svn.freepascal.org/cgi-bin/viewv ... ot=lazarusглядим procedure TMainIDE.FormCreate(Sender: TObject);
там видим
- Код: Выделить всё
- DockMaster.MakeDockSite(Self,[akBottom],admrpChild);//делаем главную форму докабельной
 DockMaster.OnCreateControl:=@DockMasterCreateControl;//сообщаем докмастеру какая процедура будет создавать окна
 DockMaster.OnShowOptions:=@ShowAnchorDockOptions;//не обязательно, указываем процедуру создания окна опций докинга
>>DockMaster.OnCreateControl:=@DockMasterCreateControl
процедура создания окон выделена отдельно, и будет вызываться DockMaster`ом по необходимости, а не тобой.
далее идет показ нескольких окошек
- Код: Выделить всё
- ViewSrcEditor1ToolButtonClick(Self);//открываем окно редактора
 ViewMessagesToolButtonClick(Self);//открываем окно сообщений
 ViewOIToolButtonClick(Self);//открываем окно инспектора
 ViewFPDocEditorToolButtonClick(Self);//открываем окно еще какойто хрени
код показа вынесен в отдельные методы, т.к. используется еще гдето, например в меню. он везде одинаковый, рассмотрим на примере показа SrcEditor.
- Код: Выделить всё
- procedure TMainIDE.ViewSrcEditor1ToolButtonClick(Sender: TObject);
 begin
 DockMaster.ShowControl('SourceEditor1',true);
 end;
т.е. тупо говорим докмастеру - покожи чтото с названием 'SourceEditor1' и true - на переднем плане.
И вот тут в потрохах докмастера происходит вызов переданой ранее ему процедуры DockMasterCreateControl. а там:
- Код: Выделить всё
- procedure TMainIDE.DockMasterCreateControl(Sender: TObject; aName: string; var
 AControl: TControl; DoDisableAutoSizing: boolean);
 
 procedure CreateForm(Caption: string; NewBounds: TRect);
 begin
 AControl:=CreateSimpleForm(aName,Caption,NewBounds,DoDisableAutoSizing);
 end;
 
 begin
 if aName='CodeExplorer' then
 CreateForm('Code Explorer',Bounds(700,230,100,250))
 else if aName='FPDocEditor' then
 CreateForm('FPDoc Editor',Bounds(200,720,300,100))
 else if aName='Messages' then
 CreateForm('Messages',Bounds(230,650,350,100))
 else if aName='ObjectInspector' then
 CreateForm('Object Inspector',Bounds(10,200,100,350))
 else if aName='SourceEditor1' then
 CreateForm('Source Editor 1',Bounds(230,200,400,400))
 else if aName='SourceEditor2' then
 CreateForm('Source Editor 2',Bounds(260,230,350,350))
 else if aName='ProjectInspector' then
 CreateForm('Project Inspector',Bounds(10,230,150,250))
 else if aName='DebugOutput' then
 CreateForm('Debug Output',Bounds(400,400,350,150));
 end;
Т.е. в зависимости от переданого имени определенным образом создаются нужные формы, и им присваивается инициальное положение (это положение работает только в "несклееном" состоянии)
"определенный образ" заключается в "хитром" создании, связано с уменьшением мельканий и дерганий при создании в склееном состоянии:
- Код: Выделить всё
- function CreateSimpleForm(Name, Title: string; NewBounds: TRect;
 DisableAutoSizing: boolean): TSimpleForm;
 begin
 // first check if the form already exists
 // the LCL Screen has a list of all existing forms.
 // Note: Remember that the LCL allows as form names only standard
 // pascal identifiers and compares them case insensitive
 Result:=TSimpleForm(Screen.FindForm(Name));
 if Result is TSimpleForm then begin
 if DisableAutoSizing then
 Result.DisableAutoSizing;
 exit;
 end;
 
 // create it
 Result:=TSimpleForm(TSimpleForm.NewInstance);
 Result.DisableAutoSizing;
 Result.Create(Application);
 Result.Caption:=Title;
 Result.Name:=Name;
 Result.Memo1.Lines.Text:=Name;
 Result.BoundsRect:=NewBounds;
 if not DisableAutoSizing then
 Result.EnableAutoSizing;
 end;
Добавлено спустя 2 минуты 48 секунд:Все эти "мучения" чтобы иметь возможность загрузить и сразу показать сохраненную раскладку окон