Акжан в сети - На уровень вверх(VCL) Как зафиксировать один или несколько столбцов в TDBGrid с возможностью навигации по этим столбцам?

Это маленькая вставка в Ваш наследник от TCustomDBGrid, которая решает данную задачу.

// DBGRIDEX.PAS
// ----------------------------------------------------------------------------
-
destructor TDbGridEx.Destroy;
begin

  _HideColumnsValues.Free;
  _HideColumns.Free;

  inherited Destroy;
end;

// ----------------------------------------------------------------------------
constructor TDbGridEx.Create(Component : TComponent);
begin
  inherited Create(Component);

  FFreezeCols   := ?;

  _HideColumnsValues := TList.Create;
  _HideColumns       := TList.Create;
end;

// ----------------------------------------------------------------------------
procedure TDbGridEx.KeyDown(var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_LEFT) then ColBeforeEnter(-1);
  if (Key = VK_RIGHT) then ColBeforeEnter(1);

  inherited;
end;

// ----------------------------------------------------------------------------
procedure TDbGridEx.SetFreezeColor(AColor : TColor);
begin
  InvalidateRow(0);
end;

// ----------------------------------------------------------------------------
procedure TDbGridEx.SetFreezeCols(AFreezeCols : Integer);
begin
  FFreezeCols := AFreezeCols;
  InvalidateRow(0);
end;

// ----------------------------------------------------------------------------
procedure TDbGridEx.ColEnter;
begin
  ColBeforeEnter(0);

  if Assigned(OnColEnter) then OnColEnter(Self);
end;

// ----------------------------------------------------------------------------
procedure TDbGridEx.ColBeforeEnter(ADelta : Integer);
var
  nIndex : Integer;

function ReadWidth : Integer;
var
  i : Integer;

begin
  i := _HideColumns.IndexOf(Columns[nIndex]);

  if i = -1
    then result := 120
    else result := Integer(_HideColumnsValues[i]);
end;

procedure SaveWidth;
var
  i : Integer;

begin
  i := _HideColumns.IndexOf(Columns[nIndex]);
  if i <> - 1 then
  begin
    _HideColumnsValues[i] := Pointer(Columns[nIndex].Width);
  end else
  begin
    _HideColumns.Add(Columns[nIndex]);
    _HideColumnsValues.Add(Pointer(Columns[nIndex].Width));
  end;
end;

begin
  for nIndex := 0 to Columns.Count - 1 do
  begin
    if (Columns[nIndex].Width = 0)  then
    begin
      if (nIndex + 1 <= FreezeCols) or (nIndex >= SelectedIndex + ADelta)
        then Columns[nIndex].Width := ReadWidth;
    end
      else
    begin
      SaveWidth;
      if (nIndex + 1 > FreezeCols) and
         (nIndex < SelectedIndex + ADelta) and
         (nIndex + 1 < Columns.Count) and
         (FreezeCols > 0)
        then Columns[nIndex].Width := 0;
    end;
  end;
end;

Ramil Galiev

(2:5085/49.11)