Валерий Борисок - Delphi. Трюки и эффекты
- Название:Delphi. Трюки и эффекты
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валерий Борисок - Delphi. Трюки и эффекты краткое содержание
«Delphi. Трюки и эффекты», как и все издания данной серии, адресована тем, кто хочет научиться делать с помощью уже знакомых программных пакетов новые, интересные вещи. В первой части книги многое говорится о среде разработки Delphi (самых последних версий) и программировании на языке Object Pascal. Благодаря этому издание подходит и новичкам, и начинающим программистам. Вторая (основная) часть книги описывает удивительные возможности, скрытые в языке, и на примерах учит читателя программистским фокусам – от «мышек-невидимок» и «непослушных окон» до воспроизведения МРЗ и управления офисными программами Word и Excel из приложений Delphi. Купив эту книгу, вы пройдете непростой путь к вершинам программистского мастерства весело и интересно.
Delphi. Трюки и эффекты - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Рис. 4.4. Преобразование путей
На всякий случай нужно уточнить, что в относительном пути элемент. указывает на текущую папку (никуда переходить не надо), а элемент. означает папку, расположенную на один уровень выше (родительскую папку). Также следует уточнить, что под абсолютным путем понимается путь, корневым элементом которого является \\ или <���диск>: \ (С: \, D: \ их д.).
Примечание
Все приведенные далее функции преобразования вы можете найти в модуле PathConvert, расположенном на диске, в папке с названием подраздела.
Преобразование длинных имен файлов в короткие и наоборот
Теперь рассмотрим реализацию преобразования путей. Сначала – преобразование между длинной и короткой формами. Выполняется это предельно просто, благо Windows API предусматривает соответствующие функции.
Преобразование длинного пути в короткий приводится в листинге 4.17.
Листинг 4.17.
Преобразование пути из длинной в короткую форму
function LongPathToShort(path: String): String;
var
buffer: String;
len: Integer;
begin
SetLength(buffer, MAX_PATH);
len := GetShortPathName(PAnsiChar(path), PAnsiChar(buffer),
MAX_PATH);
SetLength(buffer, len);
LongPathToShort := buffer;
end;
Соответственно, обратное преобразование пути может выглядеть следующим образом (листинг 4.18).
Листинг 4.18.
Преобразование пути из короткой в длинную форму
function ShortPathToLong(path: String): String;
var
buffer: String;
len: Integer;
begin
SetLength(buffer, MAX_PATH);
len := GetLongPathName(PAnsiChar(path), PAnsiChar(buffer),
MAX_PATH);
SetLength(buffer, len);
ShortPathToLong := buffer;
end;
При тестировании последнего листинга в Delphi 7 выяснилось, что API-функция GetLongPathName объявлена в модуле Windows. Возможно, в более старых или новых версиях Delphi это не так. Но в любом случае импортировать эту функцию из библиотеки Kernel32. dll предельно просто, достаточно поместить в модуль следующую строку:
function GetLongPathName(lpszLongPath: PChar;
lpszShortPath: PChar; cchBuffer: DWORD): DWORD;
stdcall; external kernel32 name \'GetLongPathNameA\
Преобразование абсолютного пути в относительный и наоборот
Теперь пришла очередь рассмотреть реализацию преобразований между абсолютной и относительной формами путей. Однако сначала рассмотрим небольшую, но полезную процедуру, используемую при преобразованиях. Процедура GetPathElements (листинг 4.19) формирует список строк из компонентов переданного ей пути (имен каталогов и имени целевого файла или каталога).
Листинг 4.19.
Разбиение пути на составляющие
procedure GetPathElements(path: String; elements: TStrings);
var
start, pos: Integer;
begin
start := 1;
for pos := 1 to Length(path) do
if path[pos] = \'\\' then
begin
if start <> pos then
//Выделим имя каталога
elements.Add(Copy(path, start, pos – start))
else
//Сочетание типа \'\\\' в середине пути пропускаем
;
start := pos + 1;
end;
pos := Length(path) + 1;
if start <> pos then
//Выделим имя последнего каталога или файла
elements.Add(Copy(path, start, pos – start));
end;
После применения процедуры GetPathElements работать с компонентами пути становится очень удобно, да к тому же и упрощается код функций преобразования, так как при их написании не нужно уделять внимание правильному выделению подстрок из строки полного пути.
Функция преобразования абсолютного пути в относительный (от заданной в параметре curdir папки) приводится в листинге 4.20.
Листинг 4.20.
Преобразование абсолютного пути в относительный
function AbsPathToRelative(path, curdir: String): String;
var
pathElements, curElements: TStrings;
outPath: String;
i, j: Integer;
begin
if Copy(path, 1, 2) <> Copy(curdir, 1, 2) then
begin
//Папки на разных дисках
AbsPathToRelative := path;
Exit;
end;
//Получение составляющих абсолютного и текущего пути
pathElements := TStringList.Create;
GetPathElements(path, pathElements);
curElements := TStringList.Create;
GetPathElements(curdir, curElements);
//Пропускаем одинаковые папки
i := 0;
while (i < curElements.Count) and (i < pathElements.Count)
and (CompareText(curElements[i], pathElements[i]) = 0) do Inc(i);
//Добавляем небходимое количество переходов вверх для того,
//чтобы из папки curdir попасть в общую для path и curdir папку
for j := i to curElements.Count-1 do
outPath := outPath + \'..\\
//Заходим из папки полученной (общей) папки в папку path
for j := i to pathElements.Count – 2 do
outPath := outPath + pathElements[j] + \'\\
//Последним добавляем имя конечной папки или файла
AbsPathToRelative := outPath + pathElements[pathElements.Count – 1];
//Списки строк больше не нужны
pathElements.Free;
curElements.Free;
end;
При преобразовании нужно учитывать, что пути, не принадлежащие одной иерархии (например, локальный и сетевой или пути, принадлежащие разным дискам, не могут быть представлены один относительно другого: у них нет общего родительского каталога.
Обратное преобразование относительного пути в абсолютный приведено в листинге 4.21. Здесь нужно отметить, что если путь папки curdirотносительный, то в итоге получим также относительный путь (только относительно другой папки). Поэтому функция и называется RelativePathToRelative, а не RelativePathToAbs.
Листинг 4.21.
Преобразование относительного пути в абсолютный
function RelativePathToRelative(path, curdir: String): String;
var
pathElements, curElements: TStrings;
outPath: String;
i: Integer;
begin
//Получение списка составляющих абсолютного и текущего пути
pathElements := TStringList.Create;
GetPathElements(path, pathElements);
curElements := TStringList.Create;
GetPathElements(curdir, curElements);
//Изначально находимся в последней папке пути curdir
//"Путешествуем" от текущей папки вверх или вниз
//по дереву каталогов
//(прибавляя или удаляя компоненты пути в список curElements)
for i := 0 to pathElements.Count–1 do
begin
if pathElements[i] = \'..\' then
//Вверх по дереву
if (curElements.Count > 0)then
curElements.Delete(curElements.Count – 1)
else
curElements.Append(\'..\')
else if pathElements[i] <> \'.\' then
//Вниз по дереву (знак текущей папки "." не изменяет
//положение)
curElements.Append(pathElements[i]);
end;
//Формируем результирующий путь
if (curElements.Count > 0) then outPath := curElements[0];
for i := 1 to curElements.Count-1 do
outPath := outPath + \'\\' + curElements[i];
RelativePathToRelative := outPath;
//Списки строк больше не нужны
pathElements.Free;
curElements.Free;
end;
Поиск
Поиск является неотъемлемой частью работы с файловой системой. Даже простой просмотр содержимого любого каталога сопряжен с использованием простейших, но все-таки поисковых средств (перебор и, возможно, отсеивание элементов каталога). Поэтому далее мы рассмотрим возможные варианты реализации двух удобных функций поиска: поиск по маске и атрибутам файлов в пределах заданной папки и такой же поиск по всему дереву каталогов, начиная от заданной корневой папки. Все рассмотренные далее функции поиска можно найти в модуле Search, расположенном на диске, в папке с названием подраздела.
Читать дальшеИнтервал:
Закладка: