powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / dxLayoutControl RestoreFromRegistry
25 сообщений из 54, страница 2 из 3
dxLayoutControl RestoreFromRegistry
    #39345040
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Use winrar 5, Luke
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345090
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
завтра гляну - как время найду
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345374
LayoutSaver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,
У меня с отмеченными изменениями работает

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
const
  sRegStorKeyLAC = '\Software\_MyNode\LAC\';// dxLayoutControl
  sRegStorKeySaveName = 'SaveName';// dxLayoutControl


procedure StoreLayoutControl(LayoutControl: TdxLayoutControl);
procedure RestoreLayoutControl(LayoutControl: TdxLayoutControl);
function RegistryKeyExists(const Key: string): boolean;

implementation

uses
  Registry, SysUtils;


procedure RestoreLayoutControl(LayoutControl: TdxLayoutControl);
begin
  try
    LayoutControl.BeginUpdate;

    if RegistryKeyExists(sRegStorKeyLAC + LayoutControl.Owner.ClassName +'_' + LayoutControl.Name) then
    begin
// LayoutControl.OptionsStoring.RegistryPath := sRegStorKeyLAC +LayoutControl.Owner.ClassName + '_' + LayoutControl.Name;
// LayoutControl.Restore;
      LayoutControl.Container.RestoreFromRegistry(sRegStorKeyLAC + LayoutControl.Owner.ClassName + '_' + LayoutControl.Name,sRegStorKeySaveName);
    end;

  finally
    LayoutControl.EndUpdate;
  end;
end;


procedure StoreLayoutControl(LayoutControl: TdxLayoutControl);
begin
      LayoutControl.Container.StoreToRegistry(sRegStorKeyLAC +LayoutControl.Owner.ClassName + '_' +LayoutControl.Name,True,sRegStorKeySaveName);
// LayoutControl.OptionsStoring.RegistryPath := sRegStorKeyLAC +LayoutControl.Owner.ClassName + '_' + LayoutControl.Name;
// LayoutControl.Store;
end;

...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345395
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так написали же Вам, что использовать Container - не комильфо.
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345407
LayoutSaver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

Ну, кому-то, может, и не комильфо, а меня устраивает. :)
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345413
LayoutSaver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LayoutSaver,

Там, собственно, проблема в том, что без указания StoreName компонент сохраняется с привязкой к имени овнера.
Когда начинаешь восстанавливать из такого сохранения компонент, привязаный к овнеру с другим именем, возникает твоя ошибка.
А StoreName можно указать только при сохранении через методы контейнера.
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345423
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, ждём, что сообщит на white_nigger.
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345467
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скомпилил пример в сиэттле, нормально нажимается на кнопку хоть пять раз. Запускал несколь раз. Что я должен был увидеть?
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345475
LayoutSaver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
white_nigger,

перед тем как второй раз на кнопку жамкать, ты первое окошко закрыть успел?
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345478
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerСкомпилил пример в сиэттле, нормально нажимается на кнопку хоть пять раз. Запускал несколь раз. Что я должен был увидеть?

в архиве есть скомпилированный проект, который выдает: Class TdxLayoutControlContainer not found.
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345486
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл дописать: DXE3 + Dev 2016.1.4
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345544
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оказывается закрывать не надо было...
посмотрю
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345621
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понимаю, ты хочешь сделать один паттерн в реестре, на основе которого будут выглядеть все клоны, по принципу "кто последний записал /color]- тот отец". В этом случае тебе надо принудительно указывать сохраненный объект, и действительно юзать контейнер. Что-то вроде:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
const
  PatternLayout = 'fmEdit.dxLayoutControl1';

procedure RestoreLayoutControl(LayoutControl: TdxLayoutControl);
var
  APath: string;
begin
  try
    LayoutControl.BeginUpdate;
    APath := sRegStorKeyLAC + LayoutControl.Owner.ClassName + '_' + LayoutControl.Name;
    if RegistryKeyExists(APath) then
      LayoutControl.Container.RestoreFromRegistry(APath, PatternLayout);

  finally
    LayoutControl.EndUpdate;
  end;
end;

procedure StoreLayoutControl(LayoutControl: TdxLayoutControl);
var
  APath: string;
begin
  APath := sRegStorKeyLAC + LayoutControl.Owner.ClassName + '_' + LayoutControl.Name;
  LayoutControl.Container.StoreToRegistry(APath, True, PatternLayout);
  LayoutControl.Store;
end;
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345632
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, сейчас попробую.
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345643
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда правильней так сделать?
PatternLayout := LayoutControl.Owner.ClassName + '.' + LayoutControl.Name;

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure RestoreLayoutControl(LayoutControl: TdxLayoutControl);
var
  APath, PatternLayout: string;
begin
  try
    LayoutControl.BeginUpdate;
    APath := sRegStorKeyLAC + LayoutControl.Owner.ClassName + '_' + LayoutControl.Name;
    PatternLayout := LayoutControl.Owner.ClassName + '.' + LayoutControl.Name;
    if RegistryKeyExists(APath) then
    begin
      LayoutControl.Container.RestoreFromRegistry(APath, PatternLayout);
    end;

  finally
    LayoutControl.EndUpdate;
  end;
end;



Форм (классов) разных несколько: форма редактирования, форма параметров поиска, главная форма, ещё какая-то форма.
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345645
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного удивлён, что после StoreToRegistry() надо вызывать Store.
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345651
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибок не получил. Работает.
Спасибо большое всем, кто помогал.
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345653
LayoutSaver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11, вот тебе и вся кошерность :))white_nigger действительно юзать контейнер. [/src]еще маленький совет.
не сохраняй лайоут на автомате. или, по крайней мере, сделай галочку "сохранять/не сохранять лайоут".

PS после StoreToRegistry() НЕ надо вызывать Store.
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345665
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Немного удивлён, что после StoreToRegistry() надо вызывать Store.Не надо. Это я из твоего кода выкинуть забыл :)
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345669
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LayoutSaverне сохраняй лайоут на автомате.
Тут прикол в чем: пользователь может свернуть/развернуть группу и это должно сохраниться.
Если бы настройки делились на 2 части:
1. Сохранение того, что пользователь менял с помощью дизайнера.
2. Сохранение состояния групп и того, что можно менять без дизайнера.
То тогда можно было разделить сохранение/восстановление на 2 части.
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39345875
LayoutSaver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

Я о пользователе забочусь.
Не каждый хочет ВСЕГДА сохранять лайоут при закрытии формы.
А некторые любят каждый раз с чистого листа начинать.
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39346138
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда можно сделать цикл по группам и при закрытии формы сохранять состояние: развёрнута/свёрнута. А сам лейаута сохранять только по кнопке.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
dxLayoutControl RestoreFromRegistry
    #39700828
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня опять проблема с сохранением в стрим.
Решил довести до ума: обернуть всё в класс и, т.к. компонент для сохранения несколько (cxGrid, cxVirticalGrid, dxLayoutControl, dxBarManager), но у всех есть SaveToStream, то и процедуры сохранения можно все отдельные сделать в виде одной, но при этом код сохранения в стрим вынести в отдельную процедуру.

Всё сделал, но появилась проблема: dxLayoutControl хоть и сохраняется в базу и загружается из базы без ошибок, но он пустой после восстановления и базы, т.е. все элементы попадают в "Доступные элементы", поэтому невидимы.

На сколько я понимаю, то какие-то проблемы с типами классов. Всё сделал на уровне TComponent, чтобы были свойства Parent, Owner и Name.Т.е. в главную процедуру передаю TComponent в виде параметра:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TStorage.StoreToDB(Component: TComponent);
begin
....
настройка подключения к базе, создание Tstream и т.д.
....

    StoreComponentToStream(Component, stream);// сохранение настроек в stream

...
сохранение stream в базу
....



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TStorage.StoreComponentToStream(Component: TComponent; stream: TStream);
begin 
  if Component is TdxLayoutControl then
    TdxLayoutControl(Component).SaveToStream(stream);

  if Component is TdxBarManager then
    TdxBarManager(Component).SaveToStream(stream);
...
...
...



И вот тут-то я обратил внимание, что структура(содержимое) блоб-поля в базе отлична от старого.
Вот, чтобы визуально было понятно:


Я решил проэкспериментировать и сделал для dxLayoutControl отдельную процедуру, где передавал именно TdxLayoutControl в качестве параметра, а не TComponent и проблема ушла.

Т.е. проблема таилась в типе класса передаваемого параметра?
С остальными компонентами не тестировал.

Собственно вопрос. Чтобы не городить огород с разными процедурами, где будут разные типы входящего параметра, как бы сделать так, чтобы все эти типы (компоненты): cxGrid, cxVirticalGrid, dxLayoutControl, dxBarManager нормально сохранялись в стрим и восстанавливались?

Ведь на 99% процедуры для сохранения, например, сетки cxGrid и BarManager похожи.
Может быть
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39700840
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В одном случае был layout, а в другом layout.container -- вот и причина.

Лично я использую overload и разные параметры на входе специально под разные компоненты... а внутри тот самый is... Причем надо понимать, что настройки сохраняются не все и часть данных отсутствует. Или сохранять надо только определенные вещи. В этом случае как раз и можно добавить доп поля для сохранения-загрузки типа настройки ширина панели, режима отображения или цвета.
...
Рейтинг: 0 / 0
dxLayoutControl RestoreFromRegistry
    #39700860
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiВ одном случае был layout, а в другом layout.container -- вот и причина.
Нет. Я уже переделал всё без контейнера, как и советовал white_nigger.
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / dxLayoutControl RestoreFromRegistry
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]