- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Delphi. Трюки и эффекты - Валерий Борисок
Шрифт:
Интервал:
Закладка:
Листинг 4.12.
Определение расположения папки для временных файлов
function GetTempDir(): String;
var
buffer: String;
len: UINT;
begin
SetLength(buffer, MAX_PATH + 1);
len := GetTempPath(MAX_PATH, PAnsiChar(buffer));
SetLength(buffer, len);
GetTempDir := buffer;
end;
Кроме того, Windows API предусматривает очень полезную функцию, избавляющую программиста от необходимости подбирать имена временных файлов так, чтобы они были уникальными в пределах заданной папки (это не обязательно должна быть папка Temp ). Имя этой функции – GetTempFileName. Пример ее использования приведен в листинге 4.13.
...Листинг 4.13.
Определение имени временного файла
function GetTempFile(prefix: String = '~mytmp'): String;
var
buffer, dir: String;
begin
dir := GetTempDir();
//Получение имени временного файла (система сама определяет
имя,
//уникальное для заданной папки)
SetLength(buffer, MAX_PATH + 1);
GetTempFileName(PAnsiChar(dir), PAnsiChar(prefix), 0,
PAnsiChar(buffer));
GetTempFile := buffer;
end;
Приведенная в листинге 4.13 функция в качестве папки для временных файлов использует папку Temp. Однако функцию GetTempFileName можно использовать для получения имен файлов в пределах любой папки.
Кроме пути папки, в которой необходимо создать временный файл, функция GetTempFileName принимает строку-префикс для имени временного файла и целочисленное значение (третий параметр). Если третий параметр не равен нулю, то его значение в шестнадцатеричной форме просто прибавляется справа к строке prefix. Никаких проверок на уникальность получившегося имени файла при этом не производится. Если же третий параметр установить в 0, то система сама сформирует шестнадцатеричное значение так, чтобы имя файла было уникальным в заданной папке. Кроме того, при этом создается и сам файл.
Буфер (последний параметр функции GetTempFileName) должен вмещать как минимум МАХРАТН символов, так как функция записывает в него полный путь временного файла.
Пример работы функций определения папки для временных файлов, получения имени для временного файла, а также определения системных папок Windows приводится на рис. 4.2.
Рис. 4.2. Папки WINDOWS, system, Temp и имя для временного файла
Прочие системные пути
В Windows существует ряд других системных путей, которые так или иначе могут пригодиться. Определяются они не менее просто, чем пути к системным папкам (листинг 4.14).
...Листинг 4.14. Определение прочих системных путей
function GetSpecialDir(dirtype: Integer): String;
var
buffer: String;
begin
SetLength(buffer, MAX_PATH + 1);
SHGetSpecialFolderPath(0, PAnsiChar(buffer), dirtype, False);
GetSpecialDir := buffer;
end;
Здесь используется функция командной оболочки файловой системы (Windows Shell) SHGetSpecialFolderPath, ее объявление находится в модуле ShlObj. Среди параметров этой функции самыми значимыми для нас (кроме буфера длиной минимум МАХРАТН символов для помещения в него пути) являются два последних. Третий параметр функции SHGetSpecialFolderPath используется для указания того, расположение какой именно папки нас интересует. Если четвертый параметр функции SHGetSpecialFolderPath не равен False, то запрошенная папка будет создана, если до этого она не существовала.
Пример использования функции GetSpesialDir для составления списка (в элементе управления ListView) некоторых системных путей приведен в листинге 4.15. Из него вы также сможете узнать имена целочисленных констант, идентифицирующих некоторые папки.
...Листинг 4.15.
Использование функции GetSpecialDir
procedure TForm3.Button1Click(Sender: TObject);
var
item: TListItem;
begin
lvwPathes.Clear;
//Определение путей некоторых системных каталогов
//..Рабочий стол
item := lvwPathes.Items.Add();
item.Caption := 'Рабочий стол
item.SubItems.Insert(0, GetSpecialDir(CSIDL_DESKTOPDIRECTORY));
//..Избранное
item := lvwPathes.Items.Add();
item.Caption := 'Избранное
item.SubItems.Insert(0, GetSpecialDir(CSIDL_FAVORITES));
//..Шрифты
item := lvwPathes.Items.Add();
item.Caption := 'Шрифты
item.SubItems.Insert(0, GetSpecialDir(CSIDL_FONTS));
//..Мои документы
item := lvwPathes.Items.Add();
item.Caption := 'Мои документы
item.SubItems.Insert(0, GetSpecialDir(CSIDL_PERSONAL));
//..Последние документы
item := lvwPathes.Items.Add();
item.Caption := 'Последние документы
item.SubItems.Insert(0, GetSpecialDir(CSIDL_RECENT));
//..История
item := lvwPathes.Items.Add();
item.Caption := 'История
item.SubItems.Insert(0, GetSpecialDir(CSIDL_HISTORY));
//..Отправить
item := lvwPathes.Items.Add();
item.Caption := 'Отправить
item.SubItems.Insert(0, GetSpecialDir(CSIDL_SENDTO));
//..Меню Пуск
item := lvwPathes.Items.Add();
item.Caption := 'Пуск
item.SubItems.Insert(0, GetSpecialDir(CSIDL_STARTMENU));
//..Меню Программы
item := lvwPathes.Items.Add();
item.Caption := 'Программы
item.SubItems.Insert(0, GetSpecialDir(CSIDL_PROGRAMS));
//..Меню Автозагрузка
item := lvwPathes.Items.Add();
item.Caption := 'Автозагрузка
item.SubItems.Insert(0, GetSpecialDir(CSIDL_STARTUP));
//..Папка с шаблонами документов
item := lvwPathes.Items.Add();
item.Caption := 'Шаблоны
item.SubItems.Insert(0, GetSpecialDir(CSIDL_TEMPLATES));
end;
Результат работы процедуры из листинга 4.14 приводится на рис. 4.3.
Рис. 4.3. Прочие системные пути Windows
В приведенной в листинге 4.15 процедуре определены не все пути, доступные с использованием функции SHGetSpecialFolderPath. Дело в том, что существует ряд виртуальных (не существующих реально на диске) папокМой компьютер, Принтеры, Сетевое окружение и т д.
Для некоторых упоминаемых в листинге 4.15 папок есть также аналогичные папки, содержимое которых доступно всем пользователям:
• CSIDL_COMMON_DESKTOPDIRECTORY – содержимое этой папки отображается на Рабочем столе всех пользователей;
• CSIDL_COMMON_DOCUMENTS – общие документы;
• CSIDL_COMMON_FAVORlTES—общие элементы папки Избранное;
• CSIDL_COMMON_PROGRAMS – общие для всех пользователей программы (пункт Программы меню Пуск);
• CSIDL_COMMON_STARTMENU – общие элементы, отображаемые вменю Пуск;
• CSIDL_COMMON_STARTUP – общие элементы меню Автозагрузка;
• CSIDL_COMMON_TEMPLATES – папка с общими для всех пользователей шаблонами документов....Примечание
Большинство из перечисленных выше путей определяются только в системах Windows на ядре NT, но не в Windows 95/98/Ме.
Определение и установка текущей папки
Во время работы каждого приложения для него запоминается папка, которая считается текущей (для этого приложения). При грамотном управлении текущей папкой удобно использовать рассмотренные далее относительные пути.
Для определения текущей папки приложения можно воспользоваться функцией GetCurrentDir, приведенной в листинге 4.16.
...Листинг 4.16.
Определение текущей папки
function GetCurrentDir(): String;
var
len: Integer;
buffer: String;
begin
SetLength(buffer, MAX_PATH + 1);
len := GetCurrentDirectory(MAX_PATH, PAnsiChar(buffer));
GetCurrentDir := Copy(buffer, 1, len);
end;
Функция определения пути текущей папки основана на применении соответствующей API-функции GetCurrentDirectory. Вполне естественно, что она имеет пару – функцию для задания текущего каталога SetCurrentDirectory. Объявление этой функции:
...function SetCurrentDirectory(lpPathName: PChar): BOOL; stdcall;
Функция принимает путь папки и возвращает ненулевое значение в случае успешного выполнения.
Преобразование путей
Рассмотрим несколько функций, которые могут пригодиться, если возникнет необходимость преобразования путей. Имеется в виду прежде всего преобразование имен файлов в формат MS-DOS и обратно. Этот вид преобразования наглядно продемонстрирован на рис. 4.4 (верхняя часть формы).
Иногда оказывается полезным представлять пути относительно какой-нибудь папки, но не относительно корневого каталога диска. Например, представьте, что вы разрабатываете приложение, документы которого, являющиеся неделимыми для пользователя, могут фактически состоять из большого количества файлов, расположенных в разных папках (Images, Movies, Embed). Сами папки расположены в том же каталоге, где и основной файл документа, или ниже по иерархии (во вложенных папках). Как добиться того, чтобы при копировании приложения со всеми нужными папками в другое место (на другой диск или компьютер, в другую папку) его по-прежнему можно было открыть, при этом рассчитывая, что в папках Images, Movies и Embed содержится не только нужная информация. Последнее говорит о том, что приложение должно «знать», какие файлы и в каких папках ему действительно необходимы. В таком случае пригодится относительный путь, который несет в себе информацию о количестве и направлении переходов из каталога, заданного в качестве корневого, для того чтобы мы смогли найти указанный в этом пути файл или папку.
Преобразование из абсолютного в относительный путь и наоборот продемонстрировано на рис. 4.4 (нижняя часть формы). При этом в качестве исходного пути берется содержимое текстового поля Исходный длинный путь, а в качестве пути папки для построения относительного пути – содержимое поля Текущая папка.
Рис. 4.4. Преобразование путей
На всякий случай нужно уточнить, что в относительном пути элемент. указывает на текущую папку (никуда переходить не надо), а элемент. означает папку, расположенную на один уровень выше (родительскую папку). Также следует уточнить, что под абсолютным путем понимается путь, корневым элементом которого является \ или <диск>: (С: , D: их д.).

