СРСП

Тема: Управление техническими средствами через API.

Цель: знать как можно с помощью вызовов Windows API управлять объектами из VCL.

Разработчики библиотеки визуальных компонент (VCL) Delphi очень серьезно поработали над ее проектированием и воплощением в реальность. Как показывает практика, стандартного набора объектов обычно достаточно для создания реальных приложений. И, что более существенно, им (разработчикам) удалось решить очень сложную задачу, стоящую перед создателями любой среды визуального программирования - скрыть от программиста сложность и трудоемкость программирования в Windows и, в то же время, не лишать его возможности доступа к тем богатым возможностям системы, которые предоставляет Windows API.

Ниже рассмотрено несколько примеров, как с помощью вызовов Windows API можно управлять объектами из VCL.

Стандартная страница Палитры Компонент

Компоненты, расположенные на странице “Standard”, представляют из себя объектную оболочку для стандартных управляющих элементов Windows. Поэтому для них существуют ограничения, накладываемые самой системой. Например, 32Кб - максимальный размер текста в TMemo.

Для добавления в меню картинки можно использовать функцию API Windows SetMenuItemBitmaps(), например, следующим образом:

 

implementation

var

BMP1, BMP2 : TBitMap;

 procedure TForm1.FormCreate(Sender: TObject);

begin

BMP1:=TBitMap.Create;

BMP1.LoadFromFile('c:\images\uncheck.bmp');

BMP2:=TBitMap.Create;

BMP2.LoadFromFile('c:\images\check.bmp');

SetMenuItemBitmaps(File1.Handle, 1, MF_BYPOSITION, BMP1.Handle, BMP2.Handle);

end;

 procedure TForm1.FormDestroy(Sender: TObject);

begin

BMP1.Free;

BMP2.Free;

end;

 File1 это объект класса TMenuItem - пункт меню “File”. Значения параметров при вызове функции можно посмотреть в справочнике по Windows API.

При уничтожении меню освобождения связанных с ним картинок не происходит и их надо уничтожать вручную.

Вторая картинка BMP2 отображается рядом с пунктом меню, когда он выбран (Checked=True).

  TMemo

Компонент класса TMemo может содержать до 32К текста (для Windows 3.x) вследствие ограничения Windows.

Определение позиции каретки в TMemo.

 Можно использовать сообщения Windows API EM_LINEFROMCHAR и EM_LINEINDEX для определения текущей позиции каретки.

 procedure TForm1.ShowPosition;

var

LineNum: longint;

CharNum: longint;

begin

LineNum:= Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart,0);

CharNum:= Memo1.Perform(EM_LINEINDEX, LineNum, 0);

Label1.Caption := 'Line : '+ IntToStr(LineNum+1);

Label2.Caption := 'Position :' + IntToStr((Memo1.SelStart -

CharNum)+1);

end;

 Метод Perform, определенный в классе TControl, посылает сообщение своему же объекту, то есть его использование имеет тот же эффект, что и вызов функции API SendMessage():

 SendMessage(Memo1.Handle,EM_LINEFROMCHAR, Memo1.SelStart,0);

Операция UnDo в TMemo.

Отмена последнего редактирования (операция UnDo) в объекте класса TMemo выполняется так же с помощью сообщений, посылаемых в данный объект:

 procedure TForm1.UnDoClick(Sender: TObject);

begin

if Memo1.Perform(EM_CANUNDO, 0, 0)<>0 then

Memo1.Perform(EM_UNDO, 0, 0);

end;

В справочнике по Windows API описаны сообщения, которые можно послать в объект TMemo для управления его поведением. Кроме вышеназванных, имеется еще несколько полезных:

 EM_EMPTYUNDOBUFFER Сбрасывает флажок UnDo

EM_GETHANDLE Получает указатель на буфер с текстом

EM_LINESCROLL Прокрутка текста в окне TMemo

EM_SETHANDLE Установка указателя на буфер с текстом

EM_SETTABSTOPS Устанавливает табуляцию в окне с текстом

TListBox, TComboBox

Windows накладывает ограничение на количество элементов в списке этих управляющих элементов. В случае Windows 3.x это количество равно 5440, в Windows’95 - 32767.

Как получить горизонтальную прокрутку (scrollbar) в ListBox?

Так же как в случае с TMemo, здесь можно использовать сообщения. Например, сообщение может быть отослано в момент создания формы:

procedure TForm1.FormCreate(Sender: TObject);

begin

ListBox1.Perform(LB_SETHORIZONTALEXTENT, 1000, Longint(0));

end;

Второй параметр в вызове - ширина прокрутки в точках.

 Вставка графики в ListBox.

 У класса TListBoxTComboBox тоже) есть свойство Style, определяющее порядок рисования объекта. По-умолчанию оно установлено в lbStandard и за внешний вид объекта отвечает Windows. Если установить это значение в lbOwnerDrawFixed или lbOwnerDrawVariable, то можно несколько разнообразить внешний вид объекта. Давайте построим для примера ListBox, отображающий названия файлов формата .BMP из какой-либо директории вместе с их картинками.

Прежде всего, оказывается, что вовсе не нужно заполнять ListBox вручную именами файлов, для этого достаточно послать ему сообщение:

procedure TForm1.Button1Click(Sender: TObject);

var

s : String;

begin

s:='c:\windows\*.bmp'#0;

ListBox1.Perform(LB_DIR, DDL_READWRITE, Longint(@s[1]));

end;

 Далее, как уже было сказано, свойство Style нужно установить в lbOwnerDrawFixed и создать обработчик события OnDrawItem:

procedure TForm1.ListBox1DrawItem(Control: TWinControl;

Index: Integer; Rect: TRect; State: TOwnerDrawState);

var

Bitmap: TBitmap;

Offset: Integer;

BMPRect : TRect;

begin

with (Control as TListBox).Canvas do

begin

{очищаем прямоугольник}

FillRect(Rect);

{считываем картинку}

Bitmap:=TBitMap.Create;

Bitmap.LoadFromFile ('c:\windows\'+ListBox1.Items[Index]);

if Bitmap <> nil then begin

{вычисляем квадрат для показа картинки}

BMPRect:=Bounds(Rect.Left + 2, Rect.Top + 2,

Rect.Bottom-Rect.Top-2, Rect.Bottom-Rect.Top-2);

{рисуем картинку}

StretchDraw(BMPRect, BitMap);

Offset := Rect.Bottom-Rect.Top + 6;

end;

{выводим текст}

TextOut(Rect.Left+Offset,Rect.Top, Listbox1.Items[Index]);

{не забыть освободить!}

Bitmap.Free;

end;

end;

Чтобы картинки получились побольше, значение свойства ItemHeight можно увеличить.

 Есть около двух десятков сообщений, которые можно послать в объекты класса TListBox и TComboBox.

Контрольные вопросы

1.      Какие еще примеры можете привести


Ұқсас жұмыстар

Вуздағы кафедра құжат айналымын DELPHI көмегімен дамытуды ұйымдастыру
Акционерлік қоғамның қаржылық жағдайына жүргізілген талдау
Тіршілік қауіпсіздігі негіздері
Төлем көзінен салық салынбайтын табыстары барлар
Баян Сұлу АҚ мысалында операциялық және қаржылық тұтқа әсеріне талдау жүргізу
Оқу процесін ұйымдастырудың кредиттік жүйесі
Туристік өнімді қалыптастыру
Тұрғын үймен қамту бағдарламалары
Аммиактың алмасуы
Сызықтық регрессия