Работа с компонентом 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
Перемещает к предыдущей странице TDBCtrlGridgkPageDown
Перемещает к следующей странице TDBCtrlGridgkHome
Перемещает на первую запись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.