Delphi 3 и создание приложений баз данных
Auster эксклюзивный запах

Работа с компонентом TDBCtrlGrid


TDBGrid является универсальным средством для отображения групповых данных (записей из одной таблицы реляционной БД, или записей из различных связанных таблиц). Однако известно, что универсальность никогда не является полной. В некоторых случаях применение компонента TDBGrid бывает затруднено:

• большим количеством полей, в этом случае приходится или помещать все поля в TDBGrid, что обычно приводит к необходимости их горизонтальной прокрутки, или помещать в TDBGrid лишь часть полей, а прочие либо выводить в отдельной форме, активизирующейся по нажатию экранной кнопки, или располагать ниже TDBGrid как компоненты TDBText, TDBEdit, TDBRadioGroup и т.д.;

• длинными заголовками столбцов; в этом случае приходится их сокращать, что ведет к потере смысла и удобочитаемости;

• невозможностью отображать в TDBGrid значения полей в виде, предоставляемом компонентом TDBCheckBox, и т.п.

Этот список при желании можно продолжить. Для преодоления подобных трудностей создан компонент типа TDBCtrlGrid, введенный в версию Delphi 3.0. Обладая основной функциональностью обычного компонента TDBGrid, он позволяет отображать информацию из одной записи НД в прямоугольной панели и размещать эту информацию на ней произвольным образом (рис. 10.22.):

Для работы с компонентом TDBCtrlGrid необходимо поместить его в форму, связать с компонентом TDataSource, который, в свою очередь, связать с каким-либо набором данных (TTable или TQuery) и затем разместить необходимые компоненты для работы с полями базы данных (TDBText, TDBEdit, TDBCheckBox) в верхней строке TDBCtrlGrid (рис. 10.23.):

Во время выполнения приложения расположение компонентов в верхней строке TDBCtrlGridvi их состав будет реплицирован на все оставшиеся строки, как это видно из рис. 10.22.

Порядок редактирования, добавления и удаления записей непосредственно из TDBCtrlGrid аналогичен порядку редактирования, добавления и удаления записей из TDBGrid. Для вставки новой записи необходимо нажать на клавиатуре клавишу Insert или попытаться перейти с последней записи в НД вниз на одну строку (рис. 10.24).

Для изменения записи достаточно ввести новое значение в какое-либо поле. Для удаления записи необходимо нажать комбинацию клавиш Ctrl+Delete. При этом на возможности редактирования, добавления и удаления записей в TDBCtrlGrid влияет ряд свойств как других компонентов (Table. Readonly, TField.ReadOnly, TDBEdit.Readonly), размещенных на панелях TDBCtrlGrid, так и самого компонента TDBCtrlGrid (AllowDelete, Allowlnsert).

Произведем выборочный обзор свойств, методов и событий TDBCtrlGrid:

Свойства

Разрешение корректировки

property AllowDelete: Boolean; -

определяет возможность удаления записей из TDBCtrlGrid {True, по умолчанию) или невозможность удаления (False);

property Allowlnsert: Boolean; -

определяет возможность вставки записей в TDBCtrlGrid (True, по умолчанию) или невозможность вставки (False);

Параметры показа:

property PanelHeight: Integer; -

высота в пикселах;

property PanelWidth: Integer; -

ширина в пикселах;

property Orientation: DBCtrlGridOrientation; -

определяет ориентацию TDBCtrlGrid- вертикальную (по умолчанию) или горизонтальную; DBCtrlGridOrientation = (go Vertical, goHorizontal);

property Pane/Border: DBCtrlGridBorder; -

определяет тип края панели -выступающий (по умолчанию) или отсутствующий; DBCtrlGridBorder = (gbNone, gbRaised); Число панелей, текущая панель, число колонок:

property Pane/Count: Integer; -

число панелей, видимых в TDBCtrlGrid.

property Panellndex: Integer;

- показывает, какая панель (в диапазоне 0.-PanelCount - 1) отображает текущую запись.

property RowCount: Integer; -

содержит число панелей в TDBCtrlGrid, начиная с 1. Изменение этого свойства ведет, к увеличению/уменьшению числа панелей в TDBCtrlGrid без изменения их высоты (PanelHeight). Отличие этого свойства от PanelCount состоит в том, что число RowCount можно изменять, например:

WITH DBCtrlGridl do RowCount := StrToInt(Edit1.Text) ;

property ColCount: Integer; -

определяет число колонок в TDBCtrlGrid. По умолчанию равно 1.

Метод procedure DoKey(Key: DBCtrlGridKey);

Выполняет определенное действие над TDBCtrlGrid. Действие определяется параметром А'еу. Некоторые из возможных значений:

gkNull

Действия нет

gkEditMode

Переводит компонент в режим редактирования

gkLeft Moves

Перемещает компонент на 1 колонку влево, при необходимости делает прокрутку окна компонента

gkRight

Перемещает на 1 колонку вправо

gkUp

Перемещает на 1 запись вверх

gkDown

Перемещает на 1 запись вниз

gkScrolIUp

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

gkScrollDown

Делает запись в следующей строке текущей без изменения ее местоположения

gkPageUp

Перемещает к предыдущей странице TDBCtrlGrid

gkPageDown

Перемещает к следующей странице TDBCtrlGrid

gkHome

Перемещает на первую запись

gkEnd Moves

Перемещает на последнюю запись

Пример. Разместим в форме 4 кнопки для перемещения к первой, последней, следующей и предыдущей записи в TDBCtrlGrid (рис. 10.25).

и напишем такие обработчики событий нажатия соответствующих клавиш:

// нажата клавиша "1-я запись"

procedure TForm1. FirstButtonCiick (Sender : T0bj]ect);

begin

DBCtrlGridl.DoKey(gkHome) ;

end;

// нажата клавиша "Последняя запись"

procedure TForm!.LastButtonClick(Sender: TObject) ;

begin

DBCtrlGridl.DoKey(gkEnd) ;

end;

// нажата клавиша "Запись вверх"

procedure TForm!.UpButtonClick(Sender: TObject) ;

begin

DBCtrlGridl.DoKey(gkScrolIUp) ;

end;

// нажата клавиша "Запись вниз"

procedure TForm! . DownButtonClick (Sender : TObjiect);

begin

DBCtrlGridl.DoKey(gkDown) ;

end;

Тогда нажатие соответствующей экранной клавиши приведет к соответствующим перемещениям компонента TDBCtrlGrid.

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

u (up) переход на одну запись вверх

d (down) переход на одну запись вниз

f (first) переход на первую запись

I (list) переход на последнюю запись

Тогда в обработчике события OnKeyDown для TDBCtrlGrid следует записать такой код:

procedure TFormI.DBCtrlGridlKeyDown (Sender: TObject; var Key: Word; Shift: TShiftState) ;

var S : TDBCtrlGridKey;

begin

CASE Key OF

68 : S := gkScrollDown; // нажата "d"

70 : S := gkHome; // нажата "f"

76 : S := gkEnd; // нажата "1"

85 : S := gkDown; // нажата "и"

END; {case}

DBCtrlGridl.DoKey(S) ;

end;

События

Для TDBCtrlGrid определены следующие события, аналогичные одноименным событиям TDBGrid: OnClick, OnDblClick, OnDragDrop, OnDragOver, OnEndDrag, OnEnter, OnExit, OnKeyDown, OnKeyPress, OnKeyUp, OnStartDrag.

Дополнительно введены события property OnPaintPanel: TPaintPanelEvent;

TPaintPanelEvent = procedure(DBCtrlGrid: TDBCtrlGrid; Index: Integer) of object;

Наступает для каждой панели TDBCtrlGrid перед ее показом. Обработчик этого события может управлять рисованием панели. Параметр TDBCtrlGrid показывает, какой именно компонент TDBCtrlGrid отображается в данный момент; параметр Index' определяет индекс отображаемой панели. /

property OnMouseDown: TMouseEvent;

наступает, когда пользователь нажимает левую кнопку мыши, находясь при этом на TBCtrlGrid.

property OnMouseUp: TMouseEvent;

наступает, когда пользователь отпускает нажатую ранее кнопку мыши, находясь при этом на TBCtrlGrid.

Содержание раздела