Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Для новичков > Использование компонента shelltreeview |
Автор: Alexzz 26.9.2007, 21:56 |
ShellTreeView Хороший, стильный компонент. Можно очень наглядно и удобно организовать просмотр файлов. Но вот столкнулся с проблемой - работа с компонентом приводит к ошибкам. Ошибки самые различные, в разные моменты разные. Сначала о том, как я использую компонент. Свойство Root установлено в rtMyComputer. В свойстве ObjectTypes включены otFolders и otNonFolders. Другие свойства изначально не менялись. При пуске программы, по событию form.OnCreate читается ini файл и оттуда читается стринг, прежде сохранённое значение свойства ShellTreeView.path и соответственно в это свойство и направляется. Работа программы организована через событие ShellTreeView.OnChange. По каждому событию считывается свойство ShellTreeView.path, определяется файл это или нет, файл читается и анализируется. Первый трабл возник при работе с папкой, содержащей около 40 файлов с именами по 30-50 символов. Глюк заключался в следующем: Перебирая файлы сверху вниз на одном файле программа вдруг вылетала с ошибкой и закрывалась. Какая ошибка, я к сожалению не запомнил. Поначалу я думал, что виноват именно этот файл, менял его атрибуты, переименовывал его, но ошибка всегда возникала именно на этом файле. Все файлы выше и ниже программа легко открывала, а стоило кликнуть на этот файл как программа вылетала. Затем я этот файл удалил. И ошибка стала возникать на следующем файле, который встал в списке на место удалённого. Потом я на время отключил работу с ini файлом и проблема вроде исчезла. Но потом возникла другая - если хоть раз открыть в окне компонента папку содержащую более 500 файлов, то программу больше невозможно нормально закрыть. При закрытии она вываливается в ошибку. Проверено, ошибка точно зависит от работы с ShellTreeView. Если не открывать ни одной большой папки, то всё нормально. Если хоть раз хоть одну большую папку открыть, при закрытии программы она стабильно вываливается в ошибку. Если в большой папке перебирать файлы один за другим, то в определённый момент программа вываливается в ошибку. Иногда, если выбрав один файл некоторое время работать с программой а потом вернуться в окно ShellTreeView, то в нём больше не появляется инверсная строка показывающая текущий файл, индикатор системных ресурсов, установленный в трей, показывает резкий скачок загрузки процессора, и через секунд 5 программа вылетает с ошибкой. У меня складывается впечатление, что под какие-то данные компонента выделяется слишком мало места и они при работе затирают другие данные в памяти, а так-же другие данные могут затереть данные ShellTreeView. Ясно, что изначально невозможно предугадать с какими папками компоненту прийдётся работать, но ведь под любой объём данных должно автоматически выделяться место, или я не прав? А может я чего-то в начале не указал, чтобы так происходило? Вобщем нужен совет опытных программистов. Я в тупике. |
Автор: Sanchezzz 26.9.2007, 22:07 |
ShellTreeView это убого базовый TreeView. Лучше все делать самому ручками и для этих целий virtualtreeview уж точно не загнется в поставки с ним идет демы. там есть пример дерева каталогов до вольно быстро работает.... + ко все сему тут есть отличные статьи на форумы о нем в помощь в освоении.. |
Автор: BaD_SeCt0R 26.9.2007, 22:32 |
Alexzz, как ни проверял, даже открывал папку с количеством файлов почти равным 5000. Да, работает жутко медленно, но никаких ошибок не обнаружил. Может дело у тебя в коде? Потоки используешь? PS У меня D7. |
Автор: Alexzz 29.9.2007, 16:54 | ||
Да, но в чём именно? Всё взаимодействие я уже описал. Всё что я делаю, это считываю свойство path. Я тут одно время думал, что проблема связана с сохранением path в ини-файл и восстановлении его при следующем запуске. Но теперь я даже это убрал. Трабл всё равно существует. Ничего не понимаю! ![]() Добавлено @ 17:09
Поподробнее пожалуйста, это есть в папках дельфи? В какой именно папке лежит эта демка? В списке компонентов у меня нету virtualTreeView. У меня 7 ентерпрайз. |
Автор: BaD_SeCt0R 29.9.2007, 17:10 |
А что в path? Может там у тебя значение инвалидное? |
Автор: Alexzz 29.9.2007, 17:16 | ||
Дык я туда ничего не пишу больше. Только читаю. И из полученной от туда строки нормально извлекается имя файла и путь к нему. |
Автор: BaD_SeCt0R 29.9.2007, 17:33 |
Alexzz, если делать все так, как ты говоришь, то все работает. Может ты все-таки выложишь твой код работы с ShellTreeView, а то догадываться, что у тебя не так, довольно сложно. |
Автор: Alexeis 29.9.2007, 20:03 | ||
Это сторонний компонент тут в общих можно поискать есть подробное описание и все нужные ссылки. |
Автор: Alexzz 30.9.2007, 11:04 |
Проблему победил. Создал новый проект, нанёс на форму все те-же компоненты, расположил их так-же, и скопировал все процедуры обработки событий. Вобщем сделал всё то-же самое что и было, но с нуля. И проблема исчезла! Значит это был какой-то глюк самого дельфи. |
Автор: MetalFan 30.9.2007, 11:15 |
скорее всего не исчезла, а спряталась до лучших времен ;) |
Автор: Alexzz 30.9.2007, 12:06 | ||
Спасибо за заряд оптимизма! ![]() Но я всё-же надеюсь что исчезла. Только что опробовал программу на самых разных папках с самыми разными файлами и проблемы не возникло. |
Автор: Snowy 1.10.2007, 11:43 |
Вообще компонентик убогий. Написан левой ногой и приводит к хорошим утечкам памяти. Уже из-за этого его не стоит использовать... |
Автор: Alexzz 6.10.2007, 18:34 |
Ну,... уже использовал. Вроде пока работает. Возник новый вопрос. Начал работать с прогой на стареньком компике у которого есть 3.5'' дисковод. Дело в том, что при каждом запуске проги этот шелтривью опрашивает все имеющиеся в системе накопители, в том числе и дисковод. И вот это действие сильно действует на нервы. Во первых это большая задержка, во вторых он начинает гонять головку дисковода взад-вперёд несколько раз туды-сюды, при этом возникает соответствующий бесящий меня звук. Вопрос: Можно ли каким-то образом запретить компоненту опрашивать дисковод при запуске? В крайнем случае сказать ему, что нету никаких дисководов в системе... |