Вход


Главная страница >> Учебный процесс >> Конспекты >> Delphi. Библиотека визуальных компонентов VCL >> Описание компонентов VCL >> Таблицы >> Таблицы. TDrawGrid
Переход на главную страницу

Сервер поддерживается
кафедрой информатики и вычислительной техники ГрГУ
тел. +375-(0)152-445-101
E-mail :
kadan@grsu.grodno.by


[Назад]    [Содержание ]    [Вперед]

  


Таблицы. TDrawGrid


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

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

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

Значение текста ячейки может редактироваться ? для этого есть собственный встроенный редактор, являющийся потомком TMaskEdit.

Свойства TDrawGrid, определяющие его внешний вид, приведены в таблице:

(Рb) property ColCount: Longint;
(Pb) property RowCount: Longint;
Содержат количество строк и столбцов в таблице. Обратите внимание, что координаты ячеек в таблице имеют тип Longint, т. е. в принципе число строк н(или) столбцов может превышать 65535.
Property Col; Longint;
property
Row: Longint;
Содержат номера столбца и строки, содержащих сфокусированную ячейку.
Property ColWidths[Index: Longint]: Integer;
property
RowHeights[Index: Longint]: Integer;
Свойства-массивы, содержащие ширину каждого столбца и высоту каждой строки. (Ширина и высота ячеек могут быть индивидуальными, см. свойство Options.)
(Pb) property DefaultColWidth: Integer;
(Pb) property DefaultRowHeight: Integer;
Содержат ширину столбца и высоту строки, принимаемые по умолчанию. Они применяются при начальной инициализации таблицы и при добавлении в нее ячеек.
(Ro) property GridHeight: Integer;
(Ro) property GridWidth: Integer;
Содержат высоту и ширину всей таблицы. Эти свойства доступны только для чтения, так как являются производными от числа ячеек и их размеров.
(Pb) property ScrollBars: TscrollStyle;
TScrollStyle = (ssNone, ssHorizontal, ssVertical, ssBoth);
Задает полосу прокрутки. Если все ячейки не помещаются в область, отведенную компоненту, появляются полосы прокрутки в нужном направлении. По умолчанию предусмотрены обе полосы прокрутки.
(Pb) property FixedCols: Integer;
(Pb) property FixedRows: Integer ;
Содержат соответственно число строк и столбцов в фиксированной области.
(Pb) property FixedColor: TColor; Содержит цвет, которым происходит закрашивание ячеек фиксированной области.
property TopRow: Longint;
property
LeftCol: Longint;
Содержат номера верхней строки и левого столбца, видимых в подвижной области. Первоначально это первая ячейка за фиксированной областью (TopRow = FixedRows, LeftCol = FixedCols), однако при прокрутке и Других перемещениях сфокусированной ячейки эти значения могут изменяться. Свойства доступны только во время исполнения.
(Pb) property OnTopLeftChanged: TNotifyEvent ; Событие вызывается, когда изменяются TopRow или LeftCol.
property VisibleColCount: Integer;
property
VisibleRowCount: Integer;
Содержат соответственно число полностью видимых столбцов и строк в подвижной области. Могут быть не полностью видны еще один столбец и одна строка.

 

Рассматриваемый компонент имеет множество вариантов настройки под конкретное применение. Изменить его функционирование вы можете, настроив соответствующим образом опции:

(Pb) property Options: TGridOptions;

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

TGridOptions = set of TGridOption;

В множестве допускаются сочетания следующих опций:

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

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

goVertLine ? ячейки разделяются вертикальными линиями;

goHorzLine ? ячейки разделяются горизонтальными линиями;

goRangeSelect ? может быть выделено множество ячеек;

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

goRowSizing ? высота строк может изменяться индивидуально;

goColSizing ? ширина столбцов может изменяться индивидуально;

goRowMoving ? строки могут быть перемещены мышью;

goColMoving ? столбцы могут быть перемещены мышью;

goEditing ? ячейки таблицы могут редактироваться;

goAlwaysShowEditor ? содержимое активной (сфокусированной) ячейки всегда загружается в редактор (в противном случае требуется нажатие <F2> или щелчок мышью);

goTabs ? переход между столбцами возможен при помощи табуляции (<Таb> или <Shift>+<Tab>);

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

goThumbTracking ? задает поведение ячейки при передвижении мышью бегунка полосы прокрутки. Если эта опция отсутствует, содержимое ячеек не обновляется, пока пользователь не отпустит кнопку мыши; иначе _ перерисовка происходит при каждом изменении.

Толщина линий, разделяющих ячейки таблицы, задается свойством:

(Pb) property GridLineWidth: Integer;

Линии в вертикальном и горизонтальном направлениях рисуются в случае наличия опций [goFixedVertLine, goVertLine] и [goFixedHorzLine, goHorzLine] соответственно,

Метод

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

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

Метод MouseToCell превращает координаты точки нажатия кнопки мыши в индексы строки и столбца, где оно произошло:

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

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

property EditorMode: boolean;

Оно не имеет смысла, если редактор активен постоянно (установлена опция goAlwaysShowEditor).

Если установлен режим goTabs, то между столбцами таблицы можно

передвигаться, нажимая <Таb> или <Shift>+<Tab>. По умолчанию фокус будет

останавливаться на всех столбцах. Чтобы исключить остановку на некоторых

столбцах, нужно присвоить значение False элементу массива TabStops с нужным

индексом:

(Pb) property TabStops[Index: Longint]: Boolean;

He путайте это свойство с TabStop, которое касается всего компонента. Событие, возникающее при смене сфокусированной ячейки:

(Pb) property OnSelectCell: TSelectCellEvent;

TSelectCellEvent = procedure (Sender: TObject; Col, Row:Longint;
var CanSelect: Boolean) of object;

Фокус должен переместиться в ячейку (Col, Row). Изменяя значение параметра CanSelect, можно запретить перемещение фокуса в некоторые ячейки.

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

property Selection: TGridRect;

TGridRect = record
════════════════════case Integer of
═════════════════════════0: (Left, Top.
Right, Bottom: Longint);
═════════════════════════1: (TopLeft, BottomRight: TGridCoord);
═══════════════end;

TGridCoord = record
════════════════════X: Longint;
════════════════════Y: Longint;
════════════════end;

Стиль обрамления всей таблицы задается:

(Pb) property BorderStyle: TBorderStyle;

При bsSingle компонент окаймляется черной линией.

Перейдем к тому, как помещать и отображать информацию в ячейки TDrawGrid.

Если вы вводите текст, то он виден в редакторе, возникшем в текущей ячейке. Но как только ввод завершен, текст исчезает. Почему? TDrawGrid возлагает на программиста обязанность нарисовать содержимое каждой ячейки. Если свойство

(Pb) property DefaultDrawing: Boolean;

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

property Canvas: TCanvas ;

Обработчик события OnDrawCell должен иметь тип:

(Pb) property OnDrawCell: TDrawCellEvent;

TDrawCellEvent = procedure (Sender; TObject; Col, Row: Longint;
Rect: Trect; State: TGridDrawState) of object;

Параметры:

Col, Row ? координаты (номера столбца и строки) ячейки;

Rect ? отведенный ей прямоугольник;

State ? состояние ячейки. Описывается флагами из множества:

TGridDrawState = set of (gdSelected, gdFocused, gdFixed) ;

Флаги соответствуют выбранной, сфокусированной ячейкам и ячейке из фиксированной области. Приведенный ниже фрагмент кода закрашивает ячейки таблицы разным цветом в зависимости от значений во внешнем массиве Field:

procedure Tform1.DrawGrid1DrawCell(Sender: TObject;
═══════════════Col, Row: Longint; Rect: TRect; State: TGridDrawState);
begin
═════with DrawGrid1.Canvas do
══════════begin
═══════════════if Field[Col,Row] then
════════════════════Brush.Color := clAqua
═══════════════else
════════════════════Brush.Color := clBackground;
════════════════════FillRect(Rect);
══════════end;
end ;

При установленных опциях goColMoving/goRowMoving можно захватить мышью ячейку заголовка (в фиксированной области) и перенести всю строку или столбец на другое место. В этом случае после нажатия левой кнопки мыши появляется вертикальная или горизонтальная линия, показывающая, куда будет вставлена перемещаемая информация: при движении к началу таблицы ? за линией, к концу ? перед ней. При этом корректируются размеры выделенной области. Строки и столбцы заголовков, полностью лежащие в фиксированной области, переносить нельзя.

По окончании переноса происходят события, которые информируют о перемещении столбца или строки из положения FromIndex в положение ToIndex:

(Pb) property OnColumnMoved: TMovedEvent ;

(Pb) property OnRowMoved: TMovedEvent;

TMovedEvent = procedure (Sender: TObject; FromIndex, ToIndex: Longint) of object;

В редактируемой таблице (при установленном goEditing) есть возможность реагировать на связанные с изменением текста события. В начале (при вызове редактора) можно задать маску для редактирования ячейки, вернув ее в параметре Value обработчика события OnGetEditMask. Напомним, что редактор ячейки таблицы является потомком TMaskEdit:

(Pb) property OnGetEditMask: TGetEditEvent;

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). Существо "живет" нормально, если у него двое или трое соседей. Если их меньше, оно умирает от одиночества, если больше ? от перенаселения. Новая жизнь появляется в пустой ячейке, если у нее ровно трое соседей. Начальное состояние ячеек может быть случайным, а может быть задано вами: щелчок по ячейке означает изменение ее состояния. Запустив игру, вы увидите, как постепенно положение на игровом поле стабилизируется, и на нем образуется несколько разновидностей устойчивых конфигураций групп ячеек.



[Назад]    [Содержание ]    [Вперед]

  


Для комментария : kadan@grsu.grodno.by

  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017