Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ракитин Р.Ю. ООП в Turbo Delphi

.PDF
Скачиваний:
53
Добавлен:
18.03.2015
Размер:
3.59 Mб
Скачать

131

Основные свойства компонента:

Position текущее значение счетчика; Min, Мах допустимые границы;

ArrowKeys разрешает или запрещает трактовать нажатия курсорных клавиш как команды изменения значения;

Increment определяет шаг изменения значения свойства Position; Thousands если имеет значение True, то каждые три цифры в элементе

управления, связанном с данным объектом, отделяются запятой;

Wrap если свойства равно True, то допускается циклическое изменение значения свойства Position. Если значение Position превышает максимальный предел Мах, то оно получает значение Min и наоборот.

Для того чтобы связать компонент с другими элементами, используется свойство Associate, где указывается имя компонента. После этого счетчик «приклеивается» к выбранному элементу. Как правило, UpDown используется вместе с компонентом Edit. При этом значение свойства Position будет заноситься в свойство Text. Для этого на форме размещают компонент TEdit

и TUpDown и в раскрывающемся списке последнего в свойстве Associate (Ассоциировать) выбирают объект Edit.

После этого программу можно откомпилировать и запустить. Теперь при щелчках на стрелках объекта UpDown или при нажатии курсорных клавиш, когда фокус ввода установлен на текстовом поле Edit, содержимое последнего будет меняться.

Сразу после щелчка на стрелке объект получает сообщение OnChanging, в

котором в случае его обработки можно подтвердить или запретить изменение значения Position, записав значение True или False в параметр AllowChange.

Еще одно сообщение OnChangingEx с помощью параметра обработчика Direction дополнительно уточняет, какая клавиша (ВВЕРХ или ВНИЗ) нажата. После завершения изменения значения Position генерируется сообщение OnClick.

5.Компонент TAnimate (Анимация AVI)

Данный компонент позволяет организовать на форме небольшую анимацию воспроизвести клип в формате АVI без воспроизведения звука.

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

Загрузить клип можно, обратившись к свойству FileName, в котором указывается имя файла .AVI, либо указав в свойстве CommonAVI один из следующих стандартных клипов Windows.

aviNone клип указан в свойстве FileName; aviFindFolder поиск папки;

132

aviFindFile поиск файла; aviFindComputer поиск компьютера; aviCopyFiles копирование файлов; aviCopyFile копирование файла;

aviRecycleFile перемещение файла в корзину; aviEmptyRecycle очистка корзины; aviDeleteFile удаление файла.

Основные свойства компонента:

AutoSize если значение равно True, то размер компонента подстраивается под размер клипа;

Transparent определяет, будет ли клип прозрачным или используется фоновый цвет;

Open если значение равно True, то происходит запуск клипа, при этом выполняется загрузка клипа в память и подготовка его к воспроизведению. При открытии клипа генерируется сообщение ОnОреn, в обработчике которого удобно задать начальные значения различных свойств;

FrameCount определяет число кадров в клипе;

FrameWidth и FrameHeight ширина и высота кадра в пикселях (эти размеры одинаковы для всех кадров);

Repetitions число повторов клипа;

Active определяет начало демонстрации клипа. Если значение равно True, то клип запускается (при этом генерируется событие OnStart). Прервать показ можно с помощью метода Stop (событие OnStop);

Seek позволяет показать конкретный кадр. Нумерация кадров начинается с 1.

6.Компонент TStatusBar (Строка состояния)

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

Сразу после размещения компонента на форме строка состояния автоматически прикрепляется к нижней части формы. В дальнейшем она сама подстраивается под изменяемую ширину формы. Высоту строки подсказки можно менять либо с помощью мыши, либо с помощью свойства Height.

В самом простом варианте строка состояния работает как одна большая панель. При этом свойство SimplePanel получает значение True, а выводимый текст записывается в свойство SimpleText.

Текст в строке состояния можно привязать к текущей подсказке любого элемента управления на форме, тогда в строке состояния будет автоматически отображаться подсказка для текущего элемента управления. Для этого свойство AutoHint должно иметь значение True.

Для создания нескольких областей вывода используется свойство Panels, представляющее собой коллекцию объектов типа TStatusPanel панелей, из

133

которых составляется строка состояния. Для их создания и

обработки применяется стандартный редактор коллекций (см. рис.). С помошью управляющих кнопок можно создавать и удалять панели.

Доступ к панелям осуществляется через свойство Items. В котором можно указать, например ширину панели (свойство Width) и выводимый текст (свойство Text).

Практическое задание

Создадим приложение для работы с массивом (создание, упорядочивание, поиск). Вид приложения может выглядеть так:

1. Создадим новый проект. Разместим на главной форме объект Строка состояния (StatusBar), он автоматически прикрепится книзу формы. В свойстве AutoHint поставим True (для автоматического отображения панелью подсказки текущего объекта). Перейдем в редактор коллекций объекта (свойство Panels) и создадим две панели. У первой укажем размер (свойство

Width) равным 150.

2.Добавим на форму объект PageControl. В свойстве выравнивания Allign укажем alClient, при этом объект заполнит всю форму. Теперь даже при изменении размера формы, PageControl будет менять размер вместе с ней.

3.Создадим в объекте PageControl три страницы и назовем их:

TabSheetMake (Создание массива), TabSheetSort (Упорядочивание массива), TabSheetFind (Поиск и отображение выбранного элемента массива).

4.На первой странице (Создание TabSheetMake) разместим поле для ввода размера массива (класс TEdit EdMas), поле для регулирования отрезка, на котором будут задаваться элементы массива (класс TEdit EdMax) и кнопку создания массива «Создать» (ButMake). С объектом EdMax свяжем элемент

UpDown. В свойстве UpDown Wrap укажем True, а в Position 50.

134

5. На второй странице (Упорядочить TabSheetSort) разместим объект ComboBox для выбора направления упорядочивания массива. В нём создадим две строки: «по возрастанию» и «по убыванию». По умолчании установим первую строку (в свойстве ItemIndex установим 0). Для сигнализации долгих процессов воспользуемся объектами Animate и ProgressBar. В свойстве

CommonAVI объекта Animate укажем aviFindFile, а в свойстве Visible

(Видимость) объекта ProgressBar, укажем False (объект не видим). Для сортировки массива воспользуемся кнопкой «Упорядочить» (ButSort).

6.На третьей странице (Поиск TabSheetFind) разместим два объекта TEdit для ввода/вывода номера элемента массива (EdNamber) и для ввода/вывода значения этого элемента (EdMasi). Также для изменения значения текущего элемента, воспользуемся компонентом TrackBar, в свойстве Orientation укажем trVertical (вертикальный).

7.Для отображения статических надписей будем использовать компоненты

TLabel.

8.Для каждого объекта опишим подсказку (свойство Hint).

9.Для отображения названия открытой вкладки компонента PageControl в строке состояния, создадим обработчик, выполняющийся при переключении Страниц (TabSheet). Для этого рассмотрим событие OnChange для

PageControl. В обработчике напишем:

case Pagecontrol1.ActivePageIndex of 0:StatusBar1.Panels.Items[1].Text:='Создать'; 1:StatusBar1.Panels.Items[1].Text:='Упорядочить'; 2:StatusBar1.Panels.Items[1].Text:='Поиск';

end;

При этом во вторую панель объекта Строка состояния будет выводится имя текущей страницы.

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

procedure TForm1.FormShow(Sender: TObject); begin

Pagecontrol1.ActivePageIndex:=0;

{вызов метода отображения имени текущей страницы} //вызов ранее созданного метода

PageControl1Change(nil); TabSheetSort.Enabled:=False; TabSheetFind.Enabled:=False;

end;

При отображении формы устанавливаем первую страницу объекта PageControl активной и открытой. Две другие страницы делаем не

135

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

11.Опишем глобальную переменную динамического массива: mas: array of integer;

12.Для нажатия кнопки «Создать» запишем обработчик:

procedure TForm1.ButMakeClick(Sender: TObject); var

i:integer; begin

{инициализация датчика случайных чисел} randomize;

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

SetLength(mas, StrToInt(EdMas.Text));

{задаем элементы массива в интервале от нуля до указанного числа в текстовой области}

for i := 0 to StrToInt(EdMas.Text)-1 do mas[i]:=random(StrToInt(EdMax.Text));

{устанавливаем максимально допустимое значение для объекта TrackBar} TrackBar1.Max:=StrToInt(EdMas.Text);

{выводим сообщение о успешном создании массива} ShowMessageFmt('Создан массив из %d элементов на

интервале до %d', [StrToInt(EdMas.Text), StrToInt(EdMax.Text)]);

{активируем страницы «Сортировки» и «Поиска»} TabSheetSort.Enabled:=True; TabSheetFind.Enabled:=True;

end;

13. Для нажатия кнопки «Упорядочить» запишем обработчик:

procedure TForm1.ButSortClick(Sender: TObject); var

i, j, temp: integer; begin

{активируем элемент Индикатор – устанавливаем максимальное число изменений в соответствии с числом итераций первого цикла, делаем объект видимым}

with ProgressBar1 do begin

Max:=StrToInt(EdMas.Text);

Position:=0;

Visible:=True; end;

136

{активируем объект Animate} Animate1.Active:=True; Animate1.Visible:=True;

{в зависимости от выбранного вида упорядочивания массива – по возрастанию/убыванию, будем выполнять соответствующий цикл сортировки по методу обмена}

case ComboBox1.ItemIndex of

{по возрастанию}

0:for i := 1 to StrToInt (EdMas.Text) do begin

for j := i+1 to StrToInt (EdMas.Text) do if mas[i]>mas[j] then

begin

temp:= mas[i]; mas[i]:= mas[j]; mas[j]:= temp;

end;

{используется для того чтобы произошла отрисовка анимации}

Application.ProcessMessages; {устанавливаем Индикатор в новую позицию} ProgressBar1.Position:=i;

end;

{по убыванию}

1:for i := 1 to StrToInt(EdMas.Text) do begin

for j := i+1 to StrToInt(EdMas.Text) do if mas[i]<mas[j] then

begin

temp:= mas[i]; mas[i]:= mas[j]; mas[j]:= temp;

end;

Application.ProcessMessages;

ProgressBar1.Position:=i; end;

end;

{отключаем и делаем не видимыми объекты Animate и ProgressBar}

Animate1.Active:=false;

Animate1.Visible:=false;

ProgressBar1.Visible:=false; ShowMessage('Упорядочивание массива закончено'

+ComboBox1.Items[ComboBox1.ItemIndex]);

end;

137

14. Создадим обработчик OnChange для объекта TrackBar, что позволит просмотреть элементы массива по порядку. В обработчике запишем:

EdNamber.Text:=IntToStr(TrackBar1.Position);

EdMasi.Text:=IntToStr(mas[TrackBar1.Position]);

15. Для вывода значения, хранящегося в определенном элементе массива, создадим обработчик ввода данных для текстового поля EdNamber.

procedure TForm1.EdNamberKeyPress(Sender: TObject; var Key: Char);

begin

{если нажат “Ввод”} if key=#13 then

{переместим TrackBar в позицию указанную в EdNamber}

TrackBar1.Position:=StrToInt(EdNamber.Text);

end;

При внесении данных в объект TrackBar автоматически вызовется обработчик OnChange для этого объекта.

16.Создайте самостоятельно обработчик, позволяющий менять значение любого элемента массива. Использовать обработку объекта EdMasi.

17.Реализуйте методы, позволяющие найти и вывести минимальное и максимальное, среднее арифметическое значения, сумму элементов для несортированного массива.

138

Глава 13. Отображения иерархических данных в Windows

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

TTreeView (Дерево) .

Главное свойство компонента TTreeView property Items: TTreeNodes;

Данное свойство это список всех вершин дерева, причем список, обладает дополнительными свойствами. Каждый из элементов списка это также объект типа TTreeNode. Рассмотрим его основные свойства.

HasChildren: Boolean; равно True, если узел имеет дочерние узлы; Count: Integer; счётчик числа дочерних узлов данного узла;

Item [Index: Integer]: TTreeNode; – список дочерних узлов;

Parent: TTreeNode; – ссылка на объект родительский узел (верхнего уровня);

Level: Integer; уровень, на котором находится узел. Для корневого узла

это

свойство равно 0; его потомки имеют

значение Level = l

и т. д.;

 

Text: string; текст узла;

 

Data:

Pointer; данные, связанные с узлом.

Таким образом, вместе с

каждым узлом можно хранить не только текст, но и любые данные;

Owner:

TTreeNodes; ссылка на компонент

TTreeNodes, которому

принадлежит данный узел;

 

Index: Longint; индекс узла в списке своего родителя;

IsVisible: Boolean; равно True, если узел видим (все его родительские узлы развернуты);

Absolutelndex: Integer; абсолютный индекс узла в списке корневого узла;

ImageIndex: Integer; индекс картинки, соответствующей невыбранному узлу в нормальном состоянии;

SelectedIndex: Integer; индекс картинки, соответствующей выбранному узлу;

OverlayIndex: Integer; индекс картинки, которая может накладываться поверх основной;

StateIndex: Integer; индекс дополнительной картинки, отражающей состояние узла;

Selected: Boolean; равно True, если данный узел выбран пользователем; Focused: Boolean; равно True, если данный узел выбран пользователем

для редактирования текста узла;

Expanded: Boolean; равно True, если данный узел развернут (показываются его дочерние узлы).

139

Рассмотрим методы, используемые для добавления в дерево новых узлов.

function Add (Node: TTreeNode; const S: string): TTreeNode;

узел добавляется последним в тот же список, что и узел Node;

function AddFirst (Node: TTreeNode;

const S: siring): TTreeNode; узел добавляется первым в тот же список, что и узел Node;

function AddChild (Node: TTreeNode;

const S: string): TTreeNode; узел добавляется последним в список дочерних узлов узла Node;

function AddChildFirst (Node: TTreeNode;

const S: string): TTreeNode; узел добавляется первым в список дочерних узлов узла Node;

function Insert (Node: TTreeNode;

const S: string): TTreeNode; узел добавляется непосредственно перед узлом Node.

Во всех этих методах параметр s это текст создаваемого узла.

Помимо добавления узлов в дерево программным способом можно сделать это и вручную во время разработки. При щелчке в Инспекторе объектов на свойстве Items запускается специальный редактор (см. рис.).

Кнопка New Item (Новый узел) позволяет добавить в дерево новый узел. Он будет расположен на том же уровне, на котором расположен узел, выделенный курсором в момент щелчка на кнопке.

Кнопка New SubItem (Новый дочерний узел) позволяет добавить в дерево дочерний узел.

Кнопка Delete (Удалить) удаляет выделенный узел дерева. Кнопка Load позволяет загрузить структуру дерева из текстового файла.

Для каждого нового узла дерева можно указать ряд свойств в панели Item Properties: Text надпись, появляющаяся в дереве около данного узла; Image Index и Selected Index определяют индекс пиктограммы, отображаемой для узла, который соответственно не выделен и выделен пользователем в данный момент. Свойство State Index добавляет вторую пиктограмму в данный узел.

140

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

Компонент TImageList используется для централизованного управления картинками. Он представляет собой оболочку для создания и использования коллекции одинаковых по размеру и свойствам изображений. На этапе разработки в неё добавляют картинки. Компонент, который может быть использован вместе с TImageList, обладает двумя свойствами Images и ImageIndex. Первое указывает на компонент TImageList, второе на конкретную картинку в этом списке. Нумерация картинок начинается с нуля, для того чтобы ни одна картинка не отображалась необходимо указать -1.

Для заполнения списка коллекции используется встроенный редактор, который вызывается при двойном щелчке на компоненте.

Работа с редактором является простой, но следует учесть ряд особенностей. Только что выбранное изображение можно отредактировать, изменив его положение относительно отведенного ему прямоугольника: Crop (размещение, начиная с точки (0, 0)), Stretch (масштабирование) или Cento (центровка). Кроме того, можно изменить прозрачный цвет (Transparent Color). Точки с этим цветом при отрисовке не будут видны. Если редактор уже записал изображение в список, редактирование этих свойств становится невозможным. Поэтому размер картинок (свойства компонента Height и Width) нужно установить заранее.

+ Вместе с компонентом TImageList также могут использоваться

компоненты TMainMenu, TPopupMenu, TToolBar и некоторые другие.

Таким образом, для использования компонента TImageList необходимо указать на него ссылку в свойстве Images компонента TTreeView.

Для удаления узлов у свойства Items имеется два метода: Clear, очищающий все дерево, и Delete (Node: TTreeNode), удаляющий указанный узел Node и все его узлы потомки.

Реорганизация дерева (добавление, удаление, перемещение узлов) может вызвать мерцание изображения. Избежать этого можно с помощью методов BeginUpdate и EndUpdate. Первый из них запрещает перерисовку дерева, а второй разрешает. Между этими методами и размещаются операции над деревом.