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

Тема в разделе "Delphi - FAQ", создана пользователем -, 7 май 2005.

Статус темы:
Закрыта.
  1. Гость

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

    Barmutik Гость

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

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

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

    Barmutik Гость

    Ммм ...

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

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

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

    Barmutik Гость

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

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

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

    Barmutik Гость

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

    Код (Text):
    var
    AIniFile: TIniFile;
    begin
    AIniFile := TIniFile.Create('MySettings.ini');
    try
     AIniFile.WriteInteger('My data', 'Panel height', MyPanel.Height);
    finally
     AIniFile.Free;
    end;
    end;
    Восстановление аналогично...Вам надо будет присвоить вычитанные свойства нужным Вам компонентам.
     
  9. Гость

    Спасибо, попробуем ...
     
  10. Гость

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

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

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

    Barmutik Гость

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

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


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

    [​IMG]
    [​IMG]
     
  13. Barmutik

    Barmutik Гость

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

    DockClientCount
    DockClients

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

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

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

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

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

    Barmutik Гость

    Победа :)
     
  16. Гость

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

    Barmutik Гость

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

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

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

    Код (Text):
    Reg.OpenKey('SOFTWARE\F5\Apiray', true);
     
  18. Гость

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

    Barmutik Гость

    А смотрели в Local_Machine или Current_User ?
     
  20. Гость

    Local_Machine
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей