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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 1 247

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

Здравствуйте!
Пытаюсь запустить цикл(приложение), который работает с TTreeView, но программа виснет. Нужно выполнить действие над каждым потомком узла n. В чем ошибка?

Приложение:
  1. procedure TForm1.Us(k: string; n:TTreeNode);
  2. var
  3. curitem: TTreeNode;
  4. begin
  5. curitem :=n.getFirstChild;
  6. while curitem <> nil do
  7. begin
  8.  
  9. curitem:=n.GetNextChild(n);
  10. end;
  11. end;


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

Вопрос задал: Евгений Eklmn (статус: Посетитель)
Вопрос отправлен: 29 декабря 2007, 18:08
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Трофимов Евгений!
Давайте подумаем, почему программа "виснет". На самом деле она не виснет. просто она занята расчётами, которые вы ей дали и не обрабатывает сообщеие от операционной системы на отрисовку. Наиболее простой вариант решить - вставить в цикле вызовы Application.ProcessMessages; Работу это не ускорит, но у приложения появиться некоторая "отзывчивость". Если это что бы сделать на один раз - сойдёт. Но как профисиональное решение - неправильное.
Почему же всё таки она "тормозит"? варианты такие. У вас много элементов. но на среднестатистическом компьютере это начнёт проявляться где то при 100-200 элементах. Во вторых, сама процедура обработки элемента может быть сложной(например вы пингуете хосты или файлы скачиваете). Тут уже сами смотрите на свой код и ускоряйте.
Но это всё костыли. Правильно такая задача решается разделением вида и модели. TreeView - это вид. Он предзначен для отображения и всё! ничего больше. А модель - отдельный набор процедур должен заниматься обработкой. И сделать эту обработку лучше в отдельном потоке.
Взаимодействуют они между собой двумя способами. В первом, после нажатия кнопки, запускается поток, который занимается расчётами, и с помощю сообщений уведомляет вид о необходимых изменениях. Об этом способе вы можете почитать в моей статье о том, как качать файлы с интернета. Для средних приложений - самое оно. Ещё раз повторюсь. Поток занимается расчётом и время от времени посылает сообщения о необходимости отрисовки с информацией, что именно надо отрисовать. Если правильно сделать, то вид (у вас это тревю с другими элементами формы) может и проигнорировать требования отрисовки(Ну например приложения свёрнуто - смысл обновлять интерфейс).
Но самый правильный способ - воспользоваться виртуальным тревю. Поток делает расчёты и складыват всё в какой-нибуть класс. а вид время от времени (или просто по сообщению от модели "отрисуюсь") делает просмотр класса и отрисовывает себя. При этом модель абсолютно "не в курсе" какой у неё вид. А вид ничего о модели. Они в курсе только о связующем классе. Это позволить упростить программирование (принцип "разделяй и владей"). Скачать компонент для виртульного тревю можно тут http://www.soft-gems.net/ - он бесплатен.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 29 декабря 2007, 21:18
Оценка за ответ: 5


Мини-форум вопроса

Мини-форум пуст.

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 23 июня 2017, 15:15
Выполнено за 0.03 сек.
Рейтинг@Mail.ru