"EhLib.Com"
https://forum.ehlib.com/ru/

Максимальная высота строки с dghAutoFitRowHeight ? (*)
https://forum.ehlib.com/ru/viewtopic.php?f=4&t=2743
Страница 1 из 1

Автор:  Stalker4 [ 22 фев 2019, 13:03 ]
Заголовок сообщения:  Максимальная высота строки с dghAutoFitRowHeight ? (*)

Hi All,

Delphi 10.2.3, EhLib 9.1.043.

Есть DBGridEh подключенный к MemTableEh. У грида в OptionsEh включена настройка dghAutoFitRowHeight.
Все бы хорошо, но некоторые строки грида очень уж высокие получаются (много строк текста там отображается из поля).

Вопрос: Как можно ограничить максимальную высоту строки грида при использовании опции dghAutoFitRowHeight ?

Автор:  EhLibSupport [ 23 фев 2019, 12:57 ]
Заголовок сообщения:  Re: Максимальная высота строки с dghAutoFitRowHeight ?

Добрый день.

Используйте событие TDBGridEh.OnGetRowHeight

Код:
procedure TForm1.DBGridEh1GetRowHeight(Sender: TObject; var RowHeight: Integer);
begin
  if (RowHeight > 100) then
    RowHeight := 100;
end;

Автор:  Stalker4 [ 25 фев 2019, 07:24 ]
Заголовок сообщения:  Re: Максимальная высота строки с dghAutoFitRowHeight ?

В принципе помогло, спасибо.

Но тут есть два момента:

1) Тут ограничение высоты задается в пикселях, а не в строках. А соответственно при разных шрифтах и маштабировании в винде, могут отображаться не полные (урезанные) строки.
2) Если текста много и он был по высоте урезан, то пользователь про это не узнает пока не подведет курсор мыши к этому тексту или не откроет эту запись на просмотр. Соответственно было бы неплохо в последней строке ячейки задействовать механизм EndEllipsis.

Возможные решения:

1) Или доработать OnGetRowHeight (добавим ему параметр MaxLine) или новый обработчик OnGetRowHeightEx где будут оба параметра.
2) При показе данных колонки, если реальная высота текста больше отображаемой, то учитывать значение настройки TDBGridColumnEh.EndEllipsis
при выводе последней видимой строки ячейки (то есть так, как это сейчас работает для очень широкой строки).

Автор:  EhLibSupport [ 01 апр 2019, 18:21 ]
Заголовок сообщения:  Re: Максимальная высота строки с dghAutoFitRowHeight ?

Добрый день.

Код:
1) Тут ограничение высоты задается в пикселях, а не в строках. А соответственно при разных шрифтах и маштабировании в винде, могут отображаться не полные (урезанные) строки.


Обработчик события можно модифицировать следующим образом

Код:
procedure TForm1.DBGridEh1GetRowHeight(Sender: TObject; var RowHeight: Integer);
var
  FontHeight: Integer;
begin
  FontHeight := GetFontTextHeight(nil, DBGridEh1.Columns[5].Font);
  if (RowHeight > FontHeight * 10 + 4) then
    RowHeight := FontHeight * 10 + 4;
end;



Цитата:
2) Если текста много и он был по высоте урезан, то пользователь про это не узнает пока не подведет курсор мыши к этому тексту или не откроет эту запись на просмотр.


Стандартная реализация TDBGridColumnEh.EndEllipsis использует Win32 функцию для отрисовки текст с многоточием. Она работает быстро, но не всегда корректно.

Одно из решений, рисовать многоточие самому в событии OnAdvDrawDataCell

Код:
procedure TForm1.DBGridEh1Columns5AdvDrawDataCell(Sender: TCustomDBGridEh; Cell,
  AreaCell: TGridCoord; Column: TColumnEh; const ARect: TRect;
  var Params: TColCellParamsEh; var Processed: Boolean);
var
  TextHeight: Integer;
  s: String;
  r: TRect;
begin
  DBGridEh1.DefaultDrawColumnDataCell(Cell, AreaCell, Column, ARect, Params);
  Processed := True;

  s := Params.Text;
  r := ARect;
  DBGridEh1.Canvas.TextRect(r, s, [tfCalcRect, tfWordBreak]);
  TextHeight := RectHeight(r);

  if (TextHeight > RectHeight(ARect)) then
  begin

    WriteTextEh(DBGridEh1.Canvas, ARect, False, 2, 2, '...', taRightJustify,
     tlBottom, False, False, 0, 0, False, False);
  end;
end;

Автор:  Stalker4 [ 12 апр 2019, 11:42 ]
Заголовок сообщения:  Re: Максимальная высота строки с dghAutoFitRowHeight ?

EhLibSupport писал(а):
Добрый день.
Код:
1) Тут ограничение высоты задается в пикселях, а не в строках. А соответственно при разных шрифтах и маштабировании в винде, могут отображаться не полные (урезанные) строки.

Обработчик события можно модифицировать следующим образом
Код:
procedure TForm1.DBGridEh1GetRowHeight(Sender: TObject; var RowHeight: Integer);
var
  FontHeight: Integer;
begin
  FontHeight := GetFontTextHeight(nil, DBGridEh1.Columns[5].Font);
  if (RowHeight > FontHeight * 10 + 4) then
    RowHeight := FontHeight * 10 + 4;
end;


А откуда взята функция GetFontTextHeight ? Что то я такой ни в самом EhLib 9.1.x ни в Delphi 10.2.3 не нашел.

Автор:  aush [ 12 апр 2019, 11:48 ]
Заголовок сообщения:  Re: Максимальная высота строки с dghAutoFitRowHeight ?

Stalker4 писал(а):
А откуда взята функция GetFontTextHeight ? Что то я такой ни в самом EhLib 9.1.x ни в Delphi 10.2.3 не нашел.

Поиском находится в EhLibVCL.pas

Автор:  EhLibSupport [ 17 апр 2019, 16:50 ]
Заголовок сообщения:  Re: Максимальная высота строки с dghAutoFitRowHeight ?

Цитата:
А откуда взята функция GetFontTextHeight ? Что то я такой ни в самом EhLib 9.1.x ни в Delphi 10.2.3 не нашел.

Можно использовать стандарную Canvas.TextHeight.

Код:
  //FontHeight := GetFontTextHeight(nil, DBGridEh1.Columns[5].Font);
  DBGridEh1.Canvas.Font := DBGridEh1.Columns[5].Font;
  FontHeight := DBGridEh1.Canvas.TextHeight('Wg');

Автор:  Stalker4 [ 24 апр 2019, 07:00 ]
Заголовок сообщения:  Re: Максимальная высота строки с dghAutoFitRowHeight ?

aush писал(а):
Stalker4 писал(а):
А откуда взята функция GetFontTextHeight ? Что то я такой ни в самом EhLib 9.1.x ни в Delphi 10.2.3 не нашел.

Поиском находится в EhLibVCL.pas

В EhLib 9.1.x функции GetFontTextHeight в модуле EhLibVCL.pas.

EhLibSupport писал(а):
Цитата:
А откуда взята функция GetFontTextHeight ? Что то я такой ни в самом EhLib 9.1.x ни в Delphi 10.2.3 не нашел.

Можно использовать стандарную Canvas.TextHeight.

Код:
  //FontHeight := GetFontTextHeight(nil, DBGridEh1.Columns[5].Font);
  DBGridEh1.Canvas.Font := DBGridEh1.Columns[5].Font;
  FontHeight := DBGridEh1.Canvas.TextHeight('Wg');

Так работает, только строка "DBGridEh1.Canvas.Font := DBGridEh1.Columns[5].Font" тут ИМНО лишняя.

Вопрос решен.

Страница 1 из 1 Часовой пояс: UTC
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/