И последнее, что мы сотворим с нашим гридом :о), это снабдим его свойством FixedCols, которого так не хватает в стандартном TDBGrid'е.
Для тех, кто может быть не знает, отметим, что у стандартного TDBGrid есть фиксированный столбец, он используется гридом для внутренних нужд. Это тот самый индикатор слева, в котором рисуется треугольник, указывая на текущую строку. Добавляя свое свойство FixedCols, необходимо это учитывать.
TexDBGrid = class(TDBGrid) private ... FFixedCols : Integer; ... public Property FixedCols : Integer read GetFixedCols write SetFixedCols; ...
//**************************************************************************************************
procedure TexDBGrid.SetFixedCols(const Value: Integer); Var FixedCount,i : Integer; begin
// Следует учесть индикатор грида
IF Value IndicatorOffset + 1) Then Begin IF FixedCount >= ColCount Then FixedCount:=ColCount - 1;
Inherited FixedCols := FixedCount;
// На фиксированных колонках нельзя останавливаться по табуляции
For i := 1 To FixedCols Do TabStops[I] := False; End;
FFixedCols := FixedCount - IndicatorOffset; end; //************************************************************************************************** function TexDBGrid.GetFixedCols: Integer; begin IF DataLink.Active Then Result := Inherited FixedCols - IndicatorOffset Else Result := FFixedCols; end; //************************************************************************************************** |
Необходимо восстанавливать данные о фиксированных колонках каждый раз, когда параметры колонок будут пересчитываться. Смотрите в иллюстрирующем проекте процедуры TexDBGrid.LayoutChanged; и TexDBGrid.SetColumnAttributes.
Для того, чтобы в нашем гриде фиксированные колонки вели себя также, как ведут они себя, например, в TStringGrid, нужно обработать реакцию на мышь и клавиатуру.
//************************************************************************************************** Procedure TexDBGrid.KeyDown(var Key: Word; Shift: TShiftState); Var KeyDownEvent: TKeyEvent; Begin KeyDownEvent := OnKeyDown; IF Assigned(KeyDownEvent) Then KeyDownEvent(Self, Key, Shift); IF NOT Datalink.Active OR NOT CanGridAcceptKey(Key, Shift) Then Exit; // наша задача - не пустить в область фиксированных колонок, // то есть SelectedIndex не может быть меньше, чем FFixedCols IF ssCtrl IN Shift Then Begin IF (Key = VK_LEFT) AND (FixedCols > 0) Then Begin SelectedIndex := FixedCols; Exit; End; End Else Case Key Of VK_LEFT: IF (FixedCols > 0) AND NOT (dgRowSelect in Options) Then IF SelectedIndex 0) AND (ColCount <> IndicatorOffset + 1) AND NOT (dgRowSelect IN Options) Then Begin SelectedIndex := FixedCols; Exit; End; End; OnKeyDown := Nil; Try Inherited KeyDown(Key, Shift); Finally OnKeyDown := KeyDownEvent; End; end; //************************************************************************************************** procedure TexDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Var Cell : TGridCoord; begin Cell:=MouseCoord(X,Y); //При скроллировании данных фиксированные колонки должны оставаться на месте IF (Cell.X >= 0) AND (Cell.X < FixedCols + IndicatorOffset) AND Datalink.Active Then Begin IF (dgIndicator IN Options) Then Inherited MouseDown(Button, Shift, 1, Y) Else IF (Cell.Y >= 1) AND (Cell.Y - Row <> 0) Then Datalink.Dataset.MoveBy(Cell.Y - Row); End Else inherited MouseDown(Button, Shift, X, Y); end; //************************************************************************************************** |
Вот, собственно и все, что мы хотели рассказать.
Елена Филиппова и Игорь Шевченко
Специально для
Скачать проект: (25К)