Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как обновлять VirtualStringTree при помощи Timer / 25 сообщений из 45, страница 1 из 2
21.08.2017, 21:07:11
    #39508586
AntiMag
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновлять VirtualStringTree при помощи Timer
Есть тостый код

Код: 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
21.08.2017, 21:52:32
    #39508591
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновлять VirtualStringTree при помощи Timer
AntiMag...
Если завожу его в таймер древо постоянно сворачивается. Что делать ? Как быть ?
Писать код, поведение которого тебя устроит?
AntiMag Как обновлять VirtualStringTree при помощи Timer

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


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

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

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

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

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

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

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

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

Код: pascal
1.
 VST1.Clear;



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

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

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

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

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

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

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

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

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

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

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


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


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

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


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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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