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

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

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

Barmutik

И в чём проблема ?

Запомнить состояние при выходе .. и при старте восстановить... что конкретно вызывает проблемы?
 
G

Guest

А как это можно сделать (только начинаю программировать)?
 
B

Barmutik

Ммм ...

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

При старте считаываете эти свойства и расставляете их Вашим компонентам...
 
G

Guest

Спасибо.
Собственно хотелось узнать как это реализовать ...
Покапаюсь и попробую сам разобраться.
 
B

Barmutik

Я просто не совсем улавливаю Вашу проблему... задайте пожалуйста вопрос более конкретно!

Проблема как сохранить свойство в Ини файл или как что реализовать?
 
G

Guest

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

Barmutik

Ну вот Вам пример:

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

Восстановление аналогично...Вам надо будет присвоить вычитанные свойства нужным Вам компонентам.
 
G

Guest

Большое спасибо за ответ, многое прояснилось

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

Где-то читал, что при состыковки панелей создается новый обект, который отвечат за них и хранит все новые свойства состыкованных панелей. Возможно это причина проблемы?
 
B

Barmutik

Хммм.. можете ли Вы скинуть свой кусок кода что б на него посмотреть .. тогда мы сможем датьВам более точные советы!
 
G

Guest

Собственно работающего кода нет. Есть код, который не приводит к нужному результату:


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-файла, но что прописать в нем не знаю. а выглюдить должно это должно так (варианты состыкованные и несостыкованные):
 
B

Barmutik

Проблема ясна.. воспользуйтесь следующими методами:

DockClientCount
DockClients

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

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

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

Guest

Да, похоже все работает.
Прописал:

//сохранение в реестр информации
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;
 
G

Guest

Один последний вопрос, для полного счатстья:
'SOFTWARE\F5\Apiray создается сам или его надо создавать в реестре через regedit (как я это делал)?
 
B

Barmutik

Сам он не создастся конечно :(

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

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

Код:
Reg.OpenKey('SOFTWARE\F5\Apiray', true);
 
G

Guest

Интересно. и через regedit можно посмотрть его? заходил и кроме созданного мной ничего похожего не увидел, а в созданном мной 'SOFTWARE\F5\Apiray' файл без какого-либо содержания, тем не менее все работает ...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!