FAQ VCL
Компоненты\EhLib\DBGridEh

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как объединить несколько ячеек?

// Способ первый
// Отключение отрисовки не сработает, т.к. в DBGridEh.pas
// FonDrawFooterCell вызывается уже после прорисовки ячейки
// методом по умолчанию, но можно отрисовать ячейку 1 после
// отрисовки ячейки 2. Представленный подход имеем проблему
// с выделением строк и отрисованных ячейках
procedure TForm1.DBGridEh1DrawFooterCell(Sender: TObject;
  DataCol, Row: Integer; Column: TColumnEh; Rect: TRect; State: TGridDrawState);
begin
  if Row = 1 then // нумерация с 0
  begin
    DBGridEh1.Canvas.Brush.Color := clSilver;
    if Column.Index = 1 then
    begin
      Rect.Left := Rect.Left - DBGridEh1.Columns[0].Width;
      DBGridEh1.Canvas.FillRect(Rect);
      DBGridEh1.Canvas.TextOut(Rect.Left, Rect.Top + 2, DBGridEh1.GetFooterValue(Row,
        DBGridEh1.Columns[0]));
    end
    else
      DBGridEh1.DefaultDrawFooterCell(Rect, DataCol, Row, Column, State);
  end
  else
  begin
    Column.Footer.ValueType := fvtSum;
    inherited;
  end;
end;

// Способ второй
procedure Tfrm_psk_LST.grd_MainDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumnEh;
  State: TGridDrawState);

  function isCombineLine: Boolean;
  begin
    with (Sender as TDBGridEhAuto) do
      Result := (Columns[1].DisplayText <> '') and
                (Columns[2].DisplayText = '') and
                (Columns[3].DisplayText = '');
  end;

const
  {$J+}
  isSelect: Boolean = False;
  {$J+}
var
  r: TRect;
begin
  if DataCol = 0 then
    isSelect := False;

  if DataCol in [1..3] then // нумерация с 0
  begin
    if (gdSelected in State) or isSelect then
    begin
      if ActiveControl = Sender then
        DBGridEh1.Canvas.Brush.Color := RGB(215, 240, 255)
      else
        DBGridEh1.Canvas.Brush.Color := RGB(218, 218, 218);

      if not isSelect then
        isSelect := True;
    end
    else
      DBGridEh1.Canvas.Brush.Color := (Sender as TDBGridEhAuto).EvenRowColor;

    if isCombineLine then
    begin
      r := Rect;
      case Column.Index of
        // Здесь 2 - количество объединяемых ячеек минус 1
        1: r.Right := r.Right + DBGridEh1.Columns[1].Width + DBGridEh1.Columns[2].Width + 2;
        2: begin
          r.Left := r.Left - DBGridEh1.Columns[1].Width - 1;
          r.Right := r.Right + DBGridEh1.Columns[2].Width + 1;
        end;
        3: r.Left := r.Left - DBGridEh1.Columns[1].Width - DBGridEh1.Columns[2].Width - 2;
      end;
      DBGridEh1.Canvas.FillRect(r);
      DBGridEh1.Canvas.Font.Style := [fsBold];
      r.Left := r.Left + 2;
      DrawTextEh(DBGridEh1.Canvas.Handle, DBGridEh1.Columns[1].DisplayText,
        Length(DBGridEh1.Columns[1].DisplayText), r, DT_END_ELLIPSIS);
    end;
  end;
end;


Как запретить перемещение колонок?

// Способ первый
procedure TForm1.Button1Click(Sender: TObject);
begin
  DBGridEh1.OptionsEh := DBGridEh1.OptionsEh - [dghColumnMove];
end;

// Способ второй
procedure TForm1.DBGridEh1ColumnMoved(Sender: TObject; FromIndex,
  ToIndex: Integer);
begin
  DBGridEh1.Columns[ToIndex].Index := FromIndex;
end;


Как выделить все строки в DBGridEh?

procedure TForm1.Button1Click(Sender: TObject);
begin
  DBGridEh1.SelectedRows.SelectAll;
end;


Как показать номер записи?

procedure TForm1.Button1Click(Sender: TObject);
begin
  DBGridEh1.OptionsEh := DBGridEh1.OptionsEh + [dghShowRecNo];
end;


Как запретить изменение ширины колонок?

procedure TForm1.Button1Click(Sender: TObject);
begin
  DBGridEh1.OptionsEh := DBGridEh1.OptionsEh - [dghColumnResize];
end;


Как отобразить диалог поиска (по Ctrl + F)?

procedure TForm1.Button1Click(Sender: TObject);
begin
  DBGridEh1.OptionsEh := DBGridEh1.OptionsEh + [dghDialogFind];
end;


Как узнать, находится ли DBGridEh в режиме рндактирования?

procedure TForm1.Button1Click(Sender: TObject);
begin
  if DBGridEh1.DataSource.DataSet.State in [TDataSetState.dsEdit, TDataSetState.dsInsert] then
    ShowMessage('Редактируется')
  else
    ShowMessage('Не редактируется');
end;


Какое поле выделено в DBGridEh?

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(DBGridEh1.Columns[DBGridEh1.SelectedIndex].FieldName);
end;


Как в DBGridEh настроить локальную сортировку?

// Локальная сортировка в DBGridEh поддерживается не всеми типами DataSet. Для работы
// с компонентами ADOQuery и ADODataSet необходимо подключить библиотеку EhLibADO.
// Для сотрировки MemTable, цепочка подключения которой выглядит следующим образом:
// TDBGridEh -> TDataSource -> TMemTableEh -> TDataSetDriverEh -> TClientDataSet -> TFDConnection
// необходимо подключить библиотеку EhLibMTE. Если используются другие типы, такие как
// TIBQuery или TIBDataSet, подключение локальной сортировки может не работать.

implementation

uses
  EhLibADO; // Модуль EhLib... зависит от типа подключения

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  // Включаем сортировку в заголовках всех колонок
  for i := 0 to DBGridEh1.Columns.Count - 1 do
    DBGridEh1.Columns[i].Title.TitleButton := True;

  // Включаем локальную сортировку и множественную сортировку
  DBGridEh1.OptionsEh := DBGridEh1.OptionsEh + [dghAutoSortMarking, dghMultiSortMarking];
  DBGridEh1.SortLocal := True;
end;

При использовании материала - ссылка на сайт обязательна