| 
| 
 | Вопрос # 1 247/ вопрос открыт / | 
 |  Здравствуйте!Пытаюсь запустить цикл(приложение), который работает с TTreeView, но программа виснет. Нужно выполнить действие над каждым потомком узла n. В чем ошибка?
 Приложение:Переключить в обычный режим procedure TForm1.Us(k: string; n:TTreeNode);varcuritem: TTreeNode;begincuritem :=n.getFirstChild;  while curitem <> nil do  begin   curitem:=n.GetNextChild(n);end;end;
|  |   Вопрос задал: Евгений Eklmn (статус: Посетитель)Вопрос отправлен: 29 декабря 2007, 18:08
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Трофимов Евгений!Давайте подумаем, почему программа "виснет". На самом деле она не виснет. просто  она занята расчётами, которые вы ей дали и не обрабатывает сообщеие от операционной системы на отрисовку. Наиболее простой вариант решить - вставить в цикле вызовы Application.ProcessMessages;  Работу это не ускорит, но у приложения появиться некоторая "отзывчивость". Если это что бы сделать на один раз - сойдёт. Но как профисиональное решение - неправильное.
 Почему же всё таки она "тормозит"? варианты такие. У вас много элементов. но на среднестатистическом компьютере это начнёт проявляться где то при 100-200 элементах. Во вторых, сама процедура обработки элемента может быть сложной(например вы пингуете хосты или файлы скачиваете). Тут уже сами смотрите на свой код и ускоряйте.
 Но это всё костыли. Правильно такая задача решается разделением вида и модели. TreeView - это вид. Он предзначен для отображения и всё! ничего больше. А модель - отдельный набор процедур должен заниматься обработкой. И сделать эту обработку лучше в отдельном потоке.
 Взаимодействуют они между собой двумя способами. В первом, после нажатия кнопки, запускается поток, который занимается расчётами, и с помощю сообщений уведомляет вид о необходимых изменениях. Об этом способе вы можете почитать в моей статье о том, как качать файлы с интернета. Для средних приложений - самое оно. Ещё раз повторюсь. Поток занимается расчётом и время от времени посылает сообщения о необходимости отрисовки с информацией, что именно надо отрисовать. Если правильно сделать, то вид (у вас это тревю с другими элементами формы) может и проигнорировать требования отрисовки(Ну например приложения свёрнуто - смысл обновлять интерфейс).
 Но самый правильный способ - воспользоваться виртуальным тревю. Поток делает расчёты и складыват всё в какой-нибуть класс. а вид время от времени (или просто по сообщению от модели "отрисуюсь") делает просмотр класса и отрисовывает себя. При этом модель абсолютно "не в курсе" какой у неё вид. А вид ничего о модели. Они в курсе только о связующем классе. Это позволить упростить программирование (принцип "разделяй и владей"). Скачать компонент для виртульного тревю можно тут http://www.soft-gems.net/ - он бесплатен.
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 29 декабря 2007, 21:18
 Оценка за ответ: 5
 |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |