powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TdxLayoutControl.SaveToStream сохраняет имя формы :(
40 сообщений из 40, показаны все 2 страниц
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763614
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема в том, что одна и та же форма создается несколько раз и с разными именами. Например форма просмотра или редактирования товара может быть открыта пользователем 2-3-5 раз.
Предисловие.

К примеру, вот так она объявлена:
Код: pascal
1.
TfmEdit = class(TForm)



перед implementation удалена строка
Код: pascal
1.
2.
Var
fmEdit : TfmEdit;// нет этой строки


но есть процедура, которая создает форму
Код: pascal
1.
2.
3.
4.
procedure CallEditForm(id: integer);
...
....
fmEdit := TfmEdit.Create(fmMain);



В итоге создаётся несколько форм с именами "fmEdit", "fmEdit_1", "fmEdit_2", "fmEdit_3" и т.д.

Я посмотрел, что сохраняет метод dxLayoutControl1.SaveToStream(stream).
Там сохраняется "fmEdit.dxLayoutControlFrmAdd".
Т.е. получается, что когда восстанавливается форма "fmEdit_1", то она оказывается пустая.

Как заставить TdxLayoutControl не обращать внимание на имя формы при сохранении или при загрузке?
Данные сохраняюся в стрим и далее в базу.

Спасибо.
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763618
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или как заставить использовать что-то своё вместо имени?
Например, вместо имени fmEdit, чтобы использовался класс TfmEdit. Ведь класс у всех одинаковых форм один и тот же.
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763623
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты не создавай новую форму, если уже переменная fmEdit определёна
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763641
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не обсуждается.
Пользователь хочет открыть 2 разных товара на форме просмотра.
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763644
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут есть решение
https://www.devexpress.com/Support/Center/Question/Details/Q350646/how-to-exclude-form-name-in-tdxlayoutcontrol-savetoinifile

но существующие, записанные в базу данные уже нельзя будет использовать


т.е. теперь в базу нужно сохранять всё заново :(
Код: pascal
1.
LayoutControl.Container.StoreToStream(stream, LayoutControl.Name);



и пересоздавать всё то, что пользователь "надизайнил" с формами
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763661
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Код: pascal
1.
2.
3.
4.
procedure CallEditForm(id: integer);
...
....
fmEdit := TfmEdit.Create(fmMain);


Попробуй в конце процедуры создания сам переименовывать название формы уникальным инкрементным именем.
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763672
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так в том-то и дело, что имя должно быть не уникальным
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763674
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763677
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11так в том-то и дело, что имя должно быть не уникальным
Поменять имя формы на уникальное уже ПОСЛЕ загрузки настроек.
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763683
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. создать вторую форму с именем fmEdit, загрузить настройки, а потом переименовать?
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763684
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эхх...
Юзай dxLayoutControl1.Container.StoreToIniFile/RestoreFromIniFile
Последним параметром укажешь нужное имя X11"fmEdit", "fmEdit_1", "fmEdit_2", "fmEdit_3" и т.д.
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763686
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

это я уже понял, но в этом проблема :(
X11пересоздавать всё то, что пользователь "надизайнил" с формами

нельзя использовать существующие наработки
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763696
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11нельзя использовать существующие наработкиНе совсем понял. В каком формате сохранены данные? Приведи пример проблемы
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763706
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первом сообщении привел.
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763713
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется, что структура программы изначально неправильная.Зачем создавать кучу форм??? Для отображения каких то данных

Не легче ли было бы в одной форме, загружать данные с нужного элемента. Типа окно в окне (Panel, и типа такого) которое открыто по середине. И показывает специфики товара и так далее. А область под окном затемнена

Ну если ты выполняешь заказ какого - то, клиента так скажем. То это его не продуманность, что он пошёл корявой дорожкой

Конечно же можно, добавлять товар в сравнения и в этой же форме выводить определённые характеристики как это сделано в яндекс маркете в таблице
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763726
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11т.е. теперь в базу нужно сохранять всё заново :(
и пересоздавать всё то, что пользователь "надизайнил" с формами
Добро пожаловать в мир костылей.
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763728
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот что придумал.
В новой версии программы нужно определять, что использовать:
LayoutControl.LoadFromStream()
или
LayoutControl.Container.RestoreFromStream()

т.е. в базу(в таблицу с блобом) нужно добавить новое поле, где будет храниться версия и если версия пустая, то это старая версия данных и там есть имя формы, а значит нужно применять LayoutControl.LoadFromStream(), а если там, например, цифра 1, то это уже новая версия данных без имени формы и нужно применять LayoutControl.Container.RestoreFromStream().
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763729
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11В первом сообщении привел.Мать... чем конкретно Container.StoreTo/RestoreFrom не подходит?
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763734
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А просто проанализировать первые несколько символов стрима не судьба?
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763749
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerX11В первом сообщении привел.Мать... чем конкретно Container.StoreTo/RestoreFrom не подходит?

я ж написал: пользователь уже надизайнил формочек, поэтому
Container.RestoreFrom() не загружает то, что было сохранено методом Layout.SaveToStream(stream);
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763751
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger, да, тоже уже подумал об этом
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39763754
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сигнатуре стрима определяй что передавать в LayoutControl.Container.RestoreFromStream в последнем параметре. Его можно применять в обоих случаях.
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39764008
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что такое сигнатура стрима?
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39764072
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Это и есть первых несколько байтов в потоке. Как у архивов например.
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39764089
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. их надо скопировать в StringStream и проверить, если там что-то похожее на имя формы?
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39764158
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Т.е. их надо скопировать в StringStream и проверить, если там что-то похожее на имя формы?
Товарищ, почему спрашиваете, не вы ли писали:

X11Там сохраняется "fmEdit.dxLayoutControlFrmAdd".
?
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39764521
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, сделал так.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function LoadStreamToStr(stream: TStream; count: integer): String;
var
  Bytes: TBytes;
begin
  Result:= '';

  if Stream.Size > 0 then
  begin
    SetLength(Bytes, count);
    Stream.Read(Bytes[0], count);
  end;

  Result := TEncoding.ASCII.GetString(Bytes);
end;



В процедуре загрузки данных из стрима получаем первые 100 символов этого стрима для поиска названия формы
Код: pascal
1.
s := LoadStreamToStr(stream, 100);



проверяем
Код: pascal
1.
2.
if s.Contains(LayoutControl.Owner.Name) then
есть имя формы в сигнатуре стрима
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39764545
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

добавьте в метод RestoreFromStream строку stream.Position := 0;
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39764594
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function GetNName(fSrc: TStream): string;
var
  fSavedPos: Integer;
  fStrPos: Integer;
begin
  SetLength(Result, 17);
  fSavedPos := fSrc.Position;
  fStrPos := 0;
  try
    fSrc.Position := 0;
    repeat
      inc(fStrPos);
      if fStrPos > Length(Result) then
        SetLength(Result, Length(Result) + 42);
      if fSrc.Read(Result[fStrPos], SizeOf(Char)) < SizeOf(Char) then Break;
    until Result[fStrPos] = '.';
    SetLength(Result, fStrPos - 1);
  finally
    fSrc.Position := fSavedPos;
  end;
end;
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39764765
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я правильно понимаю, что не обязательно мне использовать LayoutControl.BeginUpdate, т.к. в методе TdxLayoutContainer.RestoreFrom уже есть BeginUpdate?
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39764767
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фэйтл Эра, почему именно 17?
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39764775
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Фэйтл Эра, почему именно 17?
Очень удобно: простое число, легко запимнить как натуральный логарифм от 24154952,753575298214775.
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39765963
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь похожая проблема с TcxPropertiesStore. Сохраняю размеры и положение окна (формы).

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    cxPropertiesStore1.StorageName := Form.ClassName;
    cxPropertiesStore1.StorageType := stStream;

    with TcxPropertiesStoreComponent(cxPropertiesStore1.Components.Add) do
    begin
      Component := form;
      for I := 0 to Length(APropsForm) - 1 do
        Properties.Add(APropsForm[i]);
    end;//with

     cxPropertiesStore1.StorageStream := Stream;
     cxPropertiesStore1.StoreTo;
     q.ParamByName('STREAM').LoadFromStream(Stream);
     q.ExecQuery;



вот пример того, что сохраняется в базу: ...fmClientAdd....TcxPropertiesStoreComponent.....Top...

когда пользователь просматривает информацию, он открывает более одной формы fmClientAdd и получается, как я выше писал: fmClientAdd, fmClientAdd_1, fmClientAdd_2 и т.д. и cxPropertiesStore не применяет настройки окна.
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39768654
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39768656
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
    with TcxPropertiesStoreComponent(cxPropertiesStore1.Components.Add) do
    begin
      Component := form;
      Component.Name := '';
      for I := 0 to Length(APropsForm) - 1 do
        Properties.Add(APropsForm[i]);
    end;//with



вроде работает
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39769219
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Код: pascal
1.
Component.Name := '';



Нет, так нельзя, тогда меняется имя и у самой формы :(
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39769335
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Нет, так нельзя, тогда меняется имя и у самой формы :(Не смотрел но... а восстановить имя после не судьба?
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39769346
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я стормозил
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39769424
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

не останавливайся, пожалуйста. :)
...
Рейтинг: 0 / 0
TdxLayoutControl.SaveToStream сохраняет имя формы :(
    #39770700
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, кому пригодится.
У TdxBarManager нужно менять/удалять и потом восстанавливать TdxBarManager.owner.name.

Хорошо, если бы разработчики в будущем добавили какое-нибудь свойство, чтобы имя формы не влияло. Может быть даже, чтобы и имя компоненты не влияло. Или дать возможность самим управлять "именем" при сохранении в стрим.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TdxLayoutControl.SaveToStream сохраняет имя формы :(
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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