Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 495

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Бьюсь не первый день - как можно программно быстро перейти к нужному Node в компоненте TreeView. В TreeView отобажается дерево датчиков, нужно переодически проверять сотояние датчиков, и если изменение произошло переисовывать node и возврящаться к тому который был выбран до перерисовки. Может кто подскажет. Не хочется пробегать по всей ветке несколько раз, слишком большие задержки;( Заранее спасибо

Shest Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Shest (статус: Посетитель)
Вопрос отправлен: 14 апреля 2008, 17:30
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Помфюк Владимир Степанович

Здравствуйте, Shest!
А что мешает сохранить его в переменной (н.п. SaveNode:TTreeNode) , а потом сказать
SaveNode.Selected:=true;
SaveNode.MakeVisible;

Ответ отправил: Помфюк Владимир Степанович (статус: Абитуриент)
Время отправки: 14 апреля 2008, 17:38

Ответ #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

Shest (статус: Посетитель), 14 апреля 2008, 18:16 [#1]:

Спасибо за ответ.
Я пробовал сохранять в переменную таким образом, но после обновления всех нодов эта переменная меняеться вместе с перерисовкой нодов, тем самым на выходе из процедуры перерисовки в ней хранится не то значение, которое присваивалось в начале;(
Помфюк Владимир Степанович

Помфюк Владимир Степанович (статус: Абитуриент), 14 апреля 2008, 18:23 [#2]:

тогда присваивайте SaveNode во время перерисовки, а запоминайте какие-то параметры, по которым Вы её можете "вычислить", а потом те же Selected:=true и MakeVisible
Shest

Shest (статус: Посетитель), 14 апреля 2008, 18:47 [#3]:

Сделал наверное через одно место, вообщем перед перерисовкой сохроняю АбсолютныйИндекс а после перерисовки в цикле ищу равный индекс и делаю его Selected:=true, а после для него уже перерисовываю ListView. Если у Вас есть более простое и грамотное решение скинте кусочек исходничка. можно по мылу и в аську 135083303. Спасибо большое за содействие
Shest

Shest (статус: Посетитель), 15 апреля 2008, 10:16 [#4]:

Спасибо, буду пробовать
DimaGS

DimaGS (статус: Посетитель), 25 июня 2008, 07:15 [#5]:

абсолютный индекс только для чтения в него нельзя записать данныи

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.03 сек.