Александр Чиртик - Программирование в Delphi. Трюки и эффекты
- Название:Программирование в Delphi. Трюки и эффекты
- Автор:
- Жанр:
- Издательство:Array Издательство «Питер»
- Год:2010
- Город:Санкт-Петербург
- ISBN:978-5-49807-118-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Александр Чиртик - Программирование в Delphi. Трюки и эффекты краткое содержание
Программирование в Delphi. Трюки и эффекты - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Окно открытия и сохранения файла
Чтобы использовать возможности окна открытия файла, достаточно воспользоваться функцией, представленной в листинге 2.23.
function ShowOpen(strFilter: string; nFilterIndex: Integer= 0;
strInitFileName: string = '';
var
ofn: OPENFILENAME;
begin
ZeroMemory(Addr(ofn), SizeOf(ofn));
//Формирование буфера (260 символов)
SetLength(strInitFileName, MAX_PATH);
PrepareFilterString(strFilter);
//Заполнение структуры для окна
ofn.lStructSize:= SizeOf(ofn);
ofn.hWndOwner:= hParentWnd;
ofn.hInstance:= hAppInst;
ofn.lpstrFilter:= PAnsiChar(strFilter);
ofn.nFilterIndex:= nFilterIndex;
ofn.lpstrFile:= PAnsiChar(strInitFileName);
ofn.nMaxFile:= MAX_PATH;
ofn.lpstrTitle:= pAnsiChar(strTitle);
ofn.Flags:= OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_HIDEREADONLY;
//Отображение окна и обработка результата
if(GetOpenFileName(ofn) = True) then
ShowOpen:= ofn.lpstrFile;
end;
Приведенная в листинге 2.23 функция возвращает непустую строку – полный путь файла в случае, если пользователь выбрал или ввел имя файла. Здесь главной трудностью является заполнение довольно большой структуры OPENFILENAME. В данном примере используются только базовые возможности окна открытия файла и лишь некоторые из поддерживаемых им флагов (поле Flags):
• OFN_FILEMUSTEXIST – при этом установленном флаге, если окно успешно завершило свою работу, можно быть уверенным, что результирующий путь является путем существующего файла;
• OFN_PATHMUSTEXIST – данный флаг не дает ввести имя файла в несуществующей папке (например, при вводе c: \docs\mydoc1.doc, если папки docs не существует, будет выдано соответствующее сообщение);
• OFN_HIDEREADONLY – позволяет скрыть флажок Только для чтения.
Теперь отдельно рассмотрим, зачем в приведенном примере вызывается дополнительная функция PrepareFilterString (листинг 2.24).
procedure PrepareFilterString(var strFilter: string);
var
i: Integer;
begin
for i:= 1 to length(strFilter) do
if (strFilter[i] = '|') then strFilter[i]:= #0;
end;
Дело в том, что при задании фильтров (поле lpstrFile) требуется, чтобы каждое название и обозначение фильтров были отделены символом #0, а за последним фильтром шла последовательность из двух нулевых символов. На практике задавать строку из нескольких фильтров в следующем виде недостаточно удобно:
'Текстовые файлы'+ #0 + '*.txt'+ #0 + 'Все файлы'+ '*.*'+ #0 + #0
Поэтому часто применяются другие разделители, которые впоследствии преобразуются в символы #0. В данном случае в качестве разделителя используется символ |, благодаря чему приведенная выше строка фильтра может быть записана так:
'Текстовые файлы|*.txt |Все файлы|*.*||'
Согласитесь, что получилось более кратко и понятно.
Теперь обратимся к окну сохранения файла. Для его вызова достаточно переделать код из листинга 2.23 следующим образом (листинг 2.25).
function ShowSave(strFilter: string; nFilterIndex: Integer = 0;
strInitFileName: string = '';
strTitle: string = 'Сохранение файла'):string;
var
ofn: OPENFILENAME;
begin
ZeroMemory(Addr(ofn), SizeOf(ofn));
//Формирование буфера (260 символов)
SetLength(strInitFileName, MAX_PATH);
PrepareFilterString(strFilter);
//Заполнение структуры для окна
ofn.lStructSize:= SizeOf(ofn);
ofn.hWndOwner:= hParentWnd;
ofn.hInstance:= hAppInst;
ofn.lpstrFilter:= PAnsiChar(strFilter);
ofn.nFilterIndex:= nFilterIndex;
ofn.lpstrFile:= PAnsiChar(strInitFileName);
ofn.nMaxFile:= MAX_PATH;
ofn.lpstrTitle:= pAnsiChar(strTitle);
ofn.Flags:= OFN_PATHMUSTEXIST or OFN_OVERWRITEPROMPT;
//Отображение окна и обработка результата
if (GetSaveFileName(ofn) = True) then
ShowSave:= ofn.lpstrFile;
end;
Здесь дополнительно к упомянутому ранее флагу OFN_PATHMUSTEXIST добавлен флаг OFN_OVE RWRITEPROMPT для того, чтобы при указании имени уже существующего файла был задан вопрос, желает ли пользователь заменить этот файл.
Окно для выбора цвета
Код вызова следующего окна – окна для выбора цвета – приведен в листинге 2.26.
function ShowChooseColor(lastColor: COLORREF = 0):COLORREF;
var
choose: TChooseColor;
begin
ZeroMemory(Addr(choose), SizeOf(choose));
//Заполнение структуры для окна
choose.lStructSize:= SizeOf(choose);
choose.hWndOwner:= hParentWnd;
choose.hInstance:= hAppInst;
choose.rgbResult:= lastColor;
choose.lpCustColors:= Addr(colors);
choose.Flags:= CC_RGBINIT or CC_ANYCOLOR or CC_FULLOPEN;
//Отображение окна и обработка результата
if (ChooseColor(choose) = True) then ShowChooseColor:= choose.rgbResult
else ShowChooseColor:= lastColor;
end;
Здесь также заполняется специальная структура. Для этого используются следующие флаги:
• CC_RGBINIT – использовать значение поля rgbResult в качестве предустановленного значения цвета (по умолчанию как ранее выбранного);
• CC_ANYCOLOR – отображать все доступные предопределенные цвета (левая половина, рис. 2.4);

Рис. 2.4. Окно для выбора цвета
• CC_FULLOPEN – раскрывать панель подбора цвета (правая половина окна, рис. 2.4).
Стоит пояснить, что за переменная, а точнее, адрес, сохраняется в поле lpCustColors – это массив из 16 значений типа COLORREF:
colors: array [1..16] of COLORREF;
Обратите внимание на 16 квадратов в левой нижней области окна (рис. 2.4) – это места для определенных пользователем цветов. Для заполнения этой области окна и используются значения из массива colors. Массив может быть как локальным, так и глобальным (что иногда удобнее, так как значения определенных пользователем цветов в этом случае сохраняются между вызовами окна выбора цвета).
Окно для выбора шрифта
Для вывода окна для выбора шрифта подойдет функция, приведенная в листинге 2.27.
function ShowChooseFont(var font: LOGFONT):BOOL;
var
choose: TChooseFont;
begin
ZeroMemory(Addr(choose), SizeOf(choose));
//Заполнение структуры для окна
choose.lStructSize:= SizeOf(choose);
choose.hWndOwner:= hParentWnd;
choose.hInstance:= hAppInst;
choose.lpLogFont:= Addr(font);
choose.Flags:= CF_BOTH or CF_INITTOLOGFONTSTRUCT;
//Отображение окна и обработка результата
if (ChooseFont (choose) = True) then
begin
CopyMemory(Addr(font), choose.lpLogFont, SizeOf(font));
ShowChooseFont:= True;
end
else ShowChooseFont:= False;
end;
Здесь используются флаги окна, имеющие следующие значения:
• CF_BOTH – позволяет отображать экранные и принтерные шрифты (для отображения либо экранных, либо принтерных шрифтов можно использовать флаги CF_SCREENFONTS и CF_PRINTERFONTS соответственно);
• CF_INITTOLOGFONTSTRUCT – позволяют выбрать в окне шрифт, соответствующий (или максимально похожий) шрифту, описываемому структурой LOGFONT, указатель на которую сохраняется в поле lpLogFont.
Окно для выбора папки
Чтобы иметь возможность пользоваться окном Обзор папок, можно использовать функцию, представленную в листинге 2.28.
function ShowChooseFolder(strTitle: string):string;
var
choose: BROWSEINFO;
buffer: string;
pidl: PItemIDList;
begin
ZeroMemory(Addr(choose), SizeOf(choose));
SetLength(buffer, MAX_PATH);
//Заполнение структуры для окна
choose.hwndOwner:= hParentWnd;
choose.pi dlRoot:= nil; //Корень – папка Рабочего стола
choose.pszDisplayName:= PAnsiChar(buffer);
choose.lpszTitle:= PAnsiChar(strTitle);
choose.ulFlags:= 0;
//Вывод окна и обработка результата
Читать дальшеИнтервал:
Закладка: