Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как зафиксировать один или несколько столбцов в TDBGrid 2

Delphi , Компоненты и Классы , TDBGrid

Как зафиксировать один или несколько столбцов в 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, который расширяет компонент TCustomDBGrid для возможности замораживания одного или более столбцов. Компонент TDbGridEx имеет несколько методов и свойств для управления замороженными столбцами.

Вот краткое описание кода:

  • В деструкторе освобождается список _HideColumnsValues и _HideColumns.
  • В конструкторе инициализируется список _HideColumnsValues и _HideColumns, а также устанавливается свойство FFreezeCols.
  • Метод обработки события KeyDown используется для навигации между столбцами. При нажатии клавиши влево или вправо вызывается метод ColBeforeEnter с дельтой -1 или 1 соответственно.
  • Методы SetFreezeColor и SetFreezeCols используются для установки цвета и количества замороженных столбцов.
  • Метод обработки события ColEnter вызывается, когда пользователь вводит столбец. Он вызывает метод ColBeforeEnter с дельтой 0.
  • Метод ColBeforeEnter перебирает все столбцы, проверяет ширину (если она равна нулю, то столбец заморожен), и adjusts ширину соответственно.

Чтобы зафиксировать один или более столбцов в TDBGrid, можно использовать этот код, создав экземпляр TDbGridEx и установив свойство FreezeCols в соответствующее значение. Например:

var
  Grid: TDbGridEx;
begin
  Grid := TDbGridEx.Create(nil);
  try
    // Установите свойства grid...
    Grid.FreezeCols := 2; // Заморозить столбцы 0 и 1
    // ...
  finally
    FreeAndNil(Grid);
  end;
end;

Этот код заморозит первый два столбца в grid.

Обратите внимание, что это реализация предполагает, что замороженные столбцы смежны друг с другом. Если вам нужно зафиксировать не смежные столбцы, вам придется изменить метод ColBeforeEnter соответствующим образом.

В статье описывается способ фиксации одного или нескольких столбцов в TDBGrid 2, используяinheritance от TCustomDBGrid и добавление новых методов и переменных.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TDBGrid ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-11-30 11:42:55
2024-12-10 23:41:57/0.0036909580230713/0