Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы Delphi / Лабораторная работа 8.doc
Скачиваний:
23
Добавлен:
17.04.2015
Размер:
187.9 Кб
Скачать

Лабораторная работа № 8. Сетки строк Класс tDrawGrid

Компонент DrawGrid предназначен для создания таблицы, в ячейках которой расположены данные. Компонент обеспечивает двумерное представление данных, упорядоченных по строкам и столбцам.

Таблица делится на две части – фиксированную и рабочую. Фиксированная часть служит для показа заголовков столбцов/строк и для ручного управления их размерами. Обычно фиксированная часть занимает крайний левый столбец и самый верхний ряд таблицы. Она может содержать произвольное количество столбцов и рядов, при чём эти величины можно изменять как в процессе разработки, так и программно. Рабочая часть состоит из ячеек, в которых находятся данные. Если рабочая часть не помещается целиком в пределах окна компонента, то у компонента автоматически появляются полосы прокрутки. При прокрутке рабочей области фиксированная часть не исчезает, но меняется её содержимое – заголовки строк и рядов.

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

Свойства компонента DrawGrid

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

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

BorderStyle

определяет наличие или отсутствие внешней рамки таблицы;

ColCount

устанавливает количество столбцов таблицы, включая столбцы фиксированной части;

DefaultColWidth

определяет ширину столбца по умолчанию;

DefaultDrawing

при значении, равном True, происходит автоматическая прорисовка служебных элементов таблицы (фиксированной зоны, фона и прямоугольника сфокусированной ячейки и т.д.). Если свойство установлено в False, то прорисовки этих элементов необходимо определять в обработчике события OnDrawCell;

DefaultRowHeight

содержит значение высоты строки по умолчанию;

FixedColor

устанавливает цвет фиксированной зоны;

FixedCols

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

FixedRows

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

RowCount

устанавливает количество строк таблицы.

Дополнительно к перечисленным в таблице свойствам необходимо обратить особое внимание на свойство Options, определяющее некоторые особенности поведения компонента DrawGrid. Свойство определяется следующим образом:

type

TGridOption = (goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goDrawFocusSelected, goRowSizing, goColSizing, goRowMoving, goColMoving, goEditing, goTabs, goRowSelect, goAlwaysShowEditor, goThumbTracking);

TGridOptions = set of TGridOption;

property Options: TGridOptions;

Каждое значение характеризует особенности поведения таблицы в процессе работы приложения:

goAlwaysShowEditor

значение, равное True, позволяет редактировать сфокусированную (выделенную) ячейку. Редактирование возможно после выбора ячейки клавишей Tab (Tab+Shift). Подсвойство игнорируется, если goEditing установлено в False;

goColMoving

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

goColSizing

контролирует изменение ширины столбцов;

goDrawFocusSelected

включение этого свойства приводит к выделению ячейки, в которой находится фокус. Если же свойство равно False, то ячейка, имеющая фокус, не выделяется никаким цветом;

goEditing

Значение True свойства позволяет редактировать содержимое ячейки (свойство игнорируется, если значение goRowSelect равно True). Редактирование начинается после щелчка мыши или нажатия клавиши F2 и завершается при щелчке по другой ячейке или нажатии Enter;

goFixedHorzLine

включение свойства заставляет прорисовывать горизонтальные полосы для разделения строк в фиксированной области;

goFixedVertLine

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

goHorzLine

при значении False будут отсутствовать горизонтальные линии в рабочей области;

goRangeSelect

для того чтобы пользователь мог выбирать насколько ячеек одновременно, данное свойство следует установить в True (значение свойства будет игнорироваться, если свойство goEditing равно True)

goRowMoving

свойство аналогично goColMoving, разрешает перемещение ряда;

goRowSelect

значение True этого свойства позволяет выделять все (а не отдельные) ячейки строки, в этом случае будет игнорироваться свойство goAlwaysShowEditor;

goRowSizing

включение свойства позволяет вручную (мышью) изменять высоту строк;

goTabs

если свойство установлено в True, то можно выбирать ячейки клавишей Tab (Shift+Tab);

goThumbTracking

ячейки таблицы будет обновляться в процессе использования полосы прокрутки. Если значение равно False, то обновление ячеек произойдёт только после окончания прокрутки.

goVertLine

при значении свойства, равном False, в рабочей области отсутствуют вертикальные линии.

Кроме перечисленных свойств, во время выполнения программы становятся доступными ещё некоторые свойства.

Свойство Col/Row определяет номер столбца/строки сфокусированной (выделенной) ячейки. Нумерация и строк и столбцов начинается с нуля, включая строки и столбцы фиксированной зоны.

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

Свойство EditorMode отвечает за возможность редактирования ячеек (свойство будет игнорироваться, если goAlwaysShowEditor равно True или goEditing равно False). Когда во время работы программы пользователь нажимает кнопку F2, EditorMode устанавливается в True автоматически. После того как пользователь нажимает клавишу ввода, свойство принимает значение False.

Свойство Selection позволяет определить координаты текущего выделения. Описывается свойство следующим образом:

type

TGridCoord = record

X: Longint;

Y: Longint;

end;

TGridRect = record

case Integer of

0: (Left, Top, Right, Bottom: Longint);

1: (TopLeft, BottomRight: TGridCoord);

end;

property Selection: TGridRect;

Свойство Selection определяет группу выделенных ячеек в координатах левая верхняя и правая нижняя ячейки. После выделения сфокусированной окажется правая нижняя ячейка.

Методы компонента DrawGrid

Экранные координаты прямоугольника ячейки можно получить по номерам столбца ACol и ряда ARow с помощью метода CellRect:

function CellRect(ACol, ARow: Longint): TRect;

где тип TRect – это

type

TRect = record

case Integer of

0: (Left, Top, Right, Bottom: Integer);

1: (TopLeft, BottomRight: TPoint);

end;

TPoint = record

X: Longint;

Y: Longint;

end;

Получить номер столбца ACol и номер строки ARow по экранным координатам (X,Y) точки можно с помощью метода MouseToCell:

procedure MouseToCell(X, Y: Integer; var ACol, ARow: Longint);

Например, необходимо определить по какой ячейке был произведён щелчок мышью, то можно воспользоваться обработчиком события OnMouseDown:

procedure TForm1.DrawGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var Acol, Arow :integer; {переменные для хранения номера столбца/строки}

begin

DrawGrid1.MouseToCell(x, y, Acol, Arow);

{используя параметры события OnMouseDown,

определяем номера строки и столбца}

end;

События компонента DrawGrid

Событие OnColumnMoved возникает при перемещении столбца. Оно происходит только тогда, когда подсвойство goColMoving равно True. Заголовок обработчика этого события имеет вид:

procedure TForm1.DrawGrid1ColumnMoved(Sender: TObject; FromIndex, ToIndex: Integer);

Параметр FromIndex содержит «старый» индекс столбца, а ToIndex – «новый» индекс перемещаемого столбца.

Событие OnRowMoved возникает при перемещении строки. Оно происходит только тогда, когда goRowMoving включено в свойство Options. Заголовок обработчика этого события имеет вид:

procedure TForm1.StringGrid1RowMoved(Sender: TObject; FromIndex, ToIndex: Integer);

Событие OnTopLeftChanged происходит при изменении значения TopRow или LeftCol в результате прокрутки рабочей зоны:

procedure TForm1.DrawGrid1TopLeftChanged(Sender: TObject);

Событие OnSelectCell возникает при попытке выделить ячейку с табличными координатами (ACol, ARow). В параметре CanSelect обработчик сообщает о возможности выделения ячейки. Установите его значение равным False, чтобы пользователь не мог выделять ячейку. Событие описывается следующим образом:

procedureTForm1.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;varCanSelect:Boolean);

Cобытие OnSetEditText возникает по завершении редактирования ячейки с координатами (ACol, ARow). В параметре Value обработчик получает результат ввода или редактирования текста. Событие произойдёт только в том случае, когда в свойство Options содержит значение goEditing. Описывается событие так:

procedureTForm1.DrawGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;constValue:String);

События OnGetMaskEdit и OnGetEditText возникают при редактировании текста в ячейке с табличными координатами (ACol, ARow). В параметре Value первого события обработчик должен вернуть шаблон для редактора TEditMask. Параметр Value для события OnGetEditText должен содержать текстовую информацию для редактора TEditMask. Описание событий выглядит следующим образом:

procedureTForm1.DrawGrid1GetEditMask(Sender: TObject; ACol, ARow: Integer;varValue:String);

procedure TForm1.DrawGrid1GetEditText(Sender: TObject; ACol, ARow: Integer; var Value: String);

Событие OnDrawCell происходит всякий раз, когда необходимо прорисовать ячейку таблицы. Обработчик данного события полностью берёт на себя ответственность за размещение в каждой ячейке нужных данных. Описывается следующим образом:

procedureTForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);

Событие происходит в случае необходимости перерисовки ячейки с номером столбца ACol и номером строки ARow. Параметр Rect определяет прямоугольник прорисовки, а State - состояние ячейки (gdSelected ‑ ячейка выделена, gdFocused ‑ ячейка сфокусирована, gdFixed ‑ ячейка принадлежит фиксированной зоне таблицы). Для прорисовки используется свойство Canvas.

Упражнение 1. Создайте приложение, которое позволяет просматривать символы системных шрифтов.

Решение

Создайте новый проект. Сохраните новое приложение в папке Fonts, файл модуля – под именем Main.pas, файл проекта – fonts.dpr.

1 этап. Визуальное проектирование

Измените значения свойств формы следующим образом:

Name

Fonts

Caption

Символы

Положите на форму компонент TPanel:

Align

alTop

Caption

Разместите на компоненте Panel1 компонент ComboBox (рис. 1.). Пусть имя этого компонента будет FontListCB.

Рис. 1

Далее расположите на форме компонент TDrawGrid:

Name

FontDG

Align

alClient

RowCount

7

ColCount

32

FixedCols

0

FixedRows

0

DafaultColWidth

20

DefaultRowHeight

20

Измените размеры формы так, чтобы сетка не имела полос прокрутки, а вокруг ячеек не было пустого пространства.

2 этап. Разработка программного кода

Для того чтобы содержимое каждой ячейки перерисовывалось, создадим обработчик события OnDrawCell для компонента FontDG. Для изображения символов шрифта воспользуемся свойством Canvas компонента FontDG. Непосредственно нам понадобится метод TextRect свойства Canvas. Этот метод используется для вывода текстовой информации в определённой ячейке. Обработчик события будет выглядеть так:

procedureTFonts.FontDGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);

begin

with FontDG.Canvas do

TextRect (Rect, Rect.Left, Rect.Top, Char((ARow+1)*32+ACol));

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

end;

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

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

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

Информация о доступных приложению шрифтах содержится в свойстве Font, принадлежащем переменной Screen.

Создадим следующий обработчик:

procedure TFonts.FormCreate(Sender: TObject);

begin

with FontListCB do begin

Items := Screen.Fonts ;

{в свойстве FontsпеременнойScreenсодержатся названия всех экранных шрифтов}

ItemIndex :=Items.IndexOf(Font.Name);

{свойства IndexOfсодержит номер строки в спискеFontListCB,

которая выбрана, и, соответственно, содержит имя текущего шрифта}

end;

end;

Сохраните и запустите проект. Компонент FontDG содержит символы шрифта, установленного в FontListCB. Сколько шрифтов установлено на компьютере. Что происходит при выборе другого шрифта? 

Для того чтобы связать значение имени шрифта у FontDG и FontListCB, создадим ещё один обработчик события:

procedure TFonts.FontListCBClick(Sender: TObject);

begin

FontDG.Font.Name := FontListCB.Text ;

end;

Сохраните и запустите проект. Что происходит при изменении шрифта?