Delphi. Трюки и эффекты - страница 20

Шрифт
Интервал

стр.

begin

SendDlgItemMessage(hParentWnd, id, LB_DELETESTRING, index, 0);

end;

//Выделение строки с заданным номером

procedure SetListSel(id: Integer; index: Integer);

begin

SendDlgItemMessage(hParentWnd, id, LB_SETCURSEL, index, 0);

end;

//Получение номера выделенной строки (LB_ERR, если нет выделения)

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.

В качестве примеров можно привести следующие коды уведомлений:


стр.

Похожие книги