ОБСУЖДЕНИЕ

Как работать с панелями?

20 ответов 10,5 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Как известно есть возможность стыковки панелей (при раб со свойствами DockSite, dragKind, Dragmode).
Состыковать панели после запуска проекта не вызывает особых проблем, а вот как можно сделать, чтобы при запуске проекта панели уже были состыкованы (имели соответствующий вид)?
 
И в чём проблема ?

Запомнить состояние при выходе .. и при старте восстановить... что конкретно вызывает проблемы?
 
А как это можно сделать (только начинаю программировать)?
 
Ммм ...

Прробегайте по всем компонентам и сохраняете нужные Вам свойства в Ини файл или реестр или ещё куда Вам требуется..

При старте считаываете эти свойства и расставляете их Вашим компонентам...
 
Спасибо.
Собственно хотелось узнать как это реализовать ...
Покапаюсь и попробую сам разобраться.
 
Я просто не совсем улавливаю Вашу проблему... задайте пожалуйста вопрос более конкретно!

Проблема как сохранить свойство в Ини файл или как что реализовать?
 
Да, точно, Как сохранить в ини файл и потом загрузить из него.
Основная проблема при сохранении и загрузке в том, что положение и состияние состыкованных панелей не сохраниться (или я не прав?)
 
Ну вот Вам пример:

Код:
var
AIniFile: TIniFile;
begin
AIniFile := TIniFile.Create('MySettings.ini');
try
 AIniFile.WriteInteger('My data', 'Panel height', MyPanel.Height);
finally
 AIniFile.Free;
end;
end;

Восстановление аналогично...Вам надо будет присвоить вычитанные свойства нужным Вам компонентам.
 
Спасибо, попробуем ...
 
Большое спасибо за ответ, многое прояснилось

Со стыкованными панелями не помогло....

Где-то читал, что при состыковки панелей создается новый обект, который отвечат за них и хранит все новые свойства состыкованных панелей. Возможно это причина проблемы?
 
Хммм.. можете ли Вы скинуть свой кусок кода что б на него посмотреть .. тогда мы сможем датьВам более точные советы!
 
Собственно работающего кода нет. Есть код, который не приводит к нужному результату:


procedure TForm1.Button1Click(Sender: TObject);
var
AIniFile: TIniFile;
begin
AIniFile:= TIniFile.Create('config.ini');
try
AIniFile.WriteInteger('My data', 'Panel1 height', panel1.Height);
AIniFile.WriteInteger('My data', 'Panel1 Left', panel1.Left);
AIniFile.WriteInteger('My data', 'Panel1 Top', panel1.Top);
AIniFile.WriteInteger('My data', 'Panel1 Width', panel1.Width);
AIniFile.WriteInteger('My data', 'Panel1 ParentWindow', panel1.ParentWindow);
AIniFile.WriteInteger('My data', 'Panel1 BevelWidth', panel1.BevelWidth);
AIniFile.WriteInteger('My data', 'Panel1 DockClientCount', panel1.DockClientCount);
AIniFile.WriteInteger('My data', 'Panel1 LRDockWidth', panel1.LRDockWidth);
finally
AIniFile.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
AIniFile: TIniFile;

begin
AIniFile:= TIniFile.Create('config.ini');
try
panel1.Height:=AIniFile.ReadInteger('My data', 'Panel1 height', panel1.Height);
panel1.Left:=AIniFile.ReadInteger('My data', 'Panel1 Left', panel1.Left);
panel1.Top:=AIniFile.ReadInteger('My data', 'Panel1 Top', panel1.Top);
panel1.Width:=AIniFile.ReadInteger('My data', 'Panel1 Width', panel1.Width);
panel1.ParentWindow:=AIniFile.ReadInteger('My data', 'Panel1 ParentWindow', panel1.ParentWindow);
panel1.BevelWidth:=AIniFile.ReadInteger('My data', 'Panel1 BevelWidth', panel1.BevelWidth);
panel1.LRDockWidth:=AIniFile.ReadInteger('My data', 'Panel1 LRDockWidth', panel1.LRDockWidth);
finally
AIniFile.Free;
end;
end;

При запуске программы должен восстановливаться внешний вид программы, который был в момент предыдущего закрытия. Собираюсь делать это с помощью ini-файла, но что прописать в нем не знаю. а выглюдить должно это должно так (варианты состыкованные и несостыкованные):
 
Проблема ясна.. воспользуйтесь следующими методами:

DockClientCount
DockClients

Во время восстановления пользуйтесь методом Dock у конторола который хотите вдочить... также используйте DockOritntation.

Более простой способ:

Так же для простоты можете воспользоваться методами интерфейса IDockManager ... SavetoStream and LoadFromStream, они делают как р точто Вам требуется. Сохраняют и загружают расположение вдоченных объектов...
 
Да, похоже все работает.
Прописал:

//сохранение в реестр информации
procedure TForm1.Button5Click(Sender: TObject);
var
Stream: TMemoryStream;
Reg : TRegistry;
begin
Stream := TMemoryStream.Create;
Panel8.DockManager.SaveToStream(Stream);
Reg := TRegistry.Create;
Reg.OpenKey('SOFTWARE\F5\Apiray', true);
Reg.WriteInteger('DockInfoSize', Stream.Size);
Reg.WriteBinaryData('DockInfo', Stream.Memory^, Stream.Size);
end;

//счтение из реестра информации
procedure TForm1.Button6Click(Sender: TObject);
var
Stream1: TMemoryStream;
Reg : TRegistry;
begin
Stream1 := TMemoryStream.Create;
Reg := TRegistry.Create;
Reg.OpenKey('SOFTWARE\F5\Apiray', true);
Stream1.SetSize(Reg.ReadInteger('DockInfoSize');
Reg.ReadBinaryData('DockInfo', Stream1.Memory^, Stream1.Size);
Panel8.DockManager.LoadFromStream(Stream1);
end;
 
Победа :)
 
Один последний вопрос, для полного счатстья:
'SOFTWARE\F5\Apiray создается сам или его надо создавать в реестре через regedit (как я это делал)?
 
Сам он не создастся конечно :(

Но вы можете создать его программно используя класс TRegistry.

Вы это уже делаете вот этой строчкой:

Код:
Reg.OpenKey('SOFTWARE\F5\Apiray', true);
 
Интересно. и через regedit можно посмотрть его? заходил и кроме созданного мной ничего похожего не увидел, а в созданном мной 'SOFTWARE\F5\Apiray' файл без какого-либо содержания, тем не менее все работает ...
 
А смотрели в Local_Machine или Current_User ?
 
Local_Machine
 
Статус
Закрыто для дальнейших ответов.