|
|
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
Есть тостый код Код: 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. Если завожу его в таймер древо постоянно сворачивается. Что делать ? Как быть ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 21:07:11 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
AntiMag... Если завожу его в таймер древо постоянно сворачивается. Что делать ? Как быть ? Писать код, поведение которого тебя устроит? AntiMag Как обновлять VirtualStringTree при помощи Timer Для начала определись, что означает для тебя "обновлять". ... В своем коде ты сперва полностью "убиваешь" дерево: Код: pascal 1. - а потом строишь его фактически с нуля. Все узлы дерева по умолчанию свернуты. Вот ты и получаешь их свернутыми. Но ты при построении можешь задавать свойство "Expanded" в True, но устроит ли тебя такое поведение? Можешь запомнить состояние узлов перед перестроением, а при построении дерева использовать эти данные. Для этого, как минимум, нужно придумать, как один узел отличать от другого. Дальше возникнет вопрос - что делать с позиционированием на экране? Ну вот, смотрел ты на 9999й узел дерева. Потом - бац - таймер, и ты уже смотришь на 1й узел. Это тебя устроит? А что делать в случае, когда текущий узел удаляется - что показывать? ...или когда добавляется 10 000 новых узлов. .... Т.обр., чччДAntiMag Как обновлять VirtualStringTree при помощи Timer Для начала определись, что означает для тебя " обновлять ". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2017, 21:52:32 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
Причем здесь таймер. Код "по кнопке" себя по-другому ведет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 00:31:15 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
AX-ClassПричем здесь таймер. Код "по кнопке" себя по-другому ведет? "По кнопке" код выполняется хотя бы в ожидаемый момент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 00:38:00 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
AntiMag, У VirtualStringTree перед изменением содержимого нужно вызывать метод BeginUpdate, а после изменений - EndUpdate. Тогда будет работать быстрее и не будет мигать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 08:08:05 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
чччД"По кнопке" код выполняется хотя бы в ожидаемый момент. По таймеру тоже ожидаемый ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 08:55:33 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
Не нужно никакого обновления по таймеру. Нужна кнопка ОБНОВИТЬ, при нажатии на которую происходит обновление дерева с позиционированием не том узде, на котором стоял пользователь. Предположим что ваш таймер работает, вы читаете данные с базы и заполняете дерево. Пользователь встал на какой то узел и просматривает его, а другой пользователь в этот момент узел удаляет. Срабатывает ваш таймер и у пользователя ВДРУГ узел исчезает. Он будет доволен ? Другой вариант. Пользователь просматривает одно место дерева, а другой пользователь добавляет/удаляет узлы в другом месте дерева. Зачем текущему пользователю знать о всех движениях где-то там ? Отсюда напрашивается схема - читать не всё дерево сразу, а только текущих подузлов. Пользователь раскрывает узел, в этот момент подчитываются данные и заполняется дерево. Пользователь закрывает узел и раскрывает снова - удаляются и считываются заново все подузлы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 09:04:52 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
каждые 10 секунд идет обновление базы с других ресурсов, от туда достается последняя строчка и выводится на экран. по кнопке каждые 10 секунд щелкать ? каждая строка обновляется в таком режиме. если не ставить Код: pascal 1. то она будет дорисовывать постоянно новое но не затирать старое. авторНе нужно никакого обновления по таймеру. Нужна кнопка ОБНОВИТЬ, при нажатии на которую происходит обновление дерева с позиционированием не том узде, на котором стоял пользователь. Предположим что ваш таймер работает, вы читаете данные с базы и заполняете дерево. Пользователь встал на какой то узел и просматривает его, а другой пользователь в этот момент узел удаляет. Срабатывает ваш таймер и у пользователя ВДРУГ узел исчезает. Он будет доволен ? Другой вариант. Пользователь просматривает одно место дерева, а другой пользователь добавляет/удаляет узлы в другом месте дерева. Зачем текущему пользователю знать о всех движениях где-то там ? Отсюда напрашивается схема - читать не всё дерево сразу, а только текущих подузлов. Пользователь раскрывает узел, в этот момент подчитываются данные и заполняется дерево. Пользователь закрывает узел и раскрывает снова - удаляются и считываются заново все подузлы. Рассчитано на 1 пользователя. 1 и удаляет узлы и добавляет. авторgoldmi45 - спасибо , сделаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:00:29 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
DimaBrОтсюда напрашивается схема - читать не всё дерево сразу, а только текущих подузлов. Пользователь раскрывает узел, в этот момент подчитываются данные и заполняется дерево. собственно именно в этом и идея VTV если этого не делать, то и VTV нужен гораздо меньше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:12:10 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
AntiMagот туда достается последняя строчка и выводится на экран анализируй изменения и в дереве меняй только те ноды, которые надо AntiMagто она будет дорисовывать постоянно новое но не затирать старое. так затирай старые, но не всЕ, а только те, которые удалились ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:13:13 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
автор Дальше возникнет вопрос - что делать с позиционированием на экране? Ну вот, смотрел ты на 9999й узел дерева. Потом - бац - таймер, и ты уже смотришь на 1й узел. Это тебя устроит? А что делать в случае, когда текущий узел удаляется - что показывать? ...или когда добавляется 10 000 новых узлов. Вот да, одна из проблем когда происходит обновление курсор сбрасывается, его как то можно запомнить и потом загружать ? и допустим сохранять положение раскрыт узел или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:19:13 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
Всё равно ваше дерево будет постоянно дёргаться. Не думаю что это понравится пользователю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:27:02 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
Хотелось бы услышать постановку задачи, а не метод её выполнения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:28:04 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
авторХотелось бы услышать постановку задачи, а не метод её выполнения Есть база данных которая обновляется каждые 10 секунд из внешних источников. Необходимо вывести 2 статических узла. и заполнить их по соответствию из базы, при этом автоматически обновлять данные в этих узлах когда поступают новые данные. (Количество дочерних узлов устанавливает пользователь в базе то есть он добавляет строку "аааааа" и программа база начинает заполнять дочернюю базу из которой достается последняя строчка) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:34:18 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
AntiMagавторДальше возникнет вопрос - что делать с позиционированием на экране? Ну вот, смотрел ты на 9999й узел дерева. Потом - бац - таймер, и ты уже смотришь на 1й узел. Это тебя устроит? А что делать в случае, когда текущий узел удаляется - что показывать? ...или когда добавляется 10 000 новых узлов. Вот да, одна из проблем когда происходит обновление курсор сбрасывается, его как то можно запомнить и потом загружать ? и допустим сохранять положение раскрыт узел или нет? Ну вот ты подумай сперва, определись что именно тебе нужно, разбери разные варианты, потом подумай о методах достижения, а уж потом только кодируй. Все равно никто за тебя задачу "вот так правильно" не решит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:36:34 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
строки=узлы в БД=дерево - только добавляются, или иногда удаляются тоже? а в общем, можно только повторить: Ariochанализируй изменения и в дереве меняй только те ноды, которые надо не убивай дерево, а делай в нём минимальные изменения и только нужные. не грузи в дерево всю БД, а только ты её части, который пользователь вывел на экран ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:38:02 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
AntiMagавторХотелось бы услышать постановку задачи, а не метод её выполнения Есть база данных которая обновляется каждые 10 секунд из внешних источников. Необходимо вывести 2 статических узла. и заполнить их по соответствию из базы, при этом автоматически обновлять данные в этих узлах когда поступают новые данные. (Количество дочерних узлов устанавливает пользователь в базе то есть он добавляет строку "аааааа" и программа база начинает заполнять дочернюю базу из которой достается последняя строчка) Ну и че ты паришься, в постановке задачи нет условия "чтобы узлы не сворачивались". Если заказчика не устраивает - пусть даст определение понятия "обновлять данные". Пример ему приведи: "вот ты начальник милиции, читаешь с листа сводку - куяк! - новая сводка! Что, вырвать старую из рук и вставть в руки новую, или прямо в листе зачеркнуть все поменять? Или новую сводку положить на стол, а ты сам определишься, когда ее читать?" ... а если в новой сводке данные не изменились - зачем она вообще нужна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:46:01 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
автор не убивай дерево, а делай в нём минимальные изменения и только нужные. не грузи в дерево всю БД, а только ты её части, который пользователь вывел на экран Можешь какой нить пример скинуть ? Желательно что бы понять можно было какой эвент используется. А то я пытаюсь это представить и на ум тока приходит что код разбить на 2 процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:48:34 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
Ariochстроки=узлы в БД=дерево - только добавляются, или иногда удаляются тоже? а в общем, можно только повторить: Ariochанализируй изменения и в дереве меняй только те ноды, которые надо не убивай дерево, а делай в нём минимальные изменения и только нужные. не грузи в дерево всю БД, а только ты её части, который пользователь вывел на экран А если были удалены ВСЕ данные, которые пользователь вывел на экран - что тогда показывать после "обновления"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:49:30 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
авторНу и че ты паришься, в постановке задачи нет условия "чтобы узлы не сворачивались". Если заказчика не устраивает - пусть даст определение понятия "обновлять данные". Пример ему приведи: "вот ты начальник милиции, читаешь с листа сводку - куяк! - новая сводка! Что, вырвать старую из рук и вставть в руки новую, или прямо в листе зачеркнуть все поменять? Или новую сводку положить на стол, а ты сам определишься, когда ее читать?" ... а если в новой сводке данные не изменились - зачем она вообще нужна? Ок, real-time так понятнее мысль программы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:51:05 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
AntiMagавторне убивай дерево, а делай в нём минимальные изменения и только нужные. не грузи в дерево всю БД, а только ты её части, который пользователь вывел на экран Можешь какой нить пример скинуть ? Желательно что бы понять можно было какой эвент используется. А то я пытаюсь это представить и на ум тока приходит что код разбить на 2 процедуры. Не будет тебе никакого кода, 100%. Пока ты сам алгоритм не всосешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:51:53 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
Более понятней, представь что тебе поступают данные температуры за окном и их надо в режиме реального времени выводить там. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:52:25 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
AntiMagавторНу и че ты паришься, в постановке задачи нет условия "чтобы узлы не сворачивались". Если заказчика не устраивает - пусть даст определение понятия "обновлять данные". Пример ему приведи: "вот ты начальник милиции, читаешь с листа сводку - куяк! - новая сводка! Что, вырвать старую из рук и вставть в руки новую, или прямо в листе зачеркнуть все поменять? Или новую сводку положить на стол, а ты сам определишься, когда ее читать?" ... а если в новой сводке данные не изменились - зачем она вообще нужна? Ок, real-time так понятнее мысль программы ? Что ж ты упертый такой. Ну, твори тогда свой рилтайм сам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 12:53:55 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
авторЧто ж ты упертый такой. Ну, твори тогда свой рилтайм сам. Так бы и сказал что ничего дельного не можешь предложить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 13:07:53 |
|
||
|
Как обновлять VirtualStringTree при помощи Timer
|
|||
|---|---|---|---|
|
#18+
DimaBrНе нужно никакого обновления по таймеру. Нужна кнопка ОБНОВИТЬ, при нажатии на которую происходит обновление дерева с позиционированием не том узде, на котором стоял пользователь. Предположим что ваш таймер работает, вы читаете данные с базы и заполняете дерево. Пользователь встал на какой то узел и просматривает его, а другой пользователь в этот момент узел удаляет. Срабатывает ваш таймер и у пользователя ВДРУГ узел исчезает. Он будет доволен ? Другой вариант. Пользователь просматривает одно место дерева, а другой пользователь добавляет/удаляет узлы в другом месте дерева. Зачем текущему пользователю знать о всех движениях где-то там ? Отсюда напрашивается схема - читать не всё дерево сразу, а только текущих подузлов. Пользователь раскрывает узел, в этот момент подчитываются данные и заполняется дерево. Пользователь закрывает узел и раскрывает снова - удаляются и считываются заново все подузлы. Да. В некоторых случаях можно обновлять дерево. Например, когда данные менялись, но не удалялись или добавлялись. При этом достаточно лишь перечитать данные, идентификаторы которых "хранятся" в ВИДИМЫХ на экране узлах. В некоторых случаях можно показывать и удаленные данные: структура дерева остается прежней, просто удаленные узлы помечаются особым образом (цветом или <данные удалены>). Мне такой режим подсказал один из заказчиков, и я его теперь довольно часто использую. И, естественно, кнопочка "Обновить". Которая энейблится при поступлении эвента от СУБД "данные изменились"(т.е., поменялись, удалились, добавились). Вот тут уж я в коде стараюсь сохранить текущее положение курсора на экране и все состояния типа Expanded, а также решаю, что делать, когда данные удалены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 13:14:10 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39508731&tid=2041916]: |
0ms |
get settings: |
4ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
28ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 320ms |

| 0 / 0 |
