на нримере
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 секунд:Все эти "мучения" чтобы иметь возможность загрузить и сразу показать сохраненную раскладку окон