Читать книгу Delphi. Трюки и эффекты - Александр Чиртик - Страница 20
Глава 2
Уменьшение размера ЕХЕ-файла. Использование Windows API
2.3. Окно с элементами управления
Использование элементов управления
ОглавлениеЭлементы управления, как и все окна, управляются путем посылки им сообщений. Этим же способом они уведомляют родительские окна о некоторых произошедших событиях (например, выделение элемента в списке, нажатие кнопки и т. д.).
Описание наиболее используемых сообщений для рассматриваемых элементов управления приводится в приложении 3. Мы же рассмотрим, как можно упростить работу с элементами управления в некоторых частных случаях, написав для этого специальные функции.
Итак, в демонстрационном проекте для управления переключателями и флажками предусмотрены следующие функции и процедуры (листинг 2.16).
Листинг 2.16. Управление флажками и переключателями
//Установка/снятие флажка (установка/снятие переключателя)
procedure SetChecked(id: Integer; checked: BOOL);
var state: Integer;
begin
if (checked) then state := BST_CHECKED
else state := BST_UNCHECKED;
SendDlgItemMessage(hParentWnd, id, BM_SETCHECK, state, 0);
end;
//Получение информации о том, установлен ли флажок
//(установлен ли переключатель)
function GetChecked(id: Integer):BOOL;
begin
if (SendDlgItemMessage(hParentWnd, id, BM_GETCHECK, 0, 0) =
BST_CHECKED)
then GetChecked := True
else GetChecked := False;
end;
Функции и процедуры листинга 2.17 предназначены для управления элементом ComboBox.
Листинг 2.17. Управление раскрывающимся списком
//Добавление строки в список
procedure AddToCombo(id: Integer; str: String);
begin
SendDlgItemMessage(hParentWnd, id, CB_ADDSTRING, 0,
Integer(PAnsiChar(str)));
end;
//Удаление строки из списка
procedure DeleteFromCombo(id: Integer; index: Integer);
begin
SendDlgItemMessage(hParentWnd, id, CB_DELETESTRING, index, 0);
end;
//Выделение строки с заданным номером
procedure SetComboSel(id: Integer; index: Integer);
begin
SendDlgItemMessage(hParentWnd, id, CB_SETCURSEL, index, 0);
end;
//Получение номера выделенной строки (CB_ERR, если нет выделения)
function GetComboSel(id: Integer): Integer;
begin
GetComboSel := SendDlgItemMessage(hParentWnd, id,
CB_GETCURSEL, 0, 0);
end;
//Получение количества строк
function GetComboCount(id: Integer): Integer;
begin
GetComboCount := SendDlgItemMessage(hParentWnd, id,
CB_GETCOUNT, 0, 0);
end;
//Получение текста строки по ее индексу
function GetComboItemText(id: Integer; index: Integer):String;
var buffer: String;
begin
SetLength(buffer,
SendDlgItemMessage(hParentWnd, id, CB_GETLBTEXTLEN,
index, 0)
);
SendDlgItemMessage(hParentWnd, id, CB_GETLBTEXT, index,
Integer(Addr(buffer)));
GetComboItemText := buffer;
end;
Сходные функции и процедуры в листинге 2.18 предназначены для управления элементом ListBox.
Листинг 2.18. Управление списком
//Добавление строки в список
procedure AddToList(id: Integer; str: String);
begin
SendDlgItemMessage(hParentWnd, id, LB_ADDSTRING, 0,
Integer(PAnsiChar(str)));
end;
//Удаление строки из списка
procedure DeleteFromList(id: Integer; index: Integer);
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;