//изменен текст в Edit

6001: if HIWORD(wParam) = EN_CHANGE then;

//изменен текст в Memo

6002: if HIWORD(wParam) = EN_CHANGE then;

end;

end;

else

begin

//Обработка по умолчанию

WindowFunc := DefWindowProc(hWnd, msg, wParam, lParam);

Exit;

end;

end;

WindowFunc := S_OK; //Сообщение обработано

end;

Приведенная в листинге 2.22 функция отнюдь не претендует на то, чтобы быть эталоном в порядке классификации сообщений от элементов управления. Иногда бывает полезно сразу классифицировать сообщения не по элементам управления, которые их прислали, а по типу. К тому же в ряде случаев можно предусмотреть один обработчик сообщений сразу для нескольких элементов управления, например для группы переключателей. В таком случае полезным окажется параметр 1 Par am сообщения WM_COMMAND.

Кстати, размер исполняемого файла этого приложения всего 19 Кбайт.

2.4. Стандартные диалоговые окна Windows

Теперь рассмотрим, как можно только при помощи функций Windows API вызывать некоторые распространенные диалоговые окна. Чтобы использовать API-функции и структуры с информацией для этих диалоговых окон, необходимо подключить следующие модули:

• CommDlg – для окон открытия/сохранения файла, выбора цвета и шрифта, поиска и замены текста;

• ShlObj и ActiveX – для окна выбора папки (второй модуль нужен для дос тупа к интерфейсу IMalloc, зачем – будет рассказано далее);

• Windows – помимо объявления основных структур и API-функций, этот модуль содержит объявления функций для работы с окнами подключения и отключения от сетевого ресурса (сетевого диска);

• ShellAPI – для системного окна О программе.

Вариант использования рассматриваемых в этом разделе диалоговых окон приведен в подразд. «Демонстрационное приложение».

Примечание

В приведенных далее примерах вызова диалоговых окон можно увидеть не объявленные, но используемые в программах переменные hApplnst и hParentWnd. Подразумевается, что это глобальные переменные, которые инициализируются вне процедур и функций, приведенных в примерах. Для инициализации этих переменных можно также написать специальную процедуру, например с именем I nit, в которую и передавать значения для hParentWnd и hApplnst.

Окно открытия/сохранения файла

Чтобы воспользоваться возможностями окна открытия файла, достаточно задействовать листинг 2.23.

Листинг 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 – при успешном завершении работы диалогового окна можно быть уверенным, что результирующий путь является путем существующего файла;