Читаем Delphi. Трюки и эффекты полностью

Листинг 4.26.

Поиск по дереву каталогов

function SearchInTree(folder, mask: String; flags: DWORD;

names: TStrings; addpath: Boolean = False): Boolean;

var

hSearch: THandle;

FindData: WIN32_FIND_DATA;

bRes: Boolean; //Если равен True, то нашли хотя бы один файл или каталог

begin

//Осуществляем поиск в текущей папке

bRes := SearchInFolder(folder, mask, flags, names, addpath);

//Продолжим поиск в каждом из подкаталогов

hSearch := FindFirstFile(PAnsiChar(folder + \'\*\'), FindData);

if (hSearch <> INVALID_HANDLE_VALUE) then

begin

repeat

if (String(FindData.cFileName) <> \'..\') and

(String(FindData.cFileName) <> \'.\') then

//Пропускаем . и ..

begin

if (FindData.dwFileAttributes and

FILE_ATTRIBUTE_DIRECTORY <> 0)

then

//Нашли подкаталог – выполним в нем поиск

if SearchInTree(folder + \'\\' + String(FindData.cFileName),

mask, flags, names, addpath)

then

bRes := True;

end;

until FindNextFile(hSearch, FindData) = False;

FindClose(hSearch);

end;

SearchInTree := bRes;

end;

В функции SearchlnTree не используется просмотр каталога folder вручную (при помощи API-функций) из соображений эффективности. Если захотите, можете реализовать поиск подкаталогов при помощи функции SearchlnFolder. Правда, при этом нужно будет завести дополнительный список (TStringList) для сохранения найденных в текущем каталоге подкаталогов. Элементы списка будут использоваться только один раз: для поиска в подкаталогах.

Возможный результат поиска с использованием функции SearchlnTree приводится на рис. 4.6.

Рис. 4.6. Поиск по дереву каталогов

С небольшими модификациями алгоритм рекурсивного обхода дерева каталогов, реализованный в листинге 4.25, можно использовать и при операциях, отличных от простого поиска: например, при копировании или удалении дерева каталогов. Для этого достаточно выполнять нужные операции над каждым найденным объектом.

Построение дерева каталогов

Рассмотрим довольно интересный пример, основанный на использовании функции поиска SearchlnFolder, – построение дерева каталогов для определенного диска (рис. 4.7).

Рис. 4.7. Дерево каталогов

Для простоты (и чтобы не отвлекать внимания от построения дерева) диск задается в программе жестко. При необходимости это можно легко исправить (как определять диски, вы уже знаете).

Рассмотрим работу приложения по порядку. Элемент управления TreeView на форме имеет имя tree. Содержимое списка изображений (ImageList), используемого деревом, приведено на рис. 4.8.

Рис. 4.8. Изображения для элементов дерева

Первый элемент дерева (соответствует диску) образуется при создании формы (листинг 4.27).

...

Листинг 4.27.

Создание первого элемента дерева – диска

procedure TForm3.FormCreate(Sender: TObject);

begin

//Корневой элемент дерева (диск)

root := tree.Items.Add(tree.Items.GetFirstNode, \'C:\');

root.ImageIndex := 0;

root.SelectedIndex := 0;

SetExpanded(root, False);

end;

Здесь и далее в примере root позволяет быстро получать доступ к корневому элементу дерева. Используемая в листинге 4.27 процедура применяется для установки состояния элементов дерева (листинг 4.28).

...
Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных