Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
Почему DataSource.OnDataChange выполняется 2 раза при открытии формы?
Сама процедура, содержащая запрос и его открытие, выполняется один раз на OnShow формы, и после этого OnDataChange - 2 раза.
На открытой форме уже при движении курсора по записям выполняется только один раз для каждой записи.
Нельзя ли сократить количество вызовов процедуры OnDataChange до 1 раза? В ней висит открытие дочерних сеток, и они открываются по нескольку раз, что очень замедляет создание и открытие формы.

Сообщение было отредактировано: 8 фев 21, 16:27
8 фев 21, 16:30    [22277517]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52445
svnvlad
В ней висит открытие дочерних сеток

Неудачный выбор ивента. И неудачный способ открытия дочерних запросов. Пересади на
OnAfterScroll и запросы открывай только после вменяемого таймера (1 секунда - нормально).

PS: Посмотри как сделан штатный механизм master-detail в FIB+, например.

Сообщение было отредактировано: 8 фев 21, 16:52
8 фев 21, 16:52    [22277541]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
Dimitry Sibiryakov
Пересади на OnAfterScroll
Который не срабатывает при открытии пустого датасета.
8 фев 21, 16:58    [22277546]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52445
И, соответственно, не вызывает открытие пустых дочерних запросов. Именно то, что надо.
8 фев 21, 17:00    [22277552]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
Dimitry Sibiryakov
Именно то, что надо.
При условии, что изначально дочерние датасеты были закрыты
8 фев 21, 17:07    [22277559]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
cptngrb
Member

Откуда:
Сообщений: 663
т.е. если датасет пустой и событие не будут вызывано, то нужно проверять пустой он или нет и принудительно закрывать дочерние
8 фев 21, 17:16    [22277570]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
Dimitry Sibiryakov
svnvlad
В ней висит открытие дочерних сеток

Неудачный выбор ивента. И неудачный способ открытия дочерних запросов. Пересади на
OnAfterScroll и запросы открывай только после вменяемого таймера (1 секунда - нормально).

PS: Посмотри как сделан штатный механизм master-detail в FIB+, например.

Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке.
8 фев 21, 17:41    [22277606]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
cptngrb
Member

Откуда:
Сообщений: 663
svnvlad, что то напутал, у меня один раз. Может у тебя какие-то события на форме затрагивают AfterScroll ?
8 фев 21, 17:43    [22277609]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1769
svnvlad
Dimitry Sibiryakov
пропущено...

Неудачный выбор ивента. И неудачный способ открытия дочерних запросов. Пересади на
OnAfterScroll и запросы открывай только после вменяемого таймера (1 секунда - нормально).

PS: Посмотри как сделан штатный механизм master-detail в FIB+, например.

Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке.

Тебе про таймер тоже написали.
8 фев 21, 17:46    [22277613]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
ъъъъъ
svnvlad
пропущено...

Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке.

Тебе про таймер тоже написали.

Но я же не знаю заранее, сколько времени будет создаваться форма. Сделаю 1 секунду, а там записей на 5 секунд, и пойдет каждую из 1000 записей открывать дочерние сетки. Да даже 100 уже много. А если сделать больше таймер, то лишняя пауза.
8 фев 21, 17:50    [22277620]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
ъъъъъ
svnvlad
пропущено...

Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке.

Тебе про таймер тоже написали.

А чем OnDataChange не нравится. По учебнику ее используют.
8 фев 21, 17:51    [22277621]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1769
svnvlad
ъъъъъ
пропущено...

Тебе про таймер тоже написали.

Но я же не знаю заранее, сколько времени будет создаваться форма. Сделаю 1 секунду, а там записей на 5 секунд, и пойдет каждую из 1000 записей открывать дочерние сетки. Да даже 100 уже много. А если сделать больше таймер, то лишняя пауза.

Хрень пишешь.
8 фев 21, 17:52    [22277624]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1769
svnvlad
ъъъъъ
пропущено...

Тебе про таймер тоже написали.

А чем OnDataChange не нравится. По учебнику ее используют.

Делай. Но с таймером.
8 фев 21, 17:53    [22277625]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
ъъъъъ
svnvlad
пропущено...

А чем OnDataChange не нравится. По учебнику ее используют.

Делай. Но с таймером.

В событии пишем
Timer1.Enabled := false; // Чтобы на каждую запись он сбрасывал истекшее время и начинал заново
Timer1.Enabled := true;

А в событии OnTimer пишем
Timer1.Enabled := false;
*** вызов дочерней сетки ***

Правильно?
8 фев 21, 18:08    [22277654]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1769
svnvlad,

да.
8 фев 21, 18:40    [22277673]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
Softologic
Member

Откуда: Питер
Сообщений: 244
svnvlad
ъъъъъ
пропущено...

Делай. Но с таймером.

В событии пишем
Timer1.Enabled := false; // Чтобы на каждую запись он сбрасывал истекшее время и начинал заново
Timer1.Enabled := true;


А в событии OnTimer пишем
Timer1.Enabled := false;
*** вызов дочерней сетки ***


Правильно?

Да, я также у себя делал. Рабочая схема
8 фев 21, 19:31    [22277697]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
Можно ли запихать ADQuery.Open в Thread, чтобы вообще ничего не препятствовало скроллингу? Сейчас иногда происходит затык, если в момент скроллинга начала перерисовываться нижняя сетка. Или будут проблемы с Synchronize?
9 фев 21, 04:04    [22277810]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1769
svnvlad
Можно ли запихать ADQuery.Open в Thread, чтобы вообще ничего не препятствовало скроллингу? Сейчас иногда происходит затык, если в момент скроллинга начала перерисовываться нижняя сетка. Или будут проблемы с Synchronize?

Про таймер же написали.
9 фев 21, 04:14    [22277811]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
istrebitel
Member

Откуда:
Сообщений: 123
Решал проблему в табеле сотрудников. Хотелось отображать фото, но если делать на AfterScroll то всё очень медленно, при контекстном поиске AfterScroll срабатывает на каждую запись, да и просто фото довольно тяжёлые, для того чтобы запрашивать на каждую запись при быстром скролинге.
Решение.
Заводите переменные "Запрашиваемый ключ", "Текущий отображаемый ключ" и "Время установки запрашиваемого ключа".
Заводите таймер, у меня на 200 миллисекунд, в котором проверяете, что запрашиваемый отличается от текущего.
В AfterScroll устанавливаете "Запрашиваемый ключ" и "Время установки запрашиваемого ключа".
В таймере проверяете если "Запрашиваемый ключ" <> "Текущий отображаемый ключ" и прошла дельта времени, то делаете свою работу (переоткрываете detail датасеты), устанавливаете "Текущий отображаемый ключ" := "Запрашиваемый ключ". Работает довольно неплохо.
+ Код
procedure Tfrm1CTimeSheet.dbgCtrlColEnter(Sender: TObject);
begin
  inherited;
  dbgCtrlCellSelectionChanged;
end;

procedure Tfrm1CTimeSheet.mtCtrlCrossAfterScrollEv(DataSet: TDataSet);
begin
  dbgCtrlCellSelectionChanged;
end;

procedure Tfrm1CTimeSheet.dbgCtrlCellSelectionChanged;
var
  Col :TColumnEh;
  dv :TDynVarEh;
begin
  if not mtCtrlCross.IsEmpty and not mtCtrlCrossWorker.IsNull
    then FRequestCtrlDetailWorkerId := mtCtrlCrossWorker.AsInteger
    else FRequestCtrlDetailWorkerId := 0;
  Col := dbgCtrl.Columns[dbgCtrl.Col-1];
  dv := Col.DynProps.FindDynVar(cstDvDateColumn);
  if (dv <> nil)
    then FRequestCtrlDetailDate := dv.AsDateTime
    else FRequestCtrlDetailDate := 0;
  FRequestCtrlDetailReqTime := Now();
end;

procedure Tfrm1CTimeSheet.tmrRefreshDetailsTimer(Sender: TObject);
begin
  inherited;
  RefreshCtrlDetails;
end;

procedure Tfrm1CTimeSheet.RefreshCtrlDetails;
begin
  if ((FRequestCtrlDetailWorkerId <> FCurrentCtrlDetailWorkerId) or (FRequestCtrlDetailDate <> FCurrentCtrlDetailDate))
    and (MilliSecondsBetween(FRequestCtrlDetailReqTime, Now()) >= tmrRefreshDetails.Interval div 2) then
  begin
    if (FRequestCtrlDetailWorkerId <> FCurrentCtrlDetailWorkerId) then
    begin
      if (FRequestCtrlDetailWorkerId > 0) and FCtrlPhotoVisible then
      begin
        fdqCtrlPhoto.ParamByName('work_id').AsInteger := FRequestCtrlDetailWorkerId;
        if fdqCtrlPhoto.Active
          then fdqCtrlPhoto.Refresh
          else fdqCtrlPhoto.Open;
      end else
        fdqCtrlPhoto.Close;
    end;

    FCurrentCtrlDetailWorkerId := FRequestCtrlDetailWorkerId;
    FCurrentCtrlDetailDate := FRequestCtrlDetailDate;
  end;
end;

Если зажать стрелку вниз или PageDown, то скролинг будет работать быстро, а детейлы обновятся после остановки.
9 фев 21, 06:59    [22277818]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
ъъъъъ
svnvlad
Можно ли запихать ADQuery.Open в Thread, чтобы вообще ничего не препятствовало скроллингу? Сейчас иногда происходит затык, если в момент скроллинга начала перерисовываться нижняя сетка. Или будут проблемы с Synchronize?

Про таймер же написали.

Сделал уже. Если момент скроллинга попадает на начало перерисовки нижней сетки, то происходит зависание до конца перерисовки. Раньше на каждую запись зависало, теперь только в этом случае.
9 фев 21, 07:27    [22277823]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
istrebitel
Решал проблему в табеле сотрудников.
Если зажать стрелку вниз или PageDown, то скролинг будет работать быстро, а детейлы обновятся после остановки.

Преимущество перед таймером, что не надо ждать секунду до перерисовки?
Или если у вас тоже таймер, то в чем отличие от просто таймера на OnDataChange?

Сообщение было отредактировано: 9 фев 21, 07:24
9 фев 21, 07:29    [22277824]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
istrebitel
Member

Откуда:
Сообщений: 123
svnvlad
Преимущество перед таймером, что не надо ждать секунду до перерисовки?

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

svnvlad
Или если у вас тоже таймер, то в чем отличие от просто таймера на OnDataChange?

Да в принципе тоже самое вид сбоку. Просто у меня там 2 различающихся события: изменился сотрудник - надо обновить и фото и проходы, изменилась дата - обновляем только проходы. И я подстелил соломки, думал задать разные дельты времени ожидания, для фото побольше, но и так хорошо работает.
9 фев 21, 08:16    [22277830]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
istrebitel
svnvlad
Преимущество перед таймером, что не надо ждать секунду до перерисовки?

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

Это вы про Thread что ли?
Наиболее сильное зависание происходит именно на команде ADQuery.Open на дочерней сетке, потому что там медленный запрос. Сама отрисовка происходит быстро. Или без разницы, все равно Thread не получится?
9 фев 21, 08:37    [22277833]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
istrebitel
Member

Откуда:
Сообщений: 123
В теории надо померить сколько занимает ответ от БД, и сколько отрисовка. Если (и скорее всего) подтупливает ответ, то как вариант делать запрос в потоке.
Просто сделать DataSet.Open внутри другого потока, наверно, не получится, т.к. датасет будет генерировать события, которые грид будет пытаться отрисовать. Можно конечно попробовать Disable/EnableControls, но думаю всё равно AV будет сыпать. Как вариант можно в главном потоке отвязывать DataSet от DataSource, запускать открытие датасета в потоке. После открытия проверять, что запрашиваемые данные не изменились (если изменились заново переоткрываем датасет с новыми параметрами) и если всё ок, то через Synchronize привязываем датасет назад. Колонки в гриде надо создать заранее, иначе будет пересоздавать каждый раз.
Поток создавать в Create формы, а информацию, что изменились запрашиваемые параметры передавать через TEvent.
9 фев 21, 08:46    [22277836]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1769
Подчиненный датасет должен обновляться мгновенно, ведь он ограничен значением мастер-ключа. Что у вас там тормозит.
9 фев 21, 09:10    [22277838]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1769
istrebitel>Просто сделать DataSet.Open внутри другого потока, наверно, не получится, т.к. датасет

В отдельной нити придется не отдельный запрос формировать, а отдельный коннект, а запросы в контексте этого коннекта формировать.
И - с чего вы решили, что это поможет? Отрисовка все равно выполняется в "основной" нити, пока запрос в отдельной нити не завершится - отрисовка не начнется, плюс надо результаты запроса в дитеил-датасет вернуть, . И запрос не сформируется, пока из мастер-датасета не будут переданные значения мастер-ключа.
В общем, непонятно, как вы мультитрейдингом ускорите отображение в дитеил-гриде. Разве что в кэш в фоне потихоньку данные набирать, чтобы потом ими пользоваться, не обращаясь к базе.
9 фев 21, 09:19    [22277841]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
ъъъъъ
Подчиненный датасет должен обновляться мгновенно, ведь он ограничен значением мастер-ключа. Что у вас там тормозит.

2 с половиной секунды, причем зависит от количества записей. 5 записей - 1,5 секунды, 10 - 2,5 и т.д.
SELECT cc.*, 
(@rownum := @rownum + 1) AS rownum, 
contract_number, contract_date, cown.contragent_full_name AS cargo_owner_name, 
cargo_nomenclature_code, cargo_nomenclature_name, cargo_mark_name, cargo_mark_description, container_type_name, container_weight,
cargo_size, cargo_fraction_name, cc.conosament_number, vessel_act_number, general_act_number, 
sender.contragent_full_name AS sender_name, receiver.contragent_full_name AS receiver_name, consignment_number,
IF(cc.pauzka = 'Y', 'ДА', 'НЕТ') AS pauzka_rus,
IF(cc.cooperated = 'Y', 'ДА', 'НЕТ') AS cooperated_rus,
(CASE `c`.`cargo_status` 
WHEN 'export' THEN CONCAT(`cn`.`cargo_nomenclature_name`,' (Э)') 
WHEN 'import' THEN CONCAT(`cn`.`cargo_nomenclature_name`,' (И)') 
WHEN 'domestic' THEN CONCAT(`cn`.`cargo_nomenclature_name`,' (К)') 
ELSE `cn`.`cargo_nomenclature_name` end) AS `cargo_nom_rus`, 
(IF (((contract_date = '1899-12-30') OR (contract_date IS NULL)),
'00.00.0000', DATE_FORMAT(contract_date, '%d.%m.%Y'))) AS contract_date_rus, 
IF((MAX(COALESCE(tex.from_cargo_card_id, tex.to_cargo_card_id)) IS NOT NULL) AND (MIN(COALESCE(tex.transshipment_finish_time, '1899-12-30')) > '1899-12-30'), 'Y', 'N') all_tr_finished 
FROM cargo_card cc 
INNER JOIN vessel_cargo_card vcc ON vcc.id = cc.id 
JOIN (select @rownum := 0) AS r
INNER JOIN contract_cargo_sub ccs ON ccs.id = cc.contract_cargo_sub_id
INNER JOIN contract_cargo_consignment ccc ON ccc.id = ccs.contract_cargo_consignment_id 
INNER JOIN consignment cons ON cons.id = ccc.consignment_id 
INNER JOIN contract_cargo_head cch ON cch.id = ccc.contract_cargo_head_id
INNER JOIN contract c ON c.id = cch.contract_id 
INNER JOIN cargo_nomenclature cn ON cn.id = cch.cargo_id 
LEFT JOIN container_type ct ON ct.id = cch.container_type_id 
LEFT JOIN container_weight_type cwt ON cwt.id = ccs.container_weight_type_id 
LEFT JOIN cargo_fraction cf ON cf.id = ccs.cargo_fraction_id 
LEFT JOIN cargo_mark cm ON cm.id = ccs.cargo_mark_id 
LEFT JOIN cargo_sort cs ON cs.id = ccs.cargo_sort_id 
LEFT JOIN contragent cown ON cown.id = c.contragent_id 
LEFT JOIN contragent sender ON sender.id = cc.sender_id 
LEFT JOIN contragent receiver ON receiver.id = cc.receiver_id 
LEFT JOIN transshipment tex ON cc.id IN (tex.from_cargo_card_id, tex.to_cargo_card_id) 
WHERE vcc.plan_vessel_id = :plan_vessel_id 
GROUP BY cc.id
9 фев 21, 10:44    [22277913]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
ъъъъъ
istrebitel>Просто сделать DataSet.Open внутри другого потока, наверно, не получится, т.к. датасет

В отдельной нити придется не отдельный запрос формировать, а отдельный коннект, а запросы в контексте этого коннекта формировать.
И - с чего вы решили, что это поможет? Отрисовка все равно выполняется в "основной" нити, пока запрос в отдельной нити не завершится - отрисовка не начнется, плюс надо результаты запроса в дитеил-датасет вернуть, . И запрос не сформируется, пока из мастер-датасета не будут переданные значения мастер-ключа.
В общем, непонятно, как вы мультитрейдингом ускорите отображение в дитеил-гриде. Разве что в кэш в фоне потихоньку данные набирать, чтобы потом ими пользоваться, не обращаясь к базе.

Не ускорить отображение, а убрать зависание на скроллинге, когда сделал паузу, начался дочерний запрос, и снова нажал скроллинг.
9 фев 21, 10:47    [22277915]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
istrebitel
Member

Откуда:
Сообщений: 123
ъъъъъ
В отдельной нити придется не отдельный запрос формировать, а отдельный коннект, а запросы в контексте этого коннекта формировать.

Здесь есть нюанс, в зависимости от использованного драйвера и способа заполнения основного грида.
Некоторые драйверы, в определённых режимах CursorKind, не дадут обращаться к БД пока полностью не дофетчится (например MsSQL при CursorKind = ckAutomatic и не установленном NativeClient будет сыпать ошибками raised exception class EMSSQLNativeException with message '[FireDAC][Phys][ODBC][Microsoft][ODBC SQL Server Driver]Подключение занято до получения результатов для другого hstmt'. при CursorKind = ckDynamic работать будет, но медленнее).
FireDAC вроде как выстраивает в очередь запросы, так что подлагивания будут при скроле вниз, при фетчинге очередной порции. Можно сделать чтобы это было пореже установив RowsetSize побольше, а если RowsetSize будет больше, чем количество строк, то фетч будет только один, при открытии датасета.

ъъъъъ
И - с чего вы решили, что это поможет? Отрисовка все равно выполняется в "основной" нити, пока запрос в отдельной нити не завершится - отрисовка не начнется, плюс надо результаты запроса в дитеил-датасет вернуть, . И запрос не сформируется, пока из мастер-датасета не будут переданные значения мастер-ключа.

Поможет избавиться от
svnvlad
Если момент скроллинга попадает на начало перерисовки нижней сетки, то происходит зависание до конца перерисовки. Раньше на каждую запись зависало, теперь только в этом случае.

Допустим запрос из БД занимает 1 секунду, а отрисовка 50 миллисекунд. Когда сработал таймер запрос, выполняющийся в главном потоке, парализует скролинг. Если запрос выполнять в отдельном потоке, то скролинг будет парализоваться только на время отрисовки грида, в момент прицепления его к DataSource. А это скорее всего меньший интервал. Но надо тестить.
ъъъъъ
В общем, непонятно, как вы мультитрейдингом ускорите отображение в дитеил-гриде.

Метод не ускорит отображение в детайле, метод уменьшит тормоза при скролинге в мастере.
С MemTable даже без отцепления грида работает.

К сообщению приложен файл (EventThread.zip - 6Kb) cкачать
9 фев 21, 11:33    [22277944]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15029
svnvlad
OnDataChange


Может, назначать событие после открытия формы, а OnShow/onActivate?
9 фев 21, 12:42    [22278008]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
svnvlad
Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке.
Что за бред? Может вы нам забыли сказать, что после открытия формы вы сами пробегаетесь по всем записям?
9 фев 21, 14:39    [22278156]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
_Vasilisk_
svnvlad
Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке.
Что за бред? Может вы нам забыли сказать, что после открытия формы вы сами пробегаетесь по всем записям?

Нет, не пробегаюсь. Протестировал уже на 2 формах с сетками. При создании формы AfterScroll вызывается столько раз, сколько записей в сетке.
Если только RecordCount не вызывает такое поведение.
EndOfQuery := (ADQueryPlans.RecordCount = 0) or (ADQueryPlans.RecordCount < ThisLimit);


Сообщение было отредактировано: 9 фев 21, 15:18
9 фев 21, 15:23    [22278202]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
svnvlad
Если только RecordCount не вызывает такое поведение.
Чему равно ADQueryPlans.FetchOptions.RecordCountMode?
9 фев 21, 20:33    [22278459]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
_Vasilisk_
svnvlad
Если только RecordCount не вызывает такое поведение.
Чему равно ADQueryPlans.FetchOptions.RecordCountMode?

cmVisible
10 фев 21, 03:48    [22278565]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 64865
Блог
svnvlad
Нет, не пробегаюсь. Протестировал уже на 2 формах с сетками. При создании формы AfterScroll вызывается столько раз, сколько записей в сетке.

А "сетка", небось, девэкспрессовская.
10 фев 21, 05:56    [22278578]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
softwarer
svnvlad
Нет, не пробегаюсь. Протестировал уже на 2 формах с сетками. При создании формы AfterScroll вызывается столько раз, сколько записей в сетке.

А "сетка", небось, девэкспрессовская.

Да.
11 фев 21, 00:34    [22279221]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
ma1tus
Member

Откуда:
Сообщений: 766
svnvlad
softwarer
пропущено...

А "сетка", небось, девэкспрессовская.

Да.

4084037
11 фев 21, 02:49    [22279234]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
cptngrb
Member

Откуда:
Сообщений: 663
если сетка DevExpress, то я вешаю на событие DataSource.OnUpdate и TableView.OnSelectionChanged. Вроде проблем не было, но мне больше нравиться сетка EhLib а там DataSource.onDataChange
11 фев 21, 08:44    [22279288]     Ответить | Цитировать Сообщить модератору
 Re: DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?  [new]
svnvlad
Member

Откуда:
Сообщений: 2245
cptngrb
мне больше нравиться сетка EhLib а там DataSource.onDataChange

Мне тоже раньше больше нравилась, более простая, понятная, но сейчас вижу недостатки, например: при обновлении сетки и Locate на прежнюю запись происходит скроллинг записи в самый верх сетки. В DevExpress запись остается посередине экрана, где и была.
17 фев 21, 01:46    [22282016]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить