5.9.5. Кнопка (tButton) и кнопка с картинкой (tBitButton).

Свойство caption задает надпись на кнопке, а событие onClick позволяет выполнить необходимые действия в случае нажатия кнопки. Компонент tBitButton (потомок tButton) дает возможность вывода на кнопке рядом с текстом картинки, имя картинки задается свойством Glyph ("наклейка"). Картинка должна быть в формате Bitmap. Существует возможность в одном. bmp-файле по очереди (слева направо) располагать до 6 картинок. Обычно используют 2 (для свойства enabled, установленного в true и false соответственно). При enabled=false текст на кнопке становится "пассивным" (более серым, чем обычно), и рисуется соответствующая картинка, которую также обычно изображают "более серой". Другие пары — для состояний кнопки "нажата/не нажата". Кнопку tBitButton можно использовать вместо tButton без всяких изменений, если не задавать имя картинки. Это дает дополнительные возможности: в tBitButton можно установить цвет текста на кнопке, а в tButton нельзя.

5.9.6. Однострочный пункт ввода-вывода и редактирования текста (tEdit).

Помимо своей обычной функции может служить полной заменой однострочной метке при соответствующих установках свойств (цвет фона как у компонента, на котором расположен пункт, enabled=false и т. д.). При enabled=true возможен захват фокуса пунктом. В этом случае при Readonly=true можно выделять и копировать в буфер выделенный текст, а при Readonly=false текст можно также редактировать. Свойство text позволяет возвращать или устанавливать строку текста для пункта. Свойство MaxLength позволяет устанавливать максимальную длину вводимого текста в пределах от 1 до 255 символов. Если MaxLength=0 (по умолчанию), это эквивалентно 255 (autosize). AutoSelect=true позволяет тексту в пункте автоматически становиться выделенным при входе в пункт.

НЕ нашли? Не то? Что вы ищете?

5.9.7. Многострочный пункт ввода-вывода и редактирования текста (tMemo).

Аналогичен компоненту tEdit, но с произвольным количеством строк. Свойство Alignment задает режим выравнивания текста внутри компонента (по центру, левому или правому краю). Длина текста не должна превышать 64Kb. WordWarp задает режим переноса слов. ScrollBars позволяет показывать (или не показывать) внутри компонента линейки прокрутки по вертикали и горизонтали.

Вводимый/выводимый текст доступен либо как единый объект через свойство Text, либо через свойство Lines — как массив строк. Поскольку строки tMemo хранятся в объекте типа tStrings, к ним применимы все методы этого класса, например:

tMemo1.Lines. Add('эта строка добавляется в конец текста');

5.9.8. Выпадающий список (tComboBox).

Потомок tEdit. Выглядит так же, но имеет "стрелку вниз" справа от поля ввода-вывода текста. При нажатии на нее выпадает список строк, из которых можно выбрать нужную, которую обычно и показывают после этого в поле ввода-вывода. Доступ к выпадающим строкам идет через свойство Items, у которого, в свою очередь, есть свойство Strings. Доступ к видимому в "свернутом" состоянии тексту идет, как и в tEdit, через свойство Text. Добавление новой строки в список пунктов (Items) может производиться так:

ComboBox1.Items. Add('Добавленная строка');

5.9.9. Пункт независимого выбора (tCheckBox).

Это маленький квадратик с расположенной рядом меткой. У данного пункта может быть три состояния: Checked (отмечен), noChecked (не отмечен) и Grayed (затемнен, что обычно подразумевает, что он недоступен для изменения). В случае Checked в квадратике рисуется крестик или галочка, noChecked — квадратик пустой, Grayed — рисуется более темным фоном.

5.9.10. Пункты зависимого выбора — "радиокнопки" (tRadioButton).

Группа взаимоисключающих пунктов выбора (отмеченным может быть только один из группы). По виду отличаются от tCheckBox тем, что рисуются кружками. При выборе одного элемента группы в центре кружка рисуется точка, а предыдущий перестает быть отмеченным. Чтобы создать независимые группы радиокнопок, надо помещать соответствующую часть из них на другие группирующие элементы — tGroupBox или tPannel.

5.9.11. Таблица (сетка) строк (tStringGrid).

Обеспечивает вывод таблицы с текстом. Таблица состоит из ячеек (Cells). Доступ к ячейке идет через двумерное свойство Cells[i, j]. Количество столбцов в таблице задается свойством ColCount, а строк (рядов) — RowCount. Ширину и высоту ячеек в любом столбце или строке, соответственно, можно независимо задавать с помощью свойств DefaultColWidth и DefaultRowHeight.

Часть столбцов и строк в таблице могут быть "фиксированными". Число фиксированных строк задается свойством FixedRows, столбцов — свойством FixedCols. Фиксированные ячейки выполняют в таблице особую роль.

Во-первых, они являются заголовками столбцов и строк. Они имеют другой цвет фона (по умолчанию серый, а не белый, как обычные ячейки), не захватывают фокус (хотя такие столбец или строка как единое целое могут его захватить при заданных соответствующих опциях) и не допускают редактирования находящегося в них текста, даже если свойство doEditing для компонента установлено как true во множестве свойств Options. Во-вторых, при установке в true свойства goRowsMoving и/или goColsMoving (также множество свойств Options) можно менять порядок строк и/или столбцов, "хватаясь" за них "мышью".

Приведем пример процедуры инициализации таблицы StringGrid, считая, что все необходимые атрибуты установлены на этапе визуального проектирования:

procedure SG_Init;

var i, j:Integer;

begin

StringGrid1.Cells[0,0]:='N'; {заголовок первого столбца - буква N}

for j:=1 to ColCount-1 do {заголовок других столбцов}

StringGrid1.Cells[0,j]:='Заголовок'+IntToStr(j);

for i:=1 to RowCount-1 do {первый столбец - номер строки}

StringGrid1.Cells[i,0]:=IntToStr(i);

end;

Эту процедуру можно вызвать, например, по событию onCreate для StringGrid1 (либо просто перенести приведенный текст внутрь обработчика события). В отличие от большинства других компонентов StringGrid, как правило, нуждается в программной инициализации подобного рода.

5.9.12. Диалоги (tOpenDialog, tSaveDialog и другие).

РАБОТА С ГРАФИКОЙ

Пример:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

Image1: TImage;

Edit1: TEdit;

Edit2: TEdit;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

begin

close

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Image1.Canvas. Pen. Color:=clGreen;

Image1.Canvas. Lineto(StrToInt(Edit1.Text),StrToInt(Edit2.Text))

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Image1.Canvas. Pen. Color:=clRed;

Image1.Show;

end;

end.

6. Интерфейсы и множественное наследование

6.1. Общие представления об интерфейсах в Object PASCAL

Интерфейс объекта определяют методы и свойства, которые могут быть реализованы классом-наследником этого интерфейса. Они описываются аналогично абстрактным классам, так же, как абстрактные классы, но в отличие от них, не могут иметь экземпляров, не могут иметь реализации никаких своих методов (в Object PASCAL допускается реализация части методов в абстрактные классы). Реализация методов интерфейсов осуществляется в классе, поддерживающем (наследующем) данный интерфейс. Переменная типа интерфейс - это ссылка. Она дает возможность ссылаться на объект, чей класс реализует данный интерфейс. Однако с помощью такой переменной разрешается вызывать только методы, декларированные в данном интерфейсе, а не любые методы данного объекта. Интерфейсы являются альтернативой множественному наследованию, имеют практически все его достоинства и лишены его недостатков. Их использование существенно для написания ПО для распределенных систем на основе COM (the Component Object Model) и CORBA (Common Object Request Broker Architecture). Объекты, поддерживающие интерфейсы, могут взаимодействовать с COM - объектами, написанными на C++ или Java.

Интерфейсы, как и классы, могут быть описаны только в самой наружной области видимости программы или модуля, но не в процедуре или функции. Описание типа для интерфейса имеет вид:

type

interfaceName =

interface (ancestorInterface)

['{GUID}']

список полей

end;

Отличия от классов:

Не бывает экземпляров, реализующих тип интерфейс. Список полей интерфейса может включать только свойства и методы. Поля данных использовать нельзя. Соответственно, спецификаторы read и write должны быть методами. Все поля интерфейса всегда имеют тип видимости public (без явного указания); не разрешено использовать спецификаторов видимости (но у массивов может быть использован спецификатор default). Не бывает конструкторов и деструкторов. Методы не могут быть специфицированы как виртуальные, динамические, перекрытые, абстрактные. Поскольку они не имеют реализации в экземплярах типа, эти различия не имеют значения. Наследование через интерфейсы множественное. Реализация интерфейса может быть только в классе, при этом он должен реализовать все методы интерфейса (а значит, и все свойства)

Интерфейс, как и класс, наследует все методы прародителя, однако только на уровне абстракций, без реализации методов. Однако интерфейс наследует право реализации этих методов в классе, поддерживающем этот интерфейс. В декларации интерфейса можно указать, что интерфейс наследуется от прародительского интерфейса. Если такого указания нет, то интерфейс является непосредственным потомком IUnknown, который определен в модуле System и является прародителем для всех интерфейсов. В IUnknown продекларировано 3 метода — QueryInterface, _AddRef, Release. QueryInterface предназначен для поддержки интерфейсов объектов. _AddRef, _Release обеспечивают управление ссылками на интерфейсы. Простейший путь реализовать эти методы — создать класс-наследник от tInterfacedObject, описанного в модуле System.

Пример описания интерфейса:

type

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16