Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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.

Автор: Alexeis 26.9.2007, 23:01
Цитата(BaD_SeCt0R @  26.9.2007,  22:32 Найти цитируемый пост)
Alexzz, как ни проверял, даже открывал папку с количеством файлов почти равным 5000. Да, работает жутко медленно, но никаких ошибок не обнаружил. 

  Аналогично. Проверял с указанными параметрами. Похоже ошибка в чем-то другом либо при взаимодействии с другими компонентами.

Автор: Alexzz 29.9.2007, 16:54
Да, но в чём именно? Всё взаимодействие я уже описал. Всё что я делаю, это считываю свойство path. Я тут одно время думал, что проблема связана с сохранением path в ини-файл и восстановлении его при следующем запуске. Но теперь я даже это убрал. Трабл всё равно существует. Ничего не понимаю!  smile

Добавлено @ 17:09
Цитата(Sanchezzz @ 26.9.2007,  22:07)
ShellTreeView это убого базовый TreeView. Лучше все делать самому ручками и для этих целий virtualtreeview уж точно не загнется в поставки с ним идет демы. там есть пример дерева каталогов  до вольно быстро работает.... + ко все сему тут есть отличные статьи на форумы о нем в помощь в освоении..

Поподробнее пожалуйста, это есть в папках дельфи? В какой именно папке лежит эта демка? В списке компонентов у меня нету virtualTreeView. У меня 7 ентерпрайз.

Автор: BaD_SeCt0R 29.9.2007, 17:10
А что в path? Может там у тебя значение инвалидное?

Автор: Alexzz 29.9.2007, 17:16
Цитата(BaD_SeCt0R @ 29.9.2007,  17:10)
А что в path? Может там у тебя значение инвалидное?

Дык я туда ничего не пишу больше. Только читаю. И из полученной от туда строки нормально извлекается имя файла и путь к нему.

Автор: BaD_SeCt0R 29.9.2007, 17:33
Alexzz, если делать все так, как ты говоришь, то все работает. Может ты все-таки выложишь твой код работы с ShellTreeView, а то догадываться, что у тебя не так, довольно сложно.

Автор: Alexeis 29.9.2007, 20:03
Цитата(Alexzz @  29.9.2007,  16:54 Найти цитируемый пост)
Поподробнее пожалуйста, это есть в папках дельфи? В какой именно папке лежит эта демка? В списке компонентов у меня нету virtualTreeView. У меня 7 ентерпрайз.

  Это сторонний компонент тут в общих можно поискать есть подробное описание и все нужные ссылки.

Автор: Alexzz 30.9.2007, 11:04
Проблему победил.

Создал новый проект, нанёс на форму все те-же компоненты, расположил их так-же, и скопировал все процедуры обработки событий. Вобщем сделал всё то-же самое что и было, но с нуля. И проблема исчезла!
Значит это был какой-то глюк самого дельфи.

Автор: MetalFan 30.9.2007, 11:15
Цитата(Alexzz @  30.9.2007,  11:04 Найти цитируемый пост)
И проблема исчезла!

скорее всего не исчезла, а спряталась до лучших времен ;)

Автор: Alexzz 30.9.2007, 12:06
Цитата(MetalFan @ 30.9.2007,  11:15)
скорее всего не исчезла, а спряталась до лучших времен ;)

Спасибо за заряд оптимизма! smile

Но я всё-же надеюсь что исчезла.
Только что опробовал программу на самых разных папках с самыми разными файлами и проблемы не возникло.

Автор: Snowy 1.10.2007, 11:43
Вообще компонентик убогий.
Написан левой ногой и приводит к хорошим утечкам памяти.
Уже из-за этого его не стоит использовать...

Автор: Alexzz 6.10.2007, 18:34
Ну,... уже использовал. Вроде пока работает. 
Возник новый вопрос.
Начал работать с прогой на стареньком компике у которого есть 3.5'' дисковод. Дело в том, что при каждом запуске проги этот шелтривью опрашивает все имеющиеся в системе накопители, в том числе и дисковод. И вот это действие сильно действует на нервы. Во первых это большая задержка, во вторых он начинает гонять головку дисковода взад-вперёд несколько раз туды-сюды, при этом возникает соответствующий бесящий меня звук.
Вопрос: Можно ли каким-то образом запретить компоненту опрашивать дисковод при запуске? В крайнем случае сказать ему, что нету никаких дисководов в системе...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)