|
|
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
Почему DataSource.OnDataChange выполняется 2 раза при открытии формы? Сама процедура, содержащая запрос и его открытие, выполняется один раз на OnShow формы, и после этого OnDataChange - 2 раза. На открытой форме уже при движении курсора по записям выполняется только один раз для каждой записи. Нельзя ли сократить количество вызовов процедуры OnDataChange до 1 раза? В ней висит открытие дочерних сеток, и они открываются по нескольку раз, что очень замедляет создание и открытие формы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 16:30 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
svnvladВ ней висит открытие дочерних сеток Неудачный выбор ивента. И неудачный способ открытия дочерних запросов. Пересади на OnAfterScroll и запросы открывай только после вменяемого таймера (1 секунда - нормально). PS: Посмотри как сделан штатный механизм master-detail в FIB+, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 16:52 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Пересади на OnAfterScroll ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 16:58 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
И, соответственно, не вызывает открытие пустых дочерних запросов. Именно то, что надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 17:00 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Именно то, что надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 17:07 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
т.е. если датасет пустой и событие не будут вызывано, то нужно проверять пустой он или нет и принудительно закрывать дочерние ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 17:16 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov svnvladВ ней висит открытие дочерних сеток Неудачный выбор ивента. И неудачный способ открытия дочерних запросов. Пересади на OnAfterScroll и запросы открывай только после вменяемого таймера (1 секунда - нормально). PS: Посмотри как сделан штатный механизм master-detail в FIB+, например. Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 17:41 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
svnvlad, что то напутал, у меня один раз. Может у тебя какие-то события на форме затрагивают AfterScroll ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 17:43 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
svnvlad Dimitry Sibiryakov пропущено... Неудачный выбор ивента. И неудачный способ открытия дочерних запросов. Пересади на OnAfterScroll и запросы открывай только после вменяемого таймера (1 секунда - нормально). PS: Посмотри как сделан штатный механизм master-detail в FIB+, например. Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке. Тебе про таймер тоже написали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 17:46 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
ъъъъъ svnvlad пропущено... Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке. Тебе про таймер тоже написали. Но я же не знаю заранее, сколько времени будет создаваться форма. Сделаю 1 секунду, а там записей на 5 секунд, и пойдет каждую из 1000 записей открывать дочерние сетки. Да даже 100 уже много. А если сделать больше таймер, то лишняя пауза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 17:50 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
ъъъъъ svnvlad пропущено... Пересадил на FDQuery.AfterScroll - теперь при открытии формы он 50 раз вызывается, на каждую из 50 записей в сетке. Тебе про таймер тоже написали. А чем OnDataChange не нравится. По учебнику ее используют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 17:51 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
svnvlad ъъъъъ пропущено... Тебе про таймер тоже написали. Но я же не знаю заранее, сколько времени будет создаваться форма. Сделаю 1 секунду, а там записей на 5 секунд, и пойдет каждую из 1000 записей открывать дочерние сетки. Да даже 100 уже много. А если сделать больше таймер, то лишняя пауза. Хрень пишешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 17:52 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
svnvlad ъъъъъ пропущено... Тебе про таймер тоже написали. А чем OnDataChange не нравится. По учебнику ее используют. Делай. Но с таймером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 17:53 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
ъъъъъ svnvlad пропущено... А чем OnDataChange не нравится. По учебнику ее используют. Делай. Но с таймером. В событии пишем Код: pascal 1. 2. А в событии OnTimer пишем Код: pascal 1. 2. Правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 18:08 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
svnvlad, да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 18:40 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
svnvlad ъъъъъ пропущено... Делай. Но с таймером. В событии пишем Код: pascal 1. 2. А в событии OnTimer пишем Код: pascal 1. 2. Правильно? Да, я также у себя делал. Рабочая схема ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2021, 19:31 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
Можно ли запихать ADQuery.Open в Thread, чтобы вообще ничего не препятствовало скроллингу? Сейчас иногда происходит затык, если в момент скроллинга начала перерисовываться нижняя сетка. Или будут проблемы с Synchronize? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2021, 04:04 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
svnvlad Можно ли запихать ADQuery.Open в Thread, чтобы вообще ничего не препятствовало скроллингу? Сейчас иногда происходит затык, если в момент скроллинга начала перерисовываться нижняя сетка. Или будут проблемы с Synchronize? Про таймер же написали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2021, 04:14 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
Решал проблему в табеле сотрудников. Хотелось отображать фото, но если делать на AfterScroll то всё очень медленно, при контекстном поиске AfterScroll срабатывает на каждую запись, да и просто фото довольно тяжёлые, для того чтобы запрашивать на каждую запись при быстром скролинге. Решение. Заводите переменные "Запрашиваемый ключ", "Текущий отображаемый ключ" и "Время установки запрашиваемого ключа". Заводите таймер, у меня на 200 миллисекунд, в котором проверяете, что запрашиваемый отличается от текущего. В AfterScroll устанавливаете "Запрашиваемый ключ" и "Время установки запрашиваемого ключа". В таймере проверяете если "Запрашиваемый ключ" <> "Текущий отображаемый ключ" и прошла дельта времени, то делаете свою работу (переоткрываете detail датасеты), устанавливаете "Текущий отображаемый ключ" := "Запрашиваемый ключ". Работает довольно неплохо. Код Код: 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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. Если зажать стрелку вниз или PageDown, то скролинг будет работать быстро, а детейлы обновятся после остановки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2021, 06:59 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
ъъъъъ svnvlad Можно ли запихать ADQuery.Open в Thread, чтобы вообще ничего не препятствовало скроллингу? Сейчас иногда происходит затык, если в момент скроллинга начала перерисовываться нижняя сетка. Или будут проблемы с Synchronize? Про таймер же написали. Сделал уже. Если момент скроллинга попадает на начало перерисовки нижней сетки, то происходит зависание до конца перерисовки. Раньше на каждую запись зависало, теперь только в этом случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2021, 07:27 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
istrebitel Решал проблему в табеле сотрудников. Если зажать стрелку вниз или PageDown, то скролинг будет работать быстро, а детейлы обновятся после остановки. Преимущество перед таймером, что не надо ждать секунду до перерисовки? Или если у вас тоже таймер, то в чем отличие от просто таймера на OnDataChange? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2021, 07:29 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
svnvlad Преимущество перед таймером, что не надо ждать секунду до перерисовки? Нет, смотрите, вся отрисовка у нас в главном потоке, поэтому если она началась, то всё, ждём завершения. svnvlad Или если у вас тоже таймер, то в чем отличие от просто таймера на OnDataChange? Да в принципе тоже самое вид сбоку. Просто у меня там 2 различающихся события: изменился сотрудник - надо обновить и фото и проходы, изменилась дата - обновляем только проходы. И я подстелил соломки, думал задать разные дельты времени ожидания, для фото побольше, но и так хорошо работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2021, 08:16 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
istrebitel svnvlad Преимущество перед таймером, что не надо ждать секунду до перерисовки? Нет, смотрите, вся отрисовка у нас в главном потоке, поэтому если она началась, то всё, ждём завершения. Это вы про Thread что ли? Наиболее сильное зависание происходит именно на команде ADQuery.Open на дочерней сетке, потому что там медленный запрос. Сама отрисовка происходит быстро. Или без разницы, все равно Thread не получится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2021, 08:37 |
|
||
|
DataSource.OnDataChange - почему выполняется 2 раза при новом открытии формы?
|
|||
|---|---|---|---|
|
#18+
В теории надо померить сколько занимает ответ от БД, и сколько отрисовка. Если (и скорее всего) подтупливает ответ, то как вариант делать запрос в потоке. Просто сделать DataSet.Open внутри другого потока, наверно, не получится, т.к. датасет будет генерировать события, которые грид будет пытаться отрисовать. Можно конечно попробовать Disable/EnableControls, но думаю всё равно AV будет сыпать. Как вариант можно в главном потоке отвязывать DataSet от DataSource, запускать открытие датасета в потоке. После открытия проверять, что запрашиваемые данные не изменились (если изменились заново переоткрываем датасет с новыми параметрами) и если всё ок, то через Synchronize привязываем датасет назад. Колонки в гриде надо создать заранее, иначе будет пересоздавать каждый раз. Поток создавать в Create формы, а информацию, что изменились запрашиваемые параметры передавать через TEvent. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2021, 08:46 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40043459&tid=2037619]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 432ms |

| 0 / 0 |
