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

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

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

141

Вернемся к свойствам компонента TTreeView. Важным свойством компонента является Selected: TTreeNode, оно указывает узел, выделенный пользователем. Если ни один узел не выбран, значение свойства равно nil. Перед выделением нового узла происходит событие OnChanging. В обработчик события передаются параметры Node: TTreeNode узел, который выделен в данный момент, и AllowChange: Boolean разрешение на перенос выделения. Если в обработчике задать AllowChange:= False, то переключение выделения не произойдет.

Свойство ReadOnly позволяет запретить пользователю редактировать данные.

Несколько свойств компонента TreeView: ShowButtons, ShowLines,

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

Свойство SortType позволяет автоматически сортировать ветви и узлы дерева. Например, возможные значения: stNone (без сортировки), stText (по алфавиту) и др.

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

Для иллюстрации возможностей компонента TreeView реализуем следующее приложение. Вид приложения показан на рисунке.

Создадим новый проект, назовём основную форму TreeViewForm и поместим на неё следующие компоненты:

1.TreeView для отображения иерархической информации;

2.ImageList содержит список из двух любых картинок;

3.Кнопки:

-«Добавить» (имя ButAdd) добавление узла;

-«Добавить элемент» (имя ButAddChild) – добавление дочернего узла;

142

-«Удалить» (имя ButDel) – удаление узла;

-«Изменить заголовок» (имя ButEdit);

-«Загрузить» (имя ButLoad) – загрузка из файла структуры дерева;

-«Сохранить» (имя ButSave) – сохранение в файл структуры

дерева.

Для добавления нового элемента (кнопка «Добавить») в дерево запишем следующий код:

procedure TTreeViewForm.ButAddClick(Sender: TObject); var

//хранится имя нового элемента дерева

CaptionStr: String;

// новый элемент дерева

NewNode: TTreeNode; begin

CaptionStr:=''; //обнуляем строку

{отображается окно ввода, для запроса имени нового элемента}

if not InputQuery('Ввод имени',

'Введите заголовок элемента',CaptionStr) then Exit;

{создаётся новый элемент с именем CaptionStr и возвращается указатель на него в NewNode} NewNode:=TreeView1.Items.Add

(TreeView1.Selected, CaptionStr);

{если новый элемент не верхний в дереве, то у элемента отображается иконка с индексом 1} if NewNode.Parent<>nil then

NewNode.ImageIndex:=1; end;

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

procedure TTreeViewForm.ButAddChildClick(Sender: TObject); var

CaptionStr: String;

NewNode: TTreeNode; begin

CaptionStr:='';

if not InputQuery('Ввод имени подэлемента',

'Введите заголовок подэлемента',CaptionStr) then Exit;

NewNode:=TreeView1.Items.AddChild(TreeView1.Selected,

CaptionStr);

143

if NewNode.Parent<>nil then NewNode.ImageIndex:=1;

end;

Теперь опишем обработчик события OnClick кнопки «Удалить», добавив в следующий код:

//если выделенный элемент находится в дереве if TreeView1.Selected<>nil then

TreeView1.Items.Delete(TreeView1.Selected);

Изменение заголовка будем осуществлять при нажатии кнопки «Изменить заголовок». Создадим обработчик:

procedure TTreeViewForm.ButEditClick(Sender: TObject); var

CaptionStr:String; begin

CaptionStr:='';

if not InputQuery('Ввод имени',

'Введите заголовок элемента',CaptionStr) then exit; TreeView1.Selected.Text:=CaptionStr;

end;

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

procedure TTreeViewForm.ButSaveClick(Sender: TObject); begin

TreeView1.SaveToFile(ExtractFilePath

(Application.ExeName)+'tree.dat'); end;

Метод SaveToFile позволяет сохранить дерево в файл, указанный в качестве параметра (в нашем случае в tree.dat). Application.ExeName указывает на имя запущенного файла. Метод ExtractFilePath извлекает путь к файлу, указанному в качестве параметра.

Загрузку дерева из файла будем производить при отображении главной формы приложения (событие OnShow) или при нажатии на кнопку «Загрузить». Для этого в обработчиках запишем код:

var i:Integer;

begin

if FileExists(ExtractFilePath (Application.ExeName)+'tree.dat')

then

TreeView1.LoadFromFile(ExtractFilePath

(Application.ExeName)+'tree.dat');

144

{перебираются все элементы дерева, в зависимости от уровня элемента в дереве определяем для него либо первую, либо вторую иконку – для дочернего элемента} for i:=0 to TreeView1.Items.Count-1 do

begin

if TreeView1.Items[i].Parent=nil then TreeView1.Items[i].ImageIndex:=0

else

TreeView1.Items[i].ImageIndex:=1; end;

TreeView1.Selected; end;

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

145

Глава 14. Работа с графикой

Понятие холста

Windows графическая оболочка и всё, что в ней отображается это графика. При проектировании больших приложений оказывается недостаточно

стандартных графических средств при оформлении определённых частей программы. Вся технология вывода графической информации на экран основывается на понятии холста (класс TCanvas). Этот класс обладает всеми возможностями для отображения такой информации, и на его основе создано большинство компонентов Delphi, которые представляют собой элементы

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

Принцип отрисовки изображений в Windows

После того, как на холст выведена графическая информация, она отображается в рамках формы до тех пор, пока область холста не закроется другим окном или приложение не будет свернуто, то есть пока область холста не окажется закрытой (возможно, частично). При новом появлении этой области на экране графические данные, выведенные на нее ранее, не восстановятся и их придется выводить снова. Лучше всего это делать когда область холста становится видимой, Windows генерирует системное сообщение WM_PAINT, описывающее ту часть формы, которая требует перерисовки. В системе Delphi такое сообщение обозначается OnPaint, оно автоматически обрабатывается формами и элементами управления, при необходимости их отображения и обычно не требует вмешательства со стороны программиста. Исключением являются те случаи, когда форма используется именно для вывода графической информации: всевозможных графиков, мультимедийных данных и т. п.

Свойства и методы класса TCanvas

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

Класс Карандаш (ТРen). Карандаш свойство Реn класса TCanvas определяется основными свойствами:

Color цвет карандаша;

Style стиль линии определяет, будет ли она сплошной или пунктирной. Возможные значения: psSolid (сплошная линия); psDash (пунктирная); psDot (линия из точек); psDashDot (линия с чередующимися чёрточками и точками) и другие;

146

Width толщина линии в пикселях.

Класс Кисть (TBrush). Кисть свойство Brush класса TCanvas,

предназначена для заполнения сплошных областей клиентской части формы в соответствии с заданным шаблоном. Помимо свойств Color и Style, совпадающих с аналогичными свойствами класса ТРеn, в класс TBrush добавлено новое свойство Bitmap, которое позволяет заполнять область не только сплошным цветом или пунктирными линиями, но и заранее подготовленным точечным изображением.

Класс Шрифт (TFont). Шрифт свойство Font класса TCanvas, служит оболочкой ресурса Windows, определяющего текущий шрифт. Содержит множество стандартных свойств, описывающих характеристики шрифта. Основные свойства:

Name в качестве значения может использоваться название любого шрифта, доступного в данный момент системе, например, «Arial»; Charset набор символов, который используется при выводе

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

RUSSIAN_CHARSET;

Color определяет цвет выводимого текста;

Height определяет высоту шрифта в пунктах (1/72 дюйма). Используется, когда имеет положительное значение. При установке данного свойства свойство Size становится отрицательным;

Size определяет высоту шрифта в точках. Используется, когда имеет положительное значение. При установке данного свойства свойство Height становится отрицательным;

Style определяет набор атрибутов шрифта. В множество могут включаться элементы fsBold (полужирное начертание шрифта), fsltalic (наклон символов), fsUrKlerhne (подчеркивание) и fsStrikeOut (перечеркнутые символы).

Основными методами класса TCanvas являются:

procedure Arc (XI, Y1, Х2, Y2, ХЗ, Y3, Х4, Y4: Integer)

рисование части эллипса;

procedure CopyRect (Dest: TRect; Canvas: TCanvas;

Source: TRect) копирование на данный холст области с другого холста. Способ вывода определяется значением свойства CopyMode. Тип TRect определяет размеры и положение области;

procedure Draw (X, Y: Integer; Graphic: TGraphic); вывод графического изображения в заданной точке холста;

procedure Ellipse (const Rect: TRect); рисуется эллипс;

procedure FillRect (const Rect: TRect); рисуется прямоугольник,

который заполняется в соответствии со значением свойства Brush;

147

procedure FloodFill (X, Y: Integer; Color: TColor;

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

procedure FrameRect (const Rect: TRect); Рисуется прямоугольник заданного размера с толщиной границы в 1 пиксель. Вид линии определяется значением свойства Brush;

procedure LineTo (X, Y: Integer); рисует линию от точки,

определенной свойством PenPos (текущая позиция графического курсора) до точки, указанной в качестве параметра;

procedure MoveTo (X, Y: Integer); устанавливает текущую позицию графического курсора в точку, заданную в параметрах метода;

procedure Polygon (Points: array of TPoint); рисуется сложная фигура, состоящая из отрезков, последовательно соединяющих точки, представленные в виде динамического массива элементов TPoint. Последняя точка соединяется с первой. Внутренняя часть фигуры заполняется в соответствии со значением свойства Brush;

procedure Polyline (Points: array of TPoint); метод аналогичен предыдущему, но заполнения внутренней части фигуры не происходит;

procedure Rectangle (const Rect: TRect); рисуется прямоугольник.

Его внутренняя область заполняется в соответствии со значением свойства

Brush;

procedure RoundRect (XI, Yl, X2, Y2, ХЗ, Y3: Integer); метод аналогичен предыдущему. Рисуется прямоугольник со скругленными углами;

procedure TextOut (X, Y: Integer; const Text: string); вывод строки в конкретную позицию холста;

function TextHeight (const Text: string): Integer; возвращает высоту в пикселах строки, выведенной текущим шрифтом;

function TextWidth (const Text: string): Integer; ширина в пикселях строки, выведенной текущим шрифтом.

Основные компоненты для вывода графической информации Компонент TPaintBox (Область рисования)

Этот компонент расположен на панели System. Он не имеет никаких

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

148

Компонент TPaintBox может охватывать произвольную прямоугольную область формы. Он содержит единственное главное свойство Canvas, имеющее собственную систему координат. Единственное обрабатываемое событие OnPaint генерируется системой Windows автоматически при необходимости перерисовать одну или несколько областей (или их части). Разработчик должен только определить, что будет изображено в каждом объекте класса TPaintBox.

Компонент TImage (Изображение)

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

В большинстве случаев содержимое изображения загружается из файла на этапе проектирования. Для этого служит свойство Picture (класс ТPicture), описывающее точечное изображение (.ВМР), значок, графический метафайл Windows или другой пользовательский графический ресурс. Класс TPicture (рисунок) не является компонентом Delphi, он просто входит в состав библиотеки VCL как вспомогательный, но на его основе могут быть созданы полноценные компоненты.

Текущее содержимое экземпляра класса хранится в одном из свойств:

Bitmap (класс TBitmap), Icon (значок, класс TIcon) или Metafile (класс

TMetafile, формат графического метафайла Windows .EMF). Обратиться к

любому из этих свойств для отображения графики можно через свойство Graphic. Ширина и высота изображения (в пикселях) задаются в свойствах

Width и Height.

Выбрав в Инспекторе объектов свойство Picture, можно вызвать специальный редактор, с помощью которого можно загрузить изображения в форматах .BMP, .ICO, JPG или в одном из форматов графического метафайла

Windows.

Если класс TPicture предназначен только для загрузки, хранения и сохранения изображения, то с помощью класса TImage с изображением (из свойства Picture) можно осуществлять определенные манипуляции.

Прежде всего в классе TImage имеется свойство Canvas (холст), с

помощью которого можно выводить различную графическую информацию непосредственно на изображение. С помощью свойства Center картинку можно центрировать внутри заданной рамки, если она меньше рамки. Если свойство Center имеет значение True, рисунок центрируется, в противном случае его верхний левый угол совмещается с верхним левым углом рамки. Установив значение свойства Stretch равным True, можно включить режим

автоматического растяжения или сжатия изображения в соответствии с положением границ рамки.

Некоторые области изображения можно сделать прозрачными, чтобы сквозь них «просвечивал» фон формы. Прозрачность определяется заданием значения True для свойства Transparent.

149

+ Этот режим не применим к точечному изображению в

формате .ВМР.

Компонент TShape (Фигура)

Компонент рисует одну из простейших геометрических фигур: stCircle окружность:

stRounrSaustre квадрат с закругленными сторонами; stSquare квадрат;

stEllipse эллипс; stRectangle прямоугольник;

stRoundRect прямоугольник с закругленными сторонами.

Фигура полностью занимает все пространство компонента. Помимо стандартных графических инструментов Brush и Pen, в компоненте определено свойство Shape, задающий вид фигуры. Изменение этого свойства приводит к немедленной перерисовке изображения.

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

Рассмотрим примеры, иллюстрирующие основы работы с графической информацией в Delphi.

1.Создадим несложную программу просмотра изображений.

Для приложения нам понадобится компоненты TPanel, для вывода служебной информации и управляющих компонентов, таких как TButton и TLabel. Изображение будем выводить в компонент TImage.

Создадим новое приложение и поместим на форму панель Panel1, очистим ее свойство Caption и в свойстве Align укажем alRight, что позволит выровнять объект по правому краю. Разместим на панели кнопку Button1 с надписью «Загрузить» и Label1 для вывода имени файла изображения.

На любое свободное место формы поместим компонент TImage и установим в его свойство Align значение alClient. При этом он займет всю форму, за исключением пространства занимаемого панелью.

Поместим компонент TOpenPictureDialog (вкладка Dialogs) – с его помощью будем открывать нужный файл с изображением.

Для кнопки напишем обработчик события OnClick:

if OpenPictureDialog1.Execute then begin

Image1.Picture.LoadFormFile(OpenPictureDialog1.FileName); Image1.Stretch := True;

Image1.Proportional:= True;

Label1.Caption:= OpenPictureDialog1.FileName; end;

150

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

2.Нарисуем изображение и выведем текст в окне PaintBox.

Поместим компонент PaintBox на форме. Выровняем его по всей форме.

И создадим обработчик события OnPaint (событие перерисовки компонента) для PaintBox1, в нем напишем:

procedure TForm1.PaintBox1Paint (Sender: TObject); var x, y: integer;

begin

//оператор присоединения with Paintbox1.Canvas do begin

//устанавливаем цвет кисти «красный»

Brush.Color:=clRed;

//рисуем эллипс размером с клиентскую область

Ellipse(0,0,ClientWidth,ClientHeight);

//задаем имя гарнитуры шрифта

Font.Name:='Arial';

//размер шрифта 5 часть от клиентской области

Font.Size:=ClientHeight div 5;

//стиль шрифта – «жирный» и «наклонный»

Font.Style:=[fsBold, fsItalic];