|
Вопрос # 1 495/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Бьюсь не первый день - как можно программно быстро перейти к нужному Node в компоненте TreeView. В TreeView отобажается дерево датчиков, нужно переодически проверять сотояние датчиков, и если изменение произошло переисовывать node и возврящаться к тому который был выбран до перерисовки. Может кто подскажет. Не хочется пробегать по всей ветке несколько раз, слишком большие задержки;( Заранее спасибо
 |
Вопрос задал: Shest (статус: Посетитель)
Вопрос отправлен: 14 апреля 2008, 17:30
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Помфюк Владимир Степанович
Здравствуйте, Shest!
А что мешает сохранить его в переменной (н.п. SaveNode:TTreeNode) , а потом сказать
SaveNode.Selected:=true;
SaveNode.MakeVisible;
Ответ #2. Отвечает эксперт: Вадим К
Здравствуйте, Shest!
Через абсолютный индекс - это действительно самое ужасное решение. уже при сотне элементов даже хорошая машина будет тормозить. Вам нужно менять логику мышления.
В данном случае наиболее правильна модель представление-модель. Это классика.
Суть - есть объек (или группа) который хранит состояние всех датчиков. Он осуществляет чтение данных с датчиков например с помощью потока или просто предоставляет функцию, котору нужно дёргать в случае прихода новых данных.
Самое главное то, что он абсолютно не знает ничего о том, кто будет отображать данные. Он только умеет посылать сообщение о том, что данные были изменены.
А отображать данные в данном случае наверно лучше всего Виртуальному TreeView. Он получив сообщение о изменении модели, перерисовывает себя. Естественно, само сообщение может содержать в себе указание номера датчика который изменился или что то в таком стиле.
Этот приём даст большую гибкость в случае перехода на другой способ отображения дерева датчиков - например полной ручной прорисовке.
Почитать о работе с Virtual List View можно тут http://forum.vingrad.ru/forum/topic-97620.html
Вначале это кажеться громоздко, но потратив несколько дней и упорядочив код, добавление новой функциональности стаёт простой и лёгкой.
Также можно почитать на этом сайте в разделе статьи мою статью о виртуальном ListView - это тоже может неплохо помочь
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 14 апреля 2008, 21:34
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 25 июня 2008, 07:15; участников в обсуждении: 3.
|
Shest (статус: Посетитель), 14 апреля 2008, 18:16 [#1]:
Спасибо за ответ.
Я пробовал сохранять в переменную таким образом, но после обновления всех нодов эта переменная меняеться вместе с перерисовкой нодов, тем самым на выходе из процедуры перерисовки в ней хранится не то значение, которое присваивалось в начале;(
|
|
Помфюк Владимир Степанович (статус: Абитуриент), 14 апреля 2008, 18:23 [#2]:
тогда присваивайте SaveNode во время перерисовки, а запоминайте какие-то параметры, по которым Вы её можете "вычислить", а потом те же Selected:=true и MakeVisible
|
|
Shest (статус: Посетитель), 14 апреля 2008, 18:47 [#3]:
Сделал наверное через одно место, вообщем перед перерисовкой сохроняю АбсолютныйИндекс а после перерисовки в цикле ищу равный индекс и делаю его Selected:=true, а после для него уже перерисовываю ListView. Если у Вас есть более простое и грамотное решение скинте кусочек исходничка. можно по мылу и в аську 135083303. Спасибо большое за содействие
|
|
Shest (статус: Посетитель), 15 апреля 2008, 10:16 [#4]:
Спасибо, буду пробовать
|
|
DimaGS (статус: Посетитель), 25 июня 2008, 07:15 [#5]:
абсолютный индекс только для чтения в него нельзя записать данныи
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|