
Поместите на пустую форму компонент tDrawGrid и установите для него следующие значения свойств:
Свойство |
Значение |
Комментарий |
Align |
alClient |
Таблица занимает всю клиентскую часть окна |
ColCount |
2 |
В таблице 2 колонки |
FixedCols |
0 |
Нет фиксированных колонок |
FixedRows |
0 |
Нет фиксированных рядов |
Name |
dgDraw |
Имя таблицы |
Options.goEditing |
True |
Разрешено редактирование текста |
RowCount |
2 |
В таблице 2 строки |
ScrollBars |
sbNone |
He надо вставлять полосы прокрутки |
Теперь необходимо создать обработчики событий OnGetEditText, OnSetEditText иOnDrawCell. Два первых используются для редактирования текста, а обработчик OnDrawCell обязательно создается для любого компонента TDrawGrid, т. к. без него компонент не сможет заполнить пустые клетки каким-либо изображением или текстом.
procedure TfmDrawGrid.DrawGridlGetEditText(Sender: TObject;
ACol, ARow: Integer;
var Value: String ) ;
// Передает редактору текст из ячейки
begin
Value := slBitMap[2 * ACol + Arow]
end;
procedure TfmDrawGrid.DrawGridlSetEditText(Sentier: TObject;
ACol, ARow: Integer; const Value: String ) ;
// Получает текст из редактора и сохраняет его в sIBitMap
begin
slBitMap[2 * ACol + ARow] := Value
end;
procedure TfmDrawGrid.dgDrawDrawCell(Sender: TObject;
Col, Row: Integer; Rect: TRect; State: TGridDrawState) ;
// Рисует картинку из sIBitMap.Objects и текст из sIBitMap
var
k: Integer;
begin
// Пересчитываем координаты ячейки в индекс списка:
k := 2 * Col + Row;
with dgDraw.Canvas, Rect, sIBitMap do
begin
// Уменьшаем высоту картинки для вывода под ней текста:
Bottom := Bottom - TextHeight('1') - 2;
// Рисуем картинку:
StretchDraw(Rect, (Objects[k] as TBitMap)) ;
// Центрируем текст по горизонтали и выводим его:
TextOut(Left+(Right-Left-TextWidth(sIBitMap[k])) div 2,
Bottom + 1, slBitMap[k])
end
end;
Осталось добиться того, чтобы размеры ячеек таблицы согласовывались с размерами окна программы. Для этого создайте для формы fmDrawGrid такой обработчик события onResize (это событие возникает при каждом изменении размеров окна):
procedure TfmDrawGrid.FormResize(Sender: TObject);
// Изменяет размеры ячеек при изменении размеров окна.
// Запас в один пиксель необходим для предотвращения
// автопрокрутки
begin
with dgDraw do
begin
DefaultColWidth := ClientRect. Right div 2-1;
DefaultRowHeight := ClientRect. Bottom div 2-1
end;
end;
На этом шаге мы рассмотрим компонент TDrawGrid.
Компонент TDrawGrid используется точно так же, как и компонент TStringGrid. Единственное отличие состоит в том, что в ячейки нельзя записывать строки. Если для таблицы строк можно написать следующую команду:
TStringGrid(Sender).Cells[0,0]:='1';
то для таблицы изображений этого сделать нельзя, у нее просто нет свойства Cells.
Компонент TDrawGrid используется для отображения производной информации в виде таблицы. В TDrawGrid имеется много событий и методов для получения преимуществ от табличной организации информации в ответ на действия пользователя.
Некоторые методы и события позволяют организовать программное управление компонентом. Например, во время работы программы вы можете получить в свое распоряжение область для рисования некоторой ячейки с помощью метода CellRect. Метод MouseToCell возвращает координаты номера столбца и строки ячейки, на которую установлен курсор мыши. Выбранная ячейка сетки становится значением свойства Selection.
Компонент TDrawGrid предоставляет программисту мощные возможности создания и обслуживания табличных структур данных. Он обеспечивает двухмерное представление данных, упорядоченных по столбцам и рядам.
Чтобы таблица была работоспособной, в ней следует определить обработчик события OnDrawCell, которое возникает при необходимости прорисовать ту или иную ячейку. Для прорисовки используется табличное свойство Canvas.
Компонент TDrawGrid является непосредственным родителем строковой таблицы TStringGrid, поэтому передает ей все свои свойства, методы и события за исключением специфичных для строк свойств Cells, Cols, Objects и Rows.
Заметим, что если в ячейках необходимо отображать только строки, то лучше использовать компонент TStringGrid, а если отображать поля из записей или баз данных, то больше подходит TDBGrid.
В следующем примере компонент TDrawGrid используется для показа текста и картинок одновременно, причем текст можно редактировать.
Расположим на форме компонент TDrawGrid и зададим для него следующие значения свойств: Align - alClient (таблица занимает всю клиентскую часть окна), ColCount - 2 (в таблице 2 колонки), FixedCols - 0 (нет фиксированных колонок), FixedRows - 0 (нет фиксированных рядов), Name - dgDraw (имя таблицы), Options.goEditing - True (разрешено редактирование текста), RowCount - 2 (в таблице 2 строки), ScrollBars - sbNone (не надо вставлять полосы прокрутки).
Заметим, что для компонента TDrawGrid необходимо создать обработчики событий OnGetEditText, OnSetEditText и OnDrawCell. Два первых используются для редактирования текста, а обработчик OnDrawCell обязательно создается для любого компонента TDrawGrid, т. к. без него компонент не сможет заполнить пустые клетки каким-либо изображением или текстом. Для того, чтобы размеры ячеек таблицы согласовывались с размерами окна программы необходимо создать для формы обработчик события onResize (это событие возникает при каждом изменении размеров окна).
Обратим внимание: в константе Bmp_Path указывается стандартный путь доступа к графическим файлам. Если на вашем компьютере они установлены в другой папке, эту константу нужно соответствующим образом изменить, после этого полезно осуществить прогон программы и убедиться в доступности файлов. Если при прогоне появится сообщение Cannot open file, еще раз убедитесь в том, что файл drawgrid.exe создан в том же каталоге, в котором находятся bmp-файлы.
Текст приложения отображается ниже:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids;
type
TForm1 = class(TForm)
dgDraw: TDrawGrid;
procedure FormCreate(Sender: TObject);
procedure FormDeactivate(Sender: TObject);
procedure dgDrawGetEditText(Sender: TObject; ACol, ARow: Integer;
var Value: String);
procedure dgDrawSetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
procedure dgDrawDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
slBitMap:TStringList; {список строк который используется для оперативного
хранения изображений и подписей}
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
{создает и наполняет список slBitMap в момент создания формы}
const Bmp_Path='E:\Instal\Common Files\Borland Shared\'
+'Images\Splash\16Color\';
FNames: array [0..3] of string=
('ATHENA.bmp','CHIP.bmp','CONSTRUC.bmp','TECHNLGY.bmp');
var k:integer;
begin
{создает список строк}
slBitMap := TStringList.Create;
{вставляет в этот список строк названия файлов и картинки}
with slBitMap do for k:=0 to 3 do
begin
Add(FNames[k]);
Objects[k]:=TBitMap.Create;
(Objects[k] as TBitMap).LoadFromFile(Bmp_Path+FNames[k]);
end;
end;
procedure TForm1.FormDeactivate(Sender: TObject);
{удаляет список slBitMap при разрушении формы}
begin
slBitMap.Free;
end;
procedure TForm1.dgDrawGetEditText(Sender: TObject; ACol, ARow: Integer;
var Value: String);
{передает в редактируемое поле текст из ячейки}
begin
Value:= slBitMap[2*ACol + ARow];
end;
procedure TForm1.dgDrawSetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
{получает текст из редактируемого поля и сохраняет его в slBitMap}
begin
slBitMap[2*ACol + ARow]:= Value;
end;
procedure TForm1.dgDrawDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
{рисует картинку из slBitMap.Objects и текст из slBitMap}
var k: integer;
begin
{пересчитываем координаты ячейки в индекс списка}
k:= 2*ACol + ARow;
with dgDraw.Canvas, Rect, slBitMap do
begin
{уменьшаем высоту картинки для вывода под ней текста}
bottom:= bottom- TextHeight('1')-2;
{рисуем картинку}
StretchDraw(Rect, (Objects[k] as TBitMap));
{центрируем текст по горизонтали и выводим его}
TextOut(Left + (Right - Left - TextWidth(slBitMap[k])) div 2,
Bottom + 1, slBitMap[k] );
end;
end;
procedure TForm1.FormResize(Sender: TObject);
{изменяет размеры ячеек при изменении размеров окна. Запас в
один пиксель необходим для предотвращения автоматической прокрутки}
begin
with dgDraw do
begin
DefaultColWidth:= ClientRect.Right div 2 - 1;
DefaultRowHeight:= ClientRect.Bottom div 2 - 1;
end;
end;
end.
Текст этого примера можно взять здесь.
Рис.1.Пример
использования таблицы TDrawGrid
для отображения картинок и текста
На следующем шаге мы рассмотрим компонент TImage.