Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Save и Load состояния Docked форм


Автор: kami 7.1.2011, 19:40
Доброго времени суток, дамы и господа!

Имею следующий вопрос: для Drag&Dock (в D7) использую JVCL (JvDockServer&JvDockClient). Понравились простотой использования (о чем еще мечтать - бросил на форму и всё, пользуйся) и быстротой работы (в отличие от стандартного примера в Delphi, достаточно тормозящего при перемещении форм). Причем "ручные" манипуляции идут через стандартные функции типа ManualDock.

Собственно, что хотелось бы - при завершении работы приложения сохранять положение и "Dock-статус" форм, а при следующем запуске восстанавливать их состояние и положение.

Как сотворить подобное? DRKB молчит, отсылая к DockManager, а он в Runtime = nil на dock-нутых формах... Документации по JVCL ващпе кот наплакаль...

Автор: Snowy 7.1.2011, 21:47
Сохранять куда?
Для сохранения состояний формы вполне подойдет метод TStream.WriteComponent(Form1);
Ну и аналогичная загрузка TStream.ReadComponent(Form1);
В качестве стрима можешь использовать, например, TFileStream.
Код
  with TFileStream.Create(FileName, fmCreate) do // сохраняем
  try
    WriteComponent(Form1);
  finally
    Free;
  end;
  
  // .... 
  
  while Form1.ControlCount > 0 do Form1.Controls[0].Free; // грузим
  with TFileStream.Create(FileName, fmOpenRead) do
  try
    ReadComponent(Form1);
  finally
    Free;
  end;
Замечание - код загрузки нельзя использовать из эвента контрола формы, т.к. все контролы уничтожаются перед загрузкой.
Эвенты самой формы использовать можно - она остается нетронутой. Разве что размеры и положение возьмутся из файла.
Сохраняемый файл имеет бинарную dfm структуру. Используя BinToHex, можно превратить его в обычный dfm.

Автор: kami 7.1.2011, 22:53
Цитата(Snowy @  7.1.2011,  21:47 Найти цитируемый пост)
Сохранять куда?

Да без разницы. TFileStream более чем подойдет.
Наверное, я плохо объяснил, что мне нужно...

Цитата(Snowy @  7.1.2011,  21:47 Найти цитируемый пост)
Для сохранения состояний формы вполне подойдет метод TStream.WriteComponent(Form1);

Не подошло. Вернее, подошло, но не совсем...
Сделал 2 дочерние формы, за-Dock-ил их так.
user posted image
Что за окно, на котором они лежат, и как достучаться до него через jvcl - без понятия :(  (WinSpectorом пока не ковырял)
Сохранил (WriteComponent(fm)) *2.
При следующей загрузке загрузил (ReadComponent(fm))*2. И - само собой, получил это:
user posted image
То, что между окнами - это главное окно Delphi виднеется...

А хотелось бы, как на первой картинке... И я знаю, что это возможно (вот только - как?) - Delphi восстанавливает при загрузке проекта положение и Dock-состояние всех своих окон.

Автор: northener 8.1.2011, 03:42
Когда-то ребята создавшие RxLib  делали что-то подобное.
Сейчас стоит посмотреть в сторону JEDI.

Автор: kami 8.1.2011, 09:02
Цитата(northener @  8.1.2011,  03:42 Найти цитируемый пост)
Сейчас стоит посмотреть в сторону JEDI.

Дык я их и использую...
Вроде, нашел - у создателей jvcl хоть help и страдает на обе ноги, но демки неплохие. Есть у них функции LoadDockTreeFromAppStorage/SaveDockTreeToAppStorage. Вроде, то что мне нужно. Буду ковырять smile

Автор: Frees 17.6.2011, 13:39
Цитата(kami @  8.1.2011,  12:02 Найти цитируемый пост)
 Вроде, то что мне нужно. Буду ковырять 

Если не трудно, поделись что наковырял.

Автор: kami 17.6.2011, 20:18
Цитата(Frees @  17.6.2011,  13:39 Найти цитируемый пост)
Если не трудно, поделись что наковырял.

Увы - ничего не наковырял. Проект нужно было делать срочно, посему ввиду того, что все docked-формы создаются динамически, причем - только по клику пользователя, это дело было заброшено. By default оставлена возможность сделать dock, но без сохранения состояния.

Автор: xkor 9.7.2011, 00:54
неужели процедуры SaveDockTreeToFile и LoadDockTreeFromFile в модуле JvDockControlForm так и не нашли?

Автор: Frees 9.7.2011, 14:54
Цитата(xkor @  9.7.2011,  03:54 Найти цитируемый пост)
неужели процедуры SaveDockTreeToFile и LoadDockTreeFromFile в модуле JvDockControlForm так и не нашли?

они работают если все формы созданы и для всего приложения сразу - в общем корявая заготовка не универсальное решение, требуют переделки...

Автор: xkor 9.7.2011, 20:45
Frees, ну это да, но там переделывать в принципе немного, мне когда надо было за пару часов подправил

Автор: kami 9.7.2011, 22:24
Цитата(xkor @  9.7.2011,  20:45 Найти цитируемый пост)
но там переделывать в принципе немного, мне когда надо было за пару часов подправил

Так выложи код, помоги.

Автор: Frees 9.7.2011, 23:47
Цитата(xkor @  9.7.2011,  23:45 Найти цитируемый пост)
Frees, ну это да, но там переделывать в принципе немного, мне когда надо было за пару часов подправил

менял исходники jedi? мне так нельзя...
а SaveDockTreeToFile и LoadDockTreeFromFile это даже не методы... в общем, решил не ездить на кривой козе вокруг кривых jedi

Автор: xkor 10.7.2011, 11:01
Цитата(kami @  9.7.2011,  22:24 Найти цитируемый пост)
Так выложи код, помоги. 

боюсь он не сохранился, для доков я уже стал использовать DevExpress компоненты, а jedi обновил до новой версии и за ненадобностью уже не правил...

Автор: kami 10.7.2011, 14:59
Цитата(xkor @  10.7.2011,  11:01 Найти цитируемый пост)
боюсь он не сохранился

Хм.
И смысла было поднимать эту тему из небытия? Чтобы сказать 
Цитата(xkor @  9.7.2011,  20:45 Найти цитируемый пост)
мне когда надо было
 ?

Я очень рад за Вас, что Вы справились с задачей, когда Вам надо было. 
Но вот некоторое время назад было надо мне. 
В принципе, можно сказать что и сейчас надо. 
Большое спасибо Вам за содержательные ответы и неоценимую помощь в вопросе, заданном в форуме "Для новичков".

Dixi.

Автор: xkor 13.7.2011, 13:14
kami, ну когда я поднимал я думал что вам хватит оригинальных SaveDockTreeToFile и LoadDockTreeFromFile. Ну а дальше да, уже лишнего сказал...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)