Автор: Пользователь скрыл имя, 06 Февраля 2013 в 01:52, аттестационная работа
Класс TList -- универсальный список. Он представляет собой массив нетипированных указателей и поэтому годится для хранения набора любых, в том числе разнотипных, данных и объектов. При добавлении/удалении в список данные не создаются и не уничтожаются -- эта обязанность лежит на программисте. Приведем доступные ему методы и свойства класса.
ooDrawFocusRect -- задает выделение сфокусированного узла рамкой из точек;
ooStretchBitmaps -- задает приведение размеров пиктограмм к размерам шрифта текста путем масштабирования. В противном случае либо из пиктограммы вырезается часть (если она больше), либо остается свободное место (если меньше).
Рисование дерева по умолчанию осуществляется системой, но может быть возложено и на программиста. Определяется это свойством:
(№) property Style: TOutlineType;
TOutlineType = (otStandard, otOwnerDraw) ;
Стиль osStandard подразумевает, что дта каждого узла будет изображено то, что предусмотрено стилем OutlineStyle. Для реализации стиля otOwnerDraw нужно нарисовать содержимое узла в обработчике события:
(Pb) property OnDrawItern: TDrawItemEvent;
TDrawItemEvent = procedure(ListBox: TListBox; Index: Integer;
Rect: TRect; State: TOwnerDrawState) of object;
Параметры:
Index -- индекс узла;
Rect -- отведенный ему прямоугольник;
State -- множество, в которое могут входить состояния odSelected, odFocused.
Высота каждого узла постоянна и в этом случае определяется свойством:
(Pb) property ItemHeight: Integer;
Для рисования у компонента есть своя канва:
property Canvas: TCanvas ;
Установить ее можно только для объекта стиля osOwnerDraw; при osStandard канва игнорируется.
Обрамление компонента задается свойством:
(Pb) property BorderStyle: TBorderStyle;
Разобраться с применением этого компонента поможет пример OBJTREE. В нем по заранее заданному массиву компонентов ClassesSet выстраивается иерархическое дерево, в которое добавляются и все объекты-предки. Для примера были выбраны только 32 компонента, при желании можно включить и все остальные. Не забывайте при этом добавить содержащие их модули к тем, что содержатся в операторе uses. Когда вы перемещаете фокус по дереву, отображается имя объекта и имя модуля, в котором он описан. Для этого используется информация, возвращаемая недокументированным (пока?) методом класса TObject.ClassInfo. Возвращаемая им структура описана в исходных текстах VCL.
Многостраничные диалоговые окна
Во многих сложных программных комплексах сейчас предусмотрены десятки, а то и сотни параметров, которые может (должен!) устанавливать пользователь. Это означает либо перегруженность диалоговых окон, либо слишком большое их число. Выходом из этого положения стало повсеместное внедрение многостраничных диалогов-"блокнотов".
Для создания таких диалогов в VCL предназначены компоненты TNotebook, TTabSet и TTabbedNotebook.
Компонент TNotebook
TObject--^TPersistent-"
-->TCustoinControl-"TNotebook
Модуль EXTCTRLS
Страница Палитры компонентов Additional
Этот компонент представляет собой "страницы" блокнота, на которых располагаются другие визуальные компоненты. Каждая страница сама является оконным элементом управления и содержит список того, что на ней расположено.
Получить доступ или переустановить активную страницу записной книжки можно посредством имеющегося у нее имени:
(Pb) property ActivePage: string;
Кроме того, активная страница еще и идентифицируется индексом, определенным в свойстве:
(Рта property Pagelndex: Integer;
Для реакции при изменении текущей страницы предусмотрено свойство:
(Pb) property OnPageChanged: TNotifyEvent;
В свойстве
(Pb) property Pages: TStrings;
содержится вся информация о страницах. Напомним, что в классе TStrings есть два основных списка: через список Pages.Strings можно обратиться к именам страниц, а через список Objects -- непосредственно к объектам-страницам. Опубликованными свойствами страницы являются Caption, Height, Width, Visible и TabOrder. Используя методы компонента TStrings, можно добавлять и удалять страницы, проводить поиск и т. п. В конструкторе компонента TNotebook список инициализируется единственной страницей с именем 'Default'.
В приведенном ниже фрагменте кода после выбора гмени файла изображения добавляется новая страница, содержащая это изображение в компоненте TScrollBox. После успешной загрузки страница "Default" более здесь не нужна и удаляется, если она еще есть:
Procedure TFormI.OpenlClick(Sender: TObject);
var Animage : TImage;
AScrollBox: TScrollBox;
i: integer;
begin OpenDialogI-Filter := GraphicFilter(TGraphic);
if not OpenDialogI.Execute then Exit;
Animage := TImage.Create(Self);
with Animage do begin
Picture.LoadFroinPile (OpenDialogI. FileName) ;
AutoSize := True;
Visible := True;
end;
AScrollBox := TScrollBox.Create(Self);
with AScrollBox do begin
Align := alClient;
Visible := True;
end;
with Notebookl do begin
Pages-Add(Extract PileName(OpenDialogI.FileName)
Animage.Parent := AScrollBox;
AScrollBox.Parent := Pages-Objects[Pagelndex] as TPage;
i := Pages.IndexOf('Default');
if io-1 then Pages.Delete(i);
TabSetl.Tabs := Pages ;
TabSetl.TabIndex := Pages.Count - 1;
end;
end;
В этом примере компонент TNotebook взаимодействует с TTabSet -- вместе они составляют блокнот.
Компонент TTabSet
TObject-"TPersistent->
-->TCustornControl->TTabSet
Модуль TABS
Страница Палитры компонентов Additional
Этот компонент представляет собой набор закладок, на каждой из которых написана или нарисована какая-то ключевая информация. Щелчок по закладке означает ее активизацию. Когда два компонента работают в паре, как в примере выше, несложным путем можно связать активизацию одной из закладок с выбором соответствующей страницы в TNotebook. Впрочем, набор закладок применяют и с другими компонентами.
Как бы ни был выровнен TTabSet, закладки появляются таким образом, что они как бы "приклеены" к его верхнему краю. Поэтому этот компонент располагают снизу от TNotebook или другого компонента, отображающего информацию.
Строки, содержащие текст, который появится на закладках, описаны свойством:
(Pb) property Tabs: TStrings;
Строки (т. е. закладки) можно добавлять и удалять, все это отобразится в процессе исполнения. В отличие от TNotebook, список Objects свойства Tabs не используется, и программист может привязать к каждой закладке какой-нибудь объект, например, пиктограмму (см. ниже стиль tsOwnerDraw).
Индекс активной (выделенной) в данный момент закладки доступен для чтения и записи через свойство:
(ры property Tablndex: Integer;
Отсчет начинается от 0 и заканчивается на Tabs.Count-1. Если ни одна закладка не выделена, Tablndex равен -1.
При выборе закладки мышью генерируется событие OnClick. Если при этом текущий индекс изменился, генерируется также событие:
(Pb) property OnChange: TTabChangeEvent;
TTabChangeEvent = procedure(Sender: TObject; NewTab: Integer;
var AllowChange: Boolean) of object;
Узнав предполагаемый новый индекс (NewTab), изменение можно запретить (установив параметр AllowChange в False).
Сменить текущую закладку можно и из программы, вызвав метод:
procedure SelectNext(Direction: Boolean);
Параметр Direction, равный True, означает увеличение индекса на 1, False -- соответствующее уменьшение. При этом набор циклически замкнут -- после последней закладки будет выбрана первая (с нулевым индексом) и т. д.
Если описано много закладок, или если у них длинные имена, то все они могут не поместиться вдоль стороны компонента, т. е. нужна их прокрутка. Для этого у края комонента появляются две маленькие кнопки со стрелками, нажав которые мышью во время выполнения, можно вывести в поле зрения любую закладку. Все сказанное действительно, если свойство
(Pb) property AutoScroll: Boolean;
установлено в True. В противном случае доступ к невидимым закладкам нужно осуществлять программно.
Закладки могут появляться не по всей ширине компонента, а на каком-то его участке. Отступы от правого и левого краев задаются при помощи свойств:
(pb) property StartMargin: Integer;
(Pb) property EndMargin: Integer;
По умолчанию оба отступа равны 5 пикселам. Когда видны не все закладки, индекс первой из видимых содержится в свойстве:
property Firstlndex: Integer;
При этом одновременно видно столько закладок, сколько определено в свойстве:
(Ro) property VisibleTabs: Integer;
Определить индекс закладки по координатам точки можно, вызвав метод
function ItemAtPos(X, Y: Integer): Integer;
а узнать координаты отведенного ей прямоугольника -- через вызов метода:
function ItemRect(Item: Integer): TRect;
Какими средствами изображается компонент? Это определяется его стилем:
(Pb) property Style: TTabStyle;
TTabStyle = (tsStandard, tsOwnerDraw) ;
Стиль tsStandard подразумевает вывод на закладке ее названия стандартными средствами. Если программист хочет изобразить на ней нестандартную информацию, например, пиктограмму или произвольный текст, он должен установить стиль tsOwnerDraw. Для правильного изображения таких закладок нужно предусмотреть обработчики двух событий -- OnMeasureTab и OnDrawTab. Первое из них имеет тип:
(Pb) property OnMeasureTab: TMeasureTabEvent;
TMeasureTabEvent = procedure(Sender: TObject; Index: Integer;
var TabWidth: Integer) of object;
В качестве параметра Index передается индекс закладки в наборе. В ответ в параметре Tab Width обработчик должен вернуть потребную ширину для изображения этой закладки.
При этом высота пользовательских закладок устанавливается посредством свойства:
(Pb) property TabHeight: Integer;
Для стандартно изображаемых наборов закладок это свойство игнорируется -- каждая закладка имеет постоянную высоту, которая не зависит от высоты самого компонента.
После OnMeasureTab инициируется обработчик следующего события:
(Pb) property OnDrawTab: TDrawTabEvent;
TDr'awTabEvent = procedure (Sender: TObject; TabCanvas: TCanvas; R:
TRect; Index: Integer; Selected: Boolean) of object;
Обработчик позволяет нарисовать на закладке то, что нужно. Для этого он получает параметры:
TabCanvas -- канва компонента;
R -- доступный для рисования прямоугольник;
Index -- индекс закладки;
Selected -- определяет, имеет ли эта закладка фокус. У TTabSet есть собственная канва:
(Ro) property Canvas: TCanvas;
Цвета, которыми изображаются текущая закладка, можно установить с помощью свойства:
(Pb) property SelectedColor: TColor;
Цвет всех прочих закладок определяется свойством:
(Wf property UnselectedColor: TColor;
Фон, то есть оставшееся пространство до границ компонента, не принадлежащее закладкам, изображается цветом, заданным в свойстве:
(Pb) property BackgroundColor: TColor;
Насыщенность цвета этого пространства может специально ослабляться для того, чтобы закладки были лучше видны. За это ослабление отвечает свойство
(pb) property DitherBackground: Boolean;
которое по умолчаншо установлено в True.
Компонент TTabbedNotebook
TObject-->TPersistent->
-"TCuscomControl->
Модуль TABNOTBK
Страница Палитры компонентов Additional
Этот компонент -- уже готовое объединение первых двух компонентов из этого раздела. Очень большим плюсом является то, что в нем закладки могут располагаться не в один, а в множество рядов один над другим. Число закладок в каждом ряду должно быть не более, чем определено в свойстве:
(Pb) property TabsPerRow: Integer;
Как и TNotebook, этот компонент имеет свойства:
property ActivePage: string;
property Pagelndex: Integer;
property Pages: TStrings;
Доступ к активной странице из набора Pages по-прежнему возможно двумя способами -- через ActivePage и Pagelndex.
Закладки в этой записной книжке располагаются не снизу, а сверху. При их изображении применяется шрифт
(Pb) property TabFont: TFont ;
причем текст на активной закладке пишется полужирным начертанием (если оно не используется для обычных закладок).
Найти индекс страницы с заданным именем позволяет метод
function GetlndexForPage(const PageName: string): Integer;
а установить фокус по номеру -- метод:
procedure SetTabFocus(Index: Integer);
Щелчок на активной странице инициирует событие OnClick, а ее смена -- OnChange:
(Pb) property OnChange: TPageChangeEvent;
TPageChangeEvent = procedure(Sender: TObject; NewTab: Integer;
var AllowChange: Boolean) of object;
Параметры этого события идентичны TTabChangeEvent.
Группирование компонентов
По умолчанию родителем для большинства компонентов, размещенных на форме, является она сама. В ряде случаев, однако, есть необходимость отказаться от этого правила, как визуально, так и функционально подчеркнув обособленность каких-то элементов управления. Для этого вы можете использовать специальные группирующие компоненты TGroupBox и TPanel. Мы также отнесли в эту группу компонент TScrollBox, он также обычно имеет дочерние компоненты, которые все вместе подвергаются прокрутке. Общим признаком для всех группирующих компонентов является наличие опции csAcceptsControls в свойстве ControlStyle.
Компонент TGroupBox
TObject--^TPersistent--"TCorr]
-->TCustomControl-->
Модуль STDCTRLS
Страница Палитры компонентов Standard
Единственное назначение этого компонента -- служить предком (Parent) для других компонентов. Это играет роль тогда, когда они должны быть объединены в группу по какому-либо признаку. Типичный пример -- радиокнопки. Когда одна из них нажимается, все остальные радиокнопки в группе (т. е. с одним значением свойства Parent) автоматически отпускаются.
Поэтому, для того чтобы на форме иметь несколько независимых групп радиокнопок, их нужно поместить на разные объекты типа TGroupBox. (Кстати, именно для решения задачи с радиокнопками есть специальный компонент -- TRadioGroup).
Будучи потомком класса TCustomControl, TGroupBox наследует от него общие свойства, описанные ранее. Специфических свойств и методов этот компонент не имеет.
Компонент TPanel
TObject->TPersistent-"
->TCustomControl--"
Модуль EXTCTRLS
Страница Палитры компонентов Standard
Этот компонент -- панель -- является несущей конструкцией для размещения других элементов управления. В отличие от простой рамки (TBevel) панель сама является оконным элементом управления и родителем для всех размещенных на ней компонентов. Часто ее используют для создания панелей инструментов, строк состояния и т. п.
За внешнее оформление панели отвечают свойства:
(Pb) property Bevel Inner: TPanelBevel;
(Р1э) property BevelOuter: TPanelBevel;
TPanelBevel = (bvNone, bvLowered, bvRaised) ;
(Pb) property BevelWidth: TBevelWidth;
TBevelWidth = 1..Maxint;
(Pb) property BorderWidth: TBorderWidth;
TBorderWidth = 0..Maxint ;
На границах панели размещаются две специальные окаймляющие рамки (bevels): Bevellnner и BevelOuter. При помощи комбинации белого и серого цветов они имитируют трехмерность -- приподнятость (bvRaised) или утоп-ленность (bvLowered). Обе рамки имеют ширину BevelWidth. Наружная -- BevelOuter -- расположена прямо по периметру панели, вторая -- Bevellnner -- внутри на расстоянии BorderWidth от нее. Обе могут быть невидимыми (bvNone), приподнятыми или утопленными.
Комбинируя сочетания bvLowered/bvRaised, можно создать вокруг панели "ров" или "вал".
Иллюзию трехмерности может подчеркнуть также стиль обрамления компонента:
(Pb) property BorderStyle: TBorderStyle;
TBorderStyle = bsNone .. bsSingle;
Значение bsSingle означает, что панель будет окаймлена черной линией единичной толщины (по периметру, снаружи от обеих рамок).
Выравнивание текста заголовка панели определяется при помощи свойства:
(Pb) property Alignment: TAlignment;
Свойство
(Pb) property Locked: boolean;
предназначено для определения способа взаимодействия панели с размещенными на ней объектами OLE. Если оно равно True, последние при активизации сервера OLE "по месту'" не могут заместить панель. В обработчике события: