Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как изменить число фиксированных колонок в TDBGrid?

01.01.2007
procedure TForm1.Button1Click(Sender: TObject);
begin
 
TStringGrid(DbGrid1).FixedCols := 2;
end;

Взято из https://forum.sources.ru


Это маленькая вставка в Ваш наследник от 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;

Взято с https://delphiworld.narod.ru