Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Как зафиксировать один или несколько столбцов в TDBGrid 2

Автор: Nomadic

Звонит программер своей девушке в дверь, а она не открывает.
- Неустранимая ошибка по адресу Lenin st. 10/5/44 второй этаж, - подумал программер.

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

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay