powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как обновлять VirtualStringTree при помощи Timer
25 сообщений из 45, страница 1 из 2
Как обновлять VirtualStringTree при помощи Timer
    #39508586
AntiMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть тостый код

Код: 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.
procedure TForm_VST.Pair;
Var
  I, J: integer;
begin
  VST1.Clear;
  for I := 0 to 1 do
  begin
    RootNode := VST1.AddChild(nil);
    if I = 0 then
    begin
      Level := 0;
      TData := VST1.GetNodeData(RootNode);
      TData.NodeName := '1 рут строка';
      bd.ADOT_P.First;
      while not(bd.ADOT_P.Eof) do
      begin
        Level2 := J;
        ChildNode := VST1.AddChild(RootNode);
        NamNod;
        CoinName;
        RunTime;
        Hesh1;
        Hesh2;
        bd.ADOT_P.next;
      end;
    end;
    if I = 1 then
    begin
      Level := 1;
      TData := VST1.GetNodeData(RootNode);
      TData.NodeName := '2 рут строка';
      bd.ADOT_M.First;
      while not(bd.ADOT_M.Eof) do
      begin
        Level2 := J;
        ChildNode := VST1.AddChild(RootNode);
        bd.ADOT_D.Last;
        NamNod;
        CoinName;
        RunTime;
        Hesh1;
        Hesh2;
        GPUTem;
        Vers;
        bd.ADOT_M.next;
      end;
      Level2 := 0;
    end;
  end;
end;




Если завожу его в таймер древо постоянно сворачивается. Что делать ? Как быть ?
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508591
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntiMag...
Если завожу его в таймер древо постоянно сворачивается. Что делать ? Как быть ?
Писать код, поведение которого тебя устроит?
AntiMag Как обновлять VirtualStringTree при помощи Timer

Для начала определись, что означает для тебя "обновлять".
...
В своем коде ты сперва полностью "убиваешь" дерево:
Код: pascal
1.
  VST1.Clear;


- а потом строишь его фактически с нуля. Все узлы дерева по умолчанию свернуты. Вот ты и получаешь их свернутыми.
Но ты при построении можешь задавать свойство "Expanded" в True, но устроит ли тебя такое поведение?
Можешь запомнить состояние узлов перед перестроением, а при построении дерева использовать эти данные. Для этого, как минимум, нужно придумать, как один узел отличать от другого.

Дальше возникнет вопрос - что делать с позиционированием на экране? Ну вот, смотрел ты на 9999й узел дерева. Потом - бац - таймер, и ты уже смотришь на 1й узел. Это тебя устроит?

А что делать в случае, когда текущий узел удаляется - что показывать? ...или когда добавляется 10 000 новых узлов.
....
Т.обр., чччДAntiMag Как обновлять VirtualStringTree при помощи Timer

Для начала определись, что означает для тебя " обновлять ".
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508609
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем здесь таймер. Код "по кнопке" себя по-другому ведет?
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508610
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AX-ClassПричем здесь таймер. Код "по кнопке" себя по-другому ведет?

"По кнопке" код выполняется хотя бы в ожидаемый момент.
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508626
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntiMag,

У VirtualStringTree перед изменением содержимого нужно вызывать метод BeginUpdate, а после изменений - EndUpdate. Тогда будет работать быстрее и не будет мигать.
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508636
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД"По кнопке" код выполняется хотя бы в ожидаемый момент.
По таймеру тоже ожидаемый
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508639
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нужно никакого обновления по таймеру. Нужна кнопка ОБНОВИТЬ, при нажатии на которую происходит обновление дерева с позиционированием не том узде, на котором стоял пользователь.
Предположим что ваш таймер работает, вы читаете данные с базы и заполняете дерево. Пользователь встал на какой то узел и просматривает его, а другой пользователь в этот момент узел удаляет. Срабатывает ваш таймер и у пользователя ВДРУГ узел исчезает. Он будет доволен ?
Другой вариант.

Пользователь просматривает одно место дерева, а другой пользователь добавляет/удаляет узлы в другом месте дерева. Зачем текущему пользователю знать о всех движениях где-то там ?

Отсюда напрашивается схема - читать не всё дерево сразу, а только текущих подузлов. Пользователь раскрывает узел, в этот момент подчитываются данные и заполняется дерево. Пользователь закрывает узел и раскрывает снова - удаляются и считываются заново все подузлы.
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508690
AntiMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
каждые 10 секунд идет обновление базы с других ресурсов, от туда достается последняя строчка и выводится на экран.
по кнопке каждые 10 секунд щелкать ?
каждая строка обновляется в таком режиме.
если не ставить

Код: pascal
1.
 VST1.Clear;



то она будет дорисовывать постоянно новое но не затирать старое.
авторНе нужно никакого обновления по таймеру. Нужна кнопка ОБНОВИТЬ, при нажатии на которую происходит обновление дерева с позиционированием не том узде, на котором стоял пользователь.
Предположим что ваш таймер работает, вы читаете данные с базы и заполняете дерево. Пользователь встал на какой то узел и просматривает его, а другой пользователь в этот момент узел удаляет. Срабатывает ваш таймер и у пользователя ВДРУГ узел исчезает. Он будет доволен ?
Другой вариант.

Пользователь просматривает одно место дерева, а другой пользователь добавляет/удаляет узлы в другом месте дерева. Зачем текущему пользователю знать о всех движениях где-то там ?

Отсюда напрашивается схема - читать не всё дерево сразу, а только текущих подузлов. Пользователь раскрывает узел, в этот момент подчитываются данные и заполняется дерево. Пользователь закрывает узел и раскрывает снова - удаляются и считываются заново все подузлы.

Рассчитано на 1 пользователя.
1 и удаляет узлы и добавляет.

авторgoldmi45 - спасибо , сделаю.
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508692
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrОтсюда напрашивается схема - читать не всё дерево сразу, а только текущих подузлов. Пользователь раскрывает узел, в этот момент подчитываются данные и заполняется дерево.

собственно именно в этом и идея VTV

если этого не делать, то и VTV нужен гораздо меньше
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508693
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntiMagот туда достается последняя строчка и выводится на экран

анализируй изменения и в дереве меняй только те ноды, которые надо

AntiMagто она будет дорисовывать постоянно новое но не затирать старое.

так затирай старые, но не всЕ, а только те, которые удалились
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508696
AntiMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор
Дальше возникнет вопрос - что делать с позиционированием на экране? Ну вот, смотрел ты на 9999й узел дерева. Потом - бац - таймер, и ты уже смотришь на 1й узел. Это тебя устроит?

А что делать в случае, когда текущий узел удаляется - что показывать? ...или когда добавляется 10 000 новых узлов.


Вот да, одна из проблем когда происходит обновление курсор сбрасывается, его как то можно запомнить и потом загружать ?
и допустим сохранять положение раскрыт узел или нет?
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508699
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё равно ваше дерево будет постоянно дёргаться. Не думаю что это понравится пользователю
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508701
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось бы услышать постановку задачи, а не метод её выполнения
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508703
AntiMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторХотелось бы услышать постановку задачи, а не метод её выполнения


Есть база данных которая обновляется каждые 10 секунд из внешних источников.
Необходимо вывести
2 статических узла.
и заполнить их по соответствию из базы, при этом автоматически обновлять данные в этих узлах когда поступают новые данные.
(Количество дочерних узлов устанавливает пользователь в базе то есть он добавляет строку "аааааа" и программа база начинает заполнять дочернюю базу из которой достается последняя строчка)
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508705
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntiMagавторДальше возникнет вопрос - что делать с позиционированием на экране? Ну вот, смотрел ты на 9999й узел дерева. Потом - бац - таймер, и ты уже смотришь на 1й узел. Это тебя устроит?

А что делать в случае, когда текущий узел удаляется - что показывать? ...или когда добавляется 10 000 новых узлов.


Вот да, одна из проблем когда происходит обновление курсор сбрасывается, его как то можно запомнить и потом загружать ?
и допустим сохранять положение раскрыт узел или нет?

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

Все равно никто за тебя задачу "вот так правильно" не решит.
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508707
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
строки=узлы в БД=дерево - только добавляются, или иногда удаляются тоже?

а в общем, можно только повторить:
Ariochанализируй изменения и в дереве меняй только те ноды, которые надо

не убивай дерево, а делай в нём минимальные изменения и только нужные.

не грузи в дерево всю БД, а только ты её части, который пользователь вывел на экран
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508711
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntiMagавторХотелось бы услышать постановку задачи, а не метод её выполнения


Есть база данных которая обновляется каждые 10 секунд из внешних источников.
Необходимо вывести
2 статических узла.
и заполнить их по соответствию из базы, при этом автоматически обновлять данные в этих узлах когда поступают новые данные.
(Количество дочерних узлов устанавливает пользователь в базе то есть он добавляет строку "аааааа" и программа база начинает заполнять дочернюю базу из которой достается последняя строчка)
Ну и че ты паришься, в постановке задачи нет условия "чтобы узлы не сворачивались".
Если заказчика не устраивает - пусть даст определение понятия "обновлять данные". Пример ему приведи: "вот ты начальник милиции, читаешь с листа сводку - куяк! - новая сводка! Что, вырвать старую из рук и вставть в руки новую, или прямо в листе зачеркнуть все поменять? Или новую сводку положить на стол, а ты сам определишься, когда ее читать?"

... а если в новой сводке данные не изменились - зачем она вообще нужна?
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508713
AntiMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор
не убивай дерево, а делай в нём минимальные изменения и только нужные.

не грузи в дерево всю БД, а только ты её части, который пользователь вывел на экран

Можешь какой нить пример скинуть ? Желательно что бы понять можно было какой эвент используется.
А то я пытаюсь это представить и на ум тока приходит что код разбить на 2 процедуры.
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508714
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochстроки=узлы в БД=дерево - только добавляются, или иногда удаляются тоже?

а в общем, можно только повторить:
Ariochанализируй изменения и в дереве меняй только те ноды, которые надо

не убивай дерево, а делай в нём минимальные изменения и только нужные.

не грузи в дерево всю БД, а только ты её части, который пользователь вывел на экран
А если были удалены ВСЕ данные, которые пользователь вывел на экран - что тогда показывать после "обновления"?
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508715
AntiMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторНу и че ты паришься, в постановке задачи нет условия "чтобы узлы не сворачивались".
Если заказчика не устраивает - пусть даст определение понятия "обновлять данные". Пример ему приведи: "вот ты начальник милиции, читаешь с листа сводку - куяк! - новая сводка! Что, вырвать старую из рук и вставть в руки новую, или прямо в листе зачеркнуть все поменять? Или новую сводку положить на стол, а ты сам определишься, когда ее читать?"

... а если в новой сводке данные не изменились - зачем она вообще нужна?

Ок, real-time так понятнее мысль программы ?
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508717
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntiMagавторне убивай дерево, а делай в нём минимальные изменения и только нужные.

не грузи в дерево всю БД, а только ты её части, который пользователь вывел на экран

Можешь какой нить пример скинуть ? Желательно что бы понять можно было какой эвент используется.
А то я пытаюсь это представить и на ум тока приходит что код разбить на 2 процедуры.
Не будет тебе никакого кода, 100%.
Пока ты сам алгоритм не всосешь.
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508718
AntiMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Более понятней, представь что тебе поступают данные температуры за окном и их надо в режиме реального времени выводить там.
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508719
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntiMagавторНу и че ты паришься, в постановке задачи нет условия "чтобы узлы не сворачивались".
Если заказчика не устраивает - пусть даст определение понятия "обновлять данные". Пример ему приведи: "вот ты начальник милиции, читаешь с листа сводку - куяк! - новая сводка! Что, вырвать старую из рук и вставть в руки новую, или прямо в листе зачеркнуть все поменять? Или новую сводку положить на стол, а ты сам определишься, когда ее читать?"

... а если в новой сводке данные не изменились - зачем она вообще нужна?

Ок, real-time так понятнее мысль программы ?
Что ж ты упертый такой.

Ну, твори тогда свой рилтайм сам.
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508731
AntiMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторЧто ж ты упертый такой.

Ну, твори тогда свой рилтайм сам.

Так бы и сказал что ничего дельного не можешь предложить
...
Рейтинг: 0 / 0
Как обновлять VirtualStringTree при помощи Timer
    #39508735
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrНе нужно никакого обновления по таймеру. Нужна кнопка ОБНОВИТЬ, при нажатии на которую происходит обновление дерева с позиционированием не том узде, на котором стоял пользователь.
Предположим что ваш таймер работает, вы читаете данные с базы и заполняете дерево. Пользователь встал на какой то узел и просматривает его, а другой пользователь в этот момент узел удаляет. Срабатывает ваш таймер и у пользователя ВДРУГ узел исчезает. Он будет доволен ?
Другой вариант.

Пользователь просматривает одно место дерева, а другой пользователь добавляет/удаляет узлы в другом месте дерева. Зачем текущему пользователю знать о всех движениях где-то там ?

Отсюда напрашивается схема - читать не всё дерево сразу, а только текущих подузлов. Пользователь раскрывает узел, в этот момент подчитываются данные и заполняется дерево. Пользователь закрывает узел и раскрывает снова - удаляются и считываются заново все подузлы.
Да.

В некоторых случаях можно обновлять дерево.
Например, когда данные менялись, но не удалялись или добавлялись. При этом достаточно лишь перечитать данные, идентификаторы которых "хранятся" в ВИДИМЫХ на экране узлах.
В некоторых случаях можно показывать и удаленные данные: структура дерева остается прежней, просто удаленные узлы помечаются особым образом (цветом или <данные удалены>). Мне такой режим подсказал один из заказчиков, и я его теперь довольно часто использую.

И, естественно, кнопочка "Обновить". Которая энейблится при поступлении эвента от СУБД "данные изменились"(т.е., поменялись, удалились, добавились). Вот тут уж я в коде стараюсь сохранить текущее положение курсора на экране и все состояния типа Expanded, а также решаю, что делать, когда данные удалены.
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как обновлять VirtualStringTree при помощи Timer
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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