powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
15 сообщений из 15, страница 1 из 1
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39930040
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стандартный вариант master - detail.
Использую событие OnDataChange у MasterDataSource, чтобы переоткрыть детальный НД.
При начальном открытии это событие срабатывает три раза.
Потом, когда переходишь по записям, уже единоразово.

Как быть в таких случаях?
Проверки на MasterUniQuery.Active и MasterUniQuery.RecordCount не помогают.
Т.е. получается, что OnDataChange три раза срабатывает уже после открытия MasterUniQuery.
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39930134
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

ты хочешь сказать, что: если создать проект-пустышку, то все равно три раза срабатывает? Или все же где-то что-то спрятано?...
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39930141
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... в пустышке норм.... один раз срабатывает.
Но проблемный проект сложнее, там три наследованных фрейма.
Попробую ещё потестировать.
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39930210
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, может глупость напишу...
Интересно, а связана ли моя проблема с тем, что сам набор TUniQuery+TDataSoutce+сетка лежат на родительском (первом) фрейме. Всего их три: родительский, промежуточный и рабочий (дочерний).
На дочернем фрейме этот набор из трех компонент как бы дублируется, т.е. всего получается как бы три набора, если можно так выразиться.

Событие TDataSoutce.OnDataChange живет в промежуточном фрейме.
И сам код UniQuery.Close/Open тоже в промежуточном. В дочернем фрейме (пока что) нет никакого кода, там только в UniQuery.SQL вставлен запрос к базе.

В пером родительском и в конечном фреймах кода в события OnDataChange нету. Т.е. весь код на 99% в промежуточном фрейме.

Сделал такой тест. В промежуточный фрейм (TfrdParentTest) добавил счётчик.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure TfrdParentTest.actOpenUpdateExecute(Sender: TObject);
begin
  inherited;
  FCountDS := 0;// обнулить счётчик

  qData.Close;
...
добавление параметров, построение SQL запроса
...
  qData.Open;

  ShowMessage(FCountDS.ToString);// выдает 2
end;

procedure TfrdParentTest.dsDataDataChange(Sender: TObject; Field: TField);
begin
  inherited;

  if qData.Active then
    inc(FCountDS);//увеличиваем счётчик
end;



На всякий случай поискал ".Open" в модуле. Встречается только один раз.
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39930225
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый эксперимент.
На последнем (дочернем) фрейме создал новый набор UniQuery + DataSource, но сетку оставил старую, т.е. ту, что тянется из самого первого родительского фрейма.


Код: 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.
  private
    FCountDS1: Integer;

    { Private declarations }
  public
    { Public declarations }
  end;

var
  frdParentTest: TfrdParentTest;

implementation

{$R *.dfm}

procedure TfrdParentTest.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  inherited;

  if UniQuery1.Active then
      inc(FCountDS1);
end;

procedure TfrdParentTest.UniToolButton13Click(Sender: TObject);
begin
  inherited;
  FCountDS1 := 0;
  UniQuery1.Close;
  UniQuery1.Open;
  ShowMessage(FCountDS1.ToString);
end;



В итоге ShowMessage показывает всё равно "2".

И вот ещё. Не понимаю, откуда в событии и зачем там "inherited", если DataSource1 нет на предыдущих (родительских) фреймах? Так и должно быть?
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39930236
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
но сетку оставил старую

Ошибся. Я вообще сетку не подключал.
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39930237
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перенес UniQuery + DataSource в модуль данных. т.е. уже без фреймов. Всё равно два раза.
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39930365
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

ставь бряк и по колл-стэку смотри откуда и почему вызовы идут. можно попробовать дополнительно включить debug dcu, иногда помогает.
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39930544
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот смотрю я на три скриншота callstack, но толку с того. Я же не знаю досконально, должны ли те или иные процедуры/функции вызываться.
Т.е. для меня на снимках нет ничего необычного.
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39930647
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Отключай по-блочно функционал, связанный с фреймом, пока не достигнешь одного вызова. Старый, надежный, дедовский способ.
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39930650
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Перенес UniQuery + DataSource в модуль данных. т.е. уже без фреймов. Всё равно два раза.


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

ну ок, ещё раз перепроверю.
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39930654
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
X11
Перенес UniQuery + DataSource в модуль данных. т.е. уже без фреймов. Всё равно два раза.


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

ну ок, ещё раз перепроверю.

и вне фреймов тоже. Чудес не бывает: где - то может быть ссылка связанная с элементом фрейма. Отключать надо все, что хоть как то связано с фреймом
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39931580
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё один эксперимент.
Фрейм-одиночка. Т.е. унаследован только у системного фрейма TfrdSessions = class(TUniFrame).
К DataSource привязан ClientDataSet.
Всё равно 2 раза срабатывает

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TfrdSessions.dsSessionsDataChange(Sender: TObject; Field: TField);
begin
  if cdsSessions.Active then
    inc(ccc);
end;

procedure TfrdSessions.actOpenUpdateExecute(Sender: TObject);
begin
  if not ReadMonitorUsers(true) then
    exit;

  ccc := 0;
  GetSessions;
  UniStatusBar1.Panels[0].Text := ccc.ToString;
end;
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39931604
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Всё равно 2 раза срабатывает

вернее 3
...
Рейтинг: 0 / 0
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
    #39931630
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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