Справочник по компонентам Дельфи

Автор: Пользователь скрыл имя, 06 Февраля 2013 в 01:52, аттестационная работа

Описание работы

Класс TList -- универсальный список. Он представляет собой массив нетипированных указателей и поэтому годится для хранения набора любых, в том числе разнотипных, данных и объектов. При добавлении/удалении в список данные не создаются и не уничтожаются -- эта обязанность лежит на программисте. Приведем доступные ему методы и свойства класса.

Работа содержит 1 файл

componens.doc

— 980.33 Кб (Скачать)

(Pb) property OnGetEditMask: TGetEdiCEvent;

TGetEditEvent = procedure (Sender: TObject; ACol, ARow:

Longint; var Value: string) of object;

Далее редактор извлекает текст, связанный с ячейкой. При этом вызывается событие:

(Pb) property OnGetEditText: TGetEditEvent;

Загружаемый текст доступен в параметре Value, и его можно изменить до появления в редакторе.

При каждом изменении текста в редакторе инициируется событие:

(Pb) property OnSetEditText: TSetEditEvent;

TSetEditEvent = procedure (Sender: TObject'; ACol, ARow: Longint;

const Value: string) of object;

Иллюстрирует применение TDrawGrid пример LIFE. Это классическая игра "жизнь" (автор -- X. Конвей), имитирующая законы выживания. Каждая ячейка таблицы здесь соответствует одному "существу". Его состояние изменяется через некоторые интервалы времени (для этого используется компонент TTimer). Существо "живет" нормально, если у него двое или трое соседей. Если их меньше, оно умирает от одиночества, если больше -- от перенаселения. Новая жизнь появляется в пустой ячейке, если у нее ровно трое соседей. Начальное состояние ячеек может быть случайным, а может быть задано вами:

щелчок по ячейке означает изменение ее состояния. Запустив игру, вы увидите, как постепенно положение на игровом поле стабилизируется, и на нем образуется несколько разновидностей устойчивых конфигураций групп ячеек.

Компонент TStringGrid

TObject-"TPersistent-->TComponent-*TControl-"TWinControl-> --"TCustomControl-"TCustomGrid-"TDrawGrid->TStringGrid Модуль GRIDS Страница Палитры компонентов Additional

Этот компонент реализует возможности своего предка TDrawGrid применительно к таблице строк.

В состав компонента добавлен объект класса TStrings, в котором хранится содержимое ячеек. Он доступен как векторное свойство -- двумерный массив текстовых строк (размерностью ColCount x RowCount), соответствующих ячейкам таблицы:

property Cells[ACol, ARow: Integer]: string;

Доступен и двумерньш массив объектов, соответствующих ячейкам:

property Objects[ACol, ARow: Integer]: TObject;

Необходимо помнить, что самих объектов в таблице нет, и программист должен создавать, а по окончании использования таблицы удалять объекты самостоятельно.

Можно работать отдельно как со строками, так и со столбцами таблицы. Свойства

property Cols[Index: Integer]: TStrings;

property Rows[Index: Integer]: TStrings;

описывают наборы строк (также в виде TStrings), содержащие текст и объекты столбцов и строк таблицы.

При значении True свойства DefaultDrawing для этого компонента происходит вывод строки в соответствующей ячейке. Так что если кроме текста ничего отображать не требуется, то менять значение DefaultDrawing и определять обработчик события OnDrawCell не нужно.

Отметим, что перенос строк и столбцов таблицы (при установленных опциях goColMoving или goRowMoving) осуществляется вместе с их текстовыми строками.

Компонент TOutline

TObject->TPersistent-->TCoinponent--"TControl--"TWinControl-> -->TCustomControl->TCustomGrid->TCustomOutline-"TOutline Модуль OUTLINE Страница Палитры компонентов Additional

TOutline создан для ведения и отображения иерархических структур данных -- деревьев. Это один из наиболее сложных и интересных компонентов. В этот раздел он попал потому, что является потомком таблицы (TCustomGrid), хотя и мало чем ее напоминает.

Типичным примером применения TOutline можно назвать отображение структуры файловой системы (для этого даже есть отдельный компонент TDirectory Outline). В описанном ниже примере OBJTREE этот компонент используется для отображения дерева классов библиотеки VCL.

Дерево состоит из элементов (будем называть их узлами), упорядоченных по уровням. Каждый из них имеет родительский узел (на более высоком уровне) и список дочерних узлов-потомков. Исключением являются корневой узел (нулевого уровня) -- он не имеет предка, и узлы последнего уровня, не имеющие потомков.

Каждый узел является объектом класса TOutlineNode:

TOutlineNode = class(TPersistent) Рассмотрим сначала методы и свойства этого объекта. С каждым узлом можно связать информацию -- имя и произвольные данные:

property Text: string;

property Data: Pointer;

Указатель на родительский узел определяется свойством:

(Ro) property Parent: TOutlineNode;

Если список дочерних узлов не пуст, что можно проверить при помощи свойства

(Ro) property Hasltems: Boolean;

то для получения информации о них есть метода,!:

function GetFirstChild: Longint;

function GetLastChild: Longint;

function GetNextChild(Value: Longint): Longing-function GetPrevChiId(Value: Longint): Longint;

В последних двух методах параметр Value содержит индекс предыдущего найденного потомка. Индекс -- это уникальный идентификатор узла в дереве, определенный свойством:

(Ro) property Index: Longint;

Используя его, можно получить указатель на узел (см. ниже сам компонент TOutline). Узлы пронумерованы таким образом, что если родитель имеет номер N, то первый из его потомков -- номер (N+1).

Можно узнать и полное имя (путь) узла, представляющее собой конкатенацию всех родительских имен и имени узла, разделенных специальным символом. Этот символ определен в свойстве ItemSeparator объекта TCustomOutline, которому принадлежат узлы. Полный путь определяется свойством:

(Ro) property FullPath: string;

Каждый узел расположен на своем иерархическом уровне. На самом верху находится узел уровня 0. Все другие являются для пего дочерними; он не виден и не доступен пользователю. Поэтому на первом доступном уровне -- с номером 1 -- могут находиться по вашему желанию один или несколько узлов. Уровень иерархии узла можно узнать в его свойстве:

(ro) property Level: Cardinal;

Чтобы изменить уровень, надо вызвать метод:

procedure ChangeLevelBy(Value: TChangeRange);

которьш перемещает узел в список другого уровня. Диапазон перемещения TChangeRange ограничен:

TChangeRange = -1..1;

Чтобы переместить узел в дереве, нужно вызвать следующий метод

procedure MoveTo(Destination: Longint; AttachMode: TAttachMode);

TAttachMode = (oaAdd, oaAddChild, oalnsert) ;

Он перемещает узел (вместе со всеми потомками) в положение с индексом Destination. Родительский узел не может переместиться на место любого из своих потомков. Режим перемещения AttachMode означает:

oaAdd -- добавить последним на том же уровне, что и Destination;

oaAddChild -- добавить последним к потомкам узла Destination;

oalnsert -- заменить в положении Destination прежний узел, которьш смещается дальше по списку на том же уровне.

Индекс того из предков узла, которьш находится в списке самого высокого уровня, известен из свойства:

(Ro) property Topltem: Longint;

Для корневого узла это свойство равно 0.

Компонент TOutline не только хранит древовидную структуру, он еще и отображает ее. На экране каждый узел может находиться в двух состояниях, свер

нутом и развернутом. В свернутом состоянии потомки узла не видны, в развернутом они изображаются чуть ниже и правее друг под другом. Состояние узла может иллюстрироваться значком (плюс/минус, открытая/закрытая папка -- см. описание свойства OutlineStyle компонента TOutline). В таблице приведены методы и свойства, управляющие состоянием узла на экране:

property Expanded: Boolean;

Указывает, в каком состоянии находится узел; True -- развернутое состояние.

procedure Collapse;

Сворачивает узел, пряча все дочерние узлы.

procedure Expand;

Разворачивает узел списка, показывая дочерние узлы.

procedure FullExpand;

Полностью разворачивает узел, показывая все дочерние узлы всех подуровней.


 

Сворачивать/разворачивать узлы дерева, помимо щелчков мышью, можно нажатием клавиш:

<+> -- соответствует Expand;

<-> -- соответствует Collapse;

<*> -- соответствует FullExpand. Свойство

(Ro) property IsVisible: Boolean;

означает, может ли быть виден узел. Это возможно только в том случае, если виднь! все его родители. При отрисовке ширина узла сообщается методом:

function GetDisplayWidth: Integer;

Теперь перейдем от описания узла к описанию самого дерева -- компонента TOutline. Он представляет собой совокупность узлов типа TOutlineNode. Всего в дереве содержится число узлов, равное значению свойства:

(Ro) property ItemCount: Longint;

К каждому из них можно обратиться, используя свойство:

(Ro) property Items[Index: Longint]: TOutlineNode;

На текущий (выделенный) узел можно сослаться через свойство:

property Selectedltem: Longint;

Например, выполнение оператора

Items[Items[Selectedltem].Topltem].FullExpand;

приведет в развернутое состояние ту часть дерева, в которой находится выделенный узел (начиная от его самого далекого предка Topltem). Свойство

property Row: Longint;

показывает, какая строка дерева в данный момент имеет фокус. Зная "содержимое" узла, то есть его имя или данные, можно найти его в дереве и узнать индекс. Для этого нужно вызвать один из методов, возвращающих его:

function GetDataItem(Value: Pointer): Longint;

function GetTextItem(const Value: string): Longint;

Можно найти узел и по координатам точки в клиентской области компонента (на самом деле играет роль только координата Y) с помощью следующего метода:

function GetItemfX, Y: Integer): LongInC;

Целых три пары методов добавляют новый узел в дерево. Его имя инициализируется параметром Text. Различие между первым и вторым методами в парах в том, что второй позволяет связать с узлом данные (параметр Data), а в первом вместо них записывается nil.

function Add(Index: Longint; const Text: string): Longint;

function AddObject(Index: Longint; const Text: string;

const Data: Pointer): Longint;

-- добавляют новый узел в качестве последнего в тот же список, где находится узел Index. Поскольку на самом верху иерархии может быть только один узел, то в случае задания Index = 0 он добавляется в список верхнего уровня. Соответствуют режиму oaAdd;

function AddChild(Index: Longint; const Text: string): Longint;

function AddChildObject(Index: Longint; const To" : string;

const Data: Pointer): Longint;

-- добавляют новый узел в качестве последнего потомка узла Index. Соответствуют режиму oaAddChild;

function Insert(Index: Longint; const Text: string): Longint;

function InsertObject(Index: Longint; const Text: string;

const Data: Pointer): Longint;

-- вставляют узел в положение Index. При этом прежний узел с таким индексом и все другие на этом уровне сдвигаются вниз. Единственное исключение -- задание в качестве параметра нулевого индекса. В этом случае узел добавляется последним в список самого верхнего уровня. Соответствуют режиму oalnsert. Все методы вызывают переиндексирование дерева и возвращают уже новый индекс для вставленного узла. Если нужно удалить узел, то метод procedure Delete(Index: Longint);

удаляет узел с индексом Index, а метод

procedure Clear;

очищает все дерево.

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

procedure BeginUpdate;

procedure EndUpdate;

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

procedure SetUpdateSCate(Value: Boolean);

Дерево можно полностью свернуть или полностью развернуть вызовом методов:

procedure FullExpand;

procedure FullCollapse;

Каждый узел, изменяя свое состояние, предупреждает об этом родительское дерево. В зависимости от того, свернулся он или развернулся, вызываются обработчики событий

(pb) property OnExpand: EOutlineChange;

(РЬ) property OnCollapse: EOutlineChange;

EOutlineChange = procedure (Sender: TObject; Index: Longint) of object;

где параметр Index означает индекс узла, измешшшего состояние. Метод

function GetNodeDisplayWidth(Node: TOutlineNode): Integer;

возвращает ширину, занимаемую изображением узла (если установленньш стиль не osOwnerDraw, см. ниже).

Дерево может быть загружено и выгружено в поток и файл при помощи методов:

procedure LoadFromFile(const FileName: strings-procedure LoadFromStream(Stream: TStream);

procedure SaveToFile(const FileName: strings-procedure SaveToStream(Stream: TStream) ;

Для прокрутки информации TOutline по умолчанию имеет обе полосы, определяемые свойством:

(Pb) property ScrollBars: TScrollStyle;

TScrollStyle = (ssNone, ssHorizontal, ssVertical, ssBoth);

Строка (символ), разделяющий имена узлов при составлении полного имени узла, содержится в свойстве:

(Pb) property ItemSeparator: string;

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

(Pb) property Lines: TStrings;

Это свойство предназначено для использования именно на этапе разработки, так как свойство Items в это время недоступно. Во время исполнения с информацией об узлах нужно работать, используя свойство Items. При рисовании дерева, помимо собственно текста, вместе с ним может изображаться одна из пиктограмм:

Из) property PicturePlus: TBitmap;

Соответствует свернутому узлу. По умолчанию -- "плюс".

(Pb) property PictureMinus: TBitmap;

Соответствует развернутому узлу. По умолчанию -- "минус".

(Pb) property PictureOpen: TBitmap;

Соответствует развернутому узлу. По умолчанию -- "открытая папка".

(Pb) property PictureClosed: TBitmap;

Соответствует свернутому узлу. По умолчанию -- "закрытая папка".

(Pb) property PictureLeaf: TBitmap;

Соответствует "листу" -- узлу без потомков. По умолчанию -- "документ".


 

Желательно, чтобы картинки имели "прозрачный" фон, то есть чтобы их свойство TransparentColor соответствовало цвету рабочей области компонента. Эти пиктограммы можно переопределить в случае необходимости.

Свойство OutlineStyle определяет, в частности, когда и какие пиктограммы будут показаны:

(Pb) property OutlineStyle: TOutlineStyle;

TOutlineStyle = (osText, osPlusMinusText, osPictureText, osPlusMinusPictureText, osTreeText, osTreePictureText);

В зависимости от значения этого свойства изображаются:

osText -- только текст;

osPlusMinusText -- текст и пиктограммы PicturePlus и PictureMinus в зависимости от состояния узла. "Лист" не имеет значка;

osPictureText -- текст и пиктограммы PictureOpen, PictureClosed и PictureLeaf в зависимости от состояния узла;

osPlusMinusPictureText -- объединяет в себе два предыдущих стиля;

osTreeText -- текст и специальные линии, иллюстрирующие связь между родительским и дочерними узлами;

osTreePictureText -- объединяет в себе стили osTreeText и osPictureText. По умолчанию установлен стиль osTreePictureText;

На внешний вид дерева влияют и опции, содержащиеся в свойстве:

(Pb) property Options: TOutlineOptions;

TOutlineOption =- (ooDrawTreeRoot, ooDrawFocusRect, ooSCretchBitmaps) ;

TOutlineOptions =- set of TOutlineOption;

Это множество может содержать элементы:

ooDrawTreeRoot -- задает соединение линией всех узлов верхнего уровня. В случае отсутствия опции каждый из них выглядит как вершина отдельного дерева. Эта опция играет роль только для стилей osTreeText, osTreePictureText;

Информация о работе Справочник по компонентам Дельфи