function GetListSel(id: Integer): Integer;
begin
GetListSel := SendDlgItemMessage(hParentWnd, id,
LB_GETCURSEL, 0, 0);
end;
//Получение количества строк
function GetListCount(id: Integer): Integer;
begin
GetListCount := SendDlgItemMessage(hParentWnd, id,
LB_GETCOUNT, 0, 0);
end;
//Получение текста строки по ее индексу
function GetListItemText(id: Integer; index: Integer):String;
var buffer: String;
begin
SetLength(buffer,
SendDlgItemMessage(hParentWnd, id, LB_GETTEXTLEN,
index, 0)
);
SendDlgItemMessage(hParentWnd, id, LB_GETTEXT, index,
Integer(Addr(buffer)));
GetListItemText := buffer;
end;
Функции и процедуры листинга 2.19 дадут возможность управлять текстовыми полями ( Edit и Memo).
...Листинг 2.19.
Управление текстовыми полями
//Получение позиции первого выделенного символа (нумерация с нуля)
function GetSelStart(id: Integer): Integer;
var selStart, selEnd: Integer;
begin
SendDlgItemMessage(hParentWnd, id, EM_GETSEL,
Integer(Addr(selStart)),
Integer(Addr(selEnd)));
GetSelStart := selStart;
end;
//Получение длины выделенного фрагмента текста
function GetSelLength(id: Integer): Integer;
var selStart, selEnd: Integer;
begin
SendDlgItemMessage(hParentWnd, id, EM_GETSEL,
Integer(Addr(selStart)),
Integer(Addr(selEnd)));
GetSelLength := selEnd – selStart;
end;
//Выделение фрагмента текста (позиция первого символа с нуля)
procedure SetSel(id: Integer; start, length: Integer);
begin
SendDlgItemMessage(hParentWnd, id, EM_SETSEL, start,
start + length);
end;
//Получение выделенного фрагмента текста
function GetSelText(id: Integer): String;
var allText: String;
begin
allText := GetText(id);
GetSelText := Copy(allText, GetSelStart(id)+1,GetSelLength(id));
end;
//Замена выделенного текста
procedure ReplaceSelText(id: Integer; newText: String);
begin
SendDlgItemMessage(hParentWnd, id, EM_REPLACESEL,
0, Integer(PAnsiChar(newText)));
end;
В листинге 2.20 приводятся функции и процедуры, которые можно с одинаковым успехом применять ко всем элементам управления.
...Листинг 2.20.
Общие функции и процедуры
//Установка текста окна
procedure SetText(id: Integer; str: String);
begin
SetWindowText(GetDlgItem(hParentWnd, id), PAnsiChar(str));
end;
//Получение текста окна
function GetText(id: Integer): String;
var buffer: String;
begin
SetLength(buffer, GetWindowTextLength(hParentWnd));
GetWindowText(hParentWnd, PAnsiChar(buffer), Length(buffer));
GetText := buffer;
end;
//Активизация/деактивизация окна
procedure SetEnabled(id: Integer; fEnabled: BOOL);
begin
EnableWindow(GetDlgItem(hParentWnd, id), fEnabled);
end;
Реакция на события элементов управления
При возникновении какого-либо предусмотренного для элемента управления события родительскому окну посылается сообщение WM_COMMAND.
...Примечание
Сообщение WM_COMMAND приходит также при перерисовке так называемых «самоперерисовывающихся» (Owner Dr aw) элементов управления. Однако ввиду специфики данного вопроса и ограниченности объема г лавы мы его рассматривать не будем.
Итак, когда родительское окно получает сообщение WM_COMMAND, то из двух прилагающихся параметров (lParam и wParam) можно извлечь следующие сведения:
• старшие 16 бит wParam представляют собой целочисленный код уведомления, позволяющий определить, что же именно произошло с элементом управления;
• младшие 16 бит wParam представляют собой идентификатор элемента управления, состояние которого изменилось (именно этот идентификатор мы передавали вместо дескриптора меню при создании элементов управления);
• lParam содержит дескриптор (HWND) окна элемента управления, состояние которого изменилось.
Для выделения старших 16 бит из 32-битного значения можно использовать функцию HiWord. Для получения младших 16 бит можно использовать функцию с именем LoWord. Обе они объявлены в модуле Windows.
В качестве примеров можно привести следующие коды уведомлений:
• BN_CLICKED – нажата кнопка;
• EN_CHANGE – изменен текст в текстовом поле;
• LBN_SELCHANGE – изменилось выделение в списке;
• CBN_SELCHANGE – изменилось выделение в раскрывающемся списке.
Эти и все остальные константы уведомлений стандартных элементов управления объявлены в модуле Messages.
...Примечание
Коды уведомлений рассматриваемых в этой г лаве элементов управления приводятся в приложении 3.
Пример приложения
Рассмотрим небольшой пример, иллюстрирующий принцип работы с элементами управления, помещенными на форму описанным ранее способом. Проект этого приложения называется ControlsDemo.
Не будем заострять внимание на регистрации класса главного окна приложения, так как она аналогична приведенной в листинге 2.4. Рассмотрим создание окна с элементами управления в нем (листинг 2.21).
...Листинг 2.21.
Создание главного окна приложения (с элементами управления)
program ControlsDemo;
uses
Windows, Messages,
Controls in \'Controls.pas\
{$R *.res}
var
hMainWnd: HWND;
hInst: Cardinal;
mess: MSG;
//Функция обработки сообщений
…
//Создание окна и цикла обработки сообщений
begin
hInst := GetModuleHandle(nil);
//Регистрация и создание главного окна
if not RegisterWindow() then Exit;
hMainWnd := CreateWindow(
\'MyWindowClass\', //Имя класса окна
\'Главное окно\', //Заголовок окна
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, //Координата X по умолчанию
CW_USEDEFAULT, //Координата Y по умолчанию
CW_USEDEFAULT, //Ширина по умолчанию