powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание Datamodule при создании формы (во фрейме)
20 сообщений из 20, страница 1 из 1
Создание Datamodule при создании формы (во фрейме)
    #40057408
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нубский вопрос. Может даже не по uniGUI, а по ООП и Delphi. Уж не кидайтесь камнями
Есть фрейм (форма редактирования объявления) и есть модуль данных с наборами данных.
Фрейм может быть создан несколько раз, т.е. разные экземпляры одного типа, но в зависимости от вида объявления, нужно показывать те или иные поля, например, Цена1 или Цена2.
Есть поле у фрейма для datamodule
Код: pascal
1.
2.
private
    dm: TDmEditObjects;// datamodule


при создании фрейма создается и модуль данных
Код: pascal
1.
dm := TDmEditObjects.Create(self);



и вот тут проблема: когда создается второй фрейм, то при создании модуля данных он не создается, а переменная dm получает тут первый, ранее созданный модуль данных. А должно быть 2 разных экземпляра модуля данных.
Т.е. на каждый фрейм свой экземпляр модуля данных.

Как это сделать?
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057410
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
когда создается второй фрейм, то при создании модуля данных он не создается, а переменная dm получает тут первый, ранее созданный модуль данных.
Не может такого быть! Больше похоже на то, что у тебя db-aware компоненты привязаны к глобальной переменной в юните этого датамодуля. Поэтому ты видишь не то, что должен. Так что привязывай компоненты в коде...
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057411
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в датамодуле нет глобальной переменной

P.S. у фрейма тоже нет глобальной переменной
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057412
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ради эксперимента сделал на фрейме кнопку
Код: pascal
1.
2.
3.
4.
5.
procedure TfrdParentEditObj.UniToolButton2Click(Sender: TObject);
begin
  inherited;
  dm.qTypes.Close;
end;



создаю 2 фрейма
нажимаю ее у второго фрейма, и переключаюсь на первый и вижу, что LookupCombobox, привязанный к qTypes пустой, т.е. датасет закрыт
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057414
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ищи ошибку. Если у тебя датамодуль не реализован в виде синглтона, то должно нормально работать всё. Сказок не бывает.
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057416
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нету синглтона.
И фрейм тоже не синглтон.

я сам в шоке
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057435
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, так.
Пришлось добавить уникальность имени
Код: pascal
1.
DM.Name := 'dmmEditObjects' + self.Name;



Я так понял, что визуальные элементы цеплялись по имени к уже существующему модулю.
Но я не понимаю, ведь переменная объявлена в секции private
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057441
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
X11 просто фанат фреймов.
По иному ты не можешь писать код ?
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057447
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в uniGUI удобнее именно так
кстати их мега-демо, который всё в одном именно на фреймах и построен
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057450
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
и вот тут проблема: когда создается второй фрейм, то при создании модуля данных он не создается, а переменная dm получает тут первый, ранее созданный модуль данных.

Я думаю, что ты нам бессовестно лжёшь Если выполняется строка dm := TDmEditObjects.Create(self) (то есть на неё можно поставить брейкпоинт, и выполнение на неё придёт), то новый модуль данных таки создаётся. Это можно проконтролировать в отладчике, засунув в watch выражение pointer(dm). Чтобы добиться такого поведения, как ты говоришь, нужно перекрывать метод NewInstance, чего в твоём модуле данных, я уверен, никто не делал.

Есть другой эффект, который, скорее всего, и происходит. У модуля данных есть свойство Name. Когда создаётся первый модуль данных, оно получает значение "dmEditObjects". Когда создаётся второй модуль данных, в Self уже есть компонент с именем dmEditObjects - поэтому свойство Name нового модуля устанавливается в dmEditObjects_1. Когда создаётся третий - в dmEditObjects_2 итп. А вот теперь надо понять, как работает сериализация. В твоём фрейме используются компоненты из модуля данных. В dfm это записано примерно так: Datasource = dmEditObjects.Query123. Когда фрейм создаётся, парсер читает dfm, доходит до этой ссылки, ищет компонент с именем "dmEditObjects", находит, ищет в нём компонент с именем "Query123", снова находит - и в результате все фреймы, сколько бы их ни было, оказываются завязаны на первый из созданных модулей данных. Как следствие, они показывают одно и то же и ты интерпретируешь это как "создаётся только один модуль".

Последний вопрос - как избавиться от этой проблемы и сделать всё как надо. Тут есть варианты. Самые тупые разработчики откажутся от использования модулей данных и будут создавать все запросы кодом в ран-тайме либо побросают их на фрейм. Чуть более адекватные - создадут модуль данных, после чего руками привяжут все ссылки на него, примерно так:

Код: pascal
1.
2.
3.
4.
...
dm := TDmEditObjects.Create(self);
GridView.DataController.DataSource := dm.dsQuery123;
...



Ну а правильный метод очевиден, если прочитать предыдущий рассказ: нужно создать модуль данных, дать фрейму инициализироваться (прочитать и проинтерпретировать dfm) и после этого убрать у модуля свойство Name:

Код: pascal
1.
dm.Name := '';



Тогда следующий созданный модуль данных снова получит имя DmEditObjects, фрейм правильно привяжется и всё будет в порядке.

Для того, чтобы сбрасывать это свойство, удобнее всего доопределить у фрейма метод Loaded и делать там это присваивание после inherited.
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057455
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerПоследний вопрос - как избавиться от этой проблемы и сделать всё как надо. Тут есть варианты. Самые тупые разработчики откажутся от использования модулей данных и ... побросают их на фрейм. Чуть более адекватные - создадут модуль данных, после чего руками привяжут все ссылки на него
Всегда было интересно - а чем лучше "умный правильный адекватный"
метод "тупого бросания их на фрейм" (ну кроме патологических случаев
когда компонентов 148)?

Про контейнеры невизуальных компонент молчу, это вопрос сбоку.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057456
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

спасибо

как я уже написал, дело в name
но все же... экземпляр живет ведь в секции private или это все (видимость) касается лишь редактора кода, а в исполняемом скомпилированном файле нет никаких private/public и т.д.?
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057457
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Самые тупые разработчики откажутся от использования модулей данных


я не согласен
ибо нужно смотреть на каждый частный случай
например, зачем создавать модуль данных для одного единственного набора данных?
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057458
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
экземпляр живет ведь в секции private

Экземпляр живёт в оперативной памяти, по какому-то адресу. Указатель на экземпляр живёт в секции private. Другой указатель на экземпляр живёт в списке Self.Components (где Self - тот компонент, который передаётся как Owner в модуль данных). Вся сериализация идёт через второй указатель. Первый можно вообще грохнуть, и это ни на что не повлияет (ну, точнее, повлияет только на те строки программного кода, которые к нему прямо обращаются. если их нет, то программа отлично будет компилироваться и работать и без него).

X11
а в исполняемом скомпилированном файле нет никаких private/public и т.д.?

Конечно.
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057459
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
а чем лучше "умный правильный адекватный" метод

Ровно тем же, чем отделить Class1 от Class2, а Unit1 от Unit2 лучше, чем держать их вместе. Если ты не сторонник подхода "всегда делать любое приложение в одном файле", то, наверное, сам ощущаешь, когда лучше разделить.
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057559
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
переключаюсь на первый и вижу, что LookupCombobox, привязанный к qTypes пустой, т.е. датасет закрыт
Как к LookupCombobox привязывается qTypes?
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057560
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак.
Я имел ввиду TUniDBLookupComboBox.
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057563
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Никак.
Если комбобокс не привязан к датасету, то какие ты хочешь увидеть у него данные?
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057565
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer> Ровно тем же, чем отделить Class1 от Class2,
softwarer> а Unit1 от Unit2 лучше, чем держать их вместе.

Это не ответ. В Class1/Unit1 должно быть то, что относится
к ним, а в Class2/Unit2 должно быть то, что относится к ним.
Возвращаясь к конкретному вопросу - откуда категоричная
уверенность, что "токмо DataModule, без него никак, иначе
разработчики тупые" ?

P.S. Поскольку формулировка была несколько другая -
уточняю - именно так оно и воспринимается, когда кто-то
говорит "самые тупые разработчики побросают на фрейм".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Создание Datamodule при создании формы (во фрейме)
    #40057692
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Это не ответ.

Это ответ на тот вопрос, который ты задал.

Гаджимурадов Рустам
откуда категоричная уверенность, что "токмо DataModule, без него никак, иначе
разработчики тупые" ?

Не знаю. Ты это придумал - ты и скажи, откуда она.

Гаджимурадов Рустам
P.S. Поскольку формулировка была несколько другая - уточняю - именно так оно и воспринимается, когда кто-то говорит "самые тупые разработчики побросают на фрейм".

Я отвечаю за то, что я сказал, но не отвечаю за то, что вы услышали. В вопросе модуль данных задан как исходное - то есть, он нужен, или, по крайней мере, автор считает, что нужен. Разработчика, который откажется от модуля данных там, где он нужен, и побросает на фрейм потому, что кривизна рук не позволяет сделать нормально, я считаю... не очень грамотным, назовём так.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание Datamodule при создании формы (во фрейме)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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