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 Draw) элементов управления. Однако ввиду специфики данного вопроса и ограниченности объема главы оно рассматриваться не будет.

Таким образом, когда родительское окно получает сообщение 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).