FAQ VCL
DBGridEh (Ehlib)

:: Меню ::
:: На главную ::
:: 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;

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