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

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

ты хочешь сказать, что: если создать проект-пустышку, то все равно три раза срабатывает? Или все же где-то что-то спрятано?...
...
Рейтинг: 0 / 0
24.02.2020, 10:34
    #39930141
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
Хм... в пустышке норм.... один раз срабатывает.
Но проблемный проект сложнее, там три наследованных фрейма.
Попробую ещё потестировать.
...
Рейтинг: 0 / 0
24.02.2020, 14:41
    #39930210
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
Не знаю, может глупость напишу...
Интересно, а связана ли моя проблема с тем, что сам набор 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
24.02.2020, 15:27
    #39930225
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
Новый эксперимент.
На последнем (дочернем) фрейме создал новый набор 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
24.02.2020, 15:57
    #39930236
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
X11
но сетку оставил старую

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

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

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


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

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


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

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

и вне фреймов тоже. Чудес не бывает: где - то может быть ссылка связанная с элементом фрейма. Отключать надо все, что хоть как то связано с фреймом
...
Рейтинг: 0 / 0
27.02.2020, 12:04
    #39931580
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
Ещё один эксперимент.
Фрейм-одиночка. Т.е. унаследован только у системного фрейма 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
27.02.2020, 12:24
    #39931604
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UniQuery - при открытии событие DataSource.OnDataChange срабатывает 3 раза
X11
Всё равно 2 раза срабатывает

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


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