Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 20 апр 2019, 13:04

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 22 фев 2019, 13:03 
Не в сети

Зарегистрирован: 24 дек 2011, 14:04
Сообщений: 224
Откуда: Украина, г. Днепропетровск
Hi All,

Delphi 10.2.3, EhLib 9.1.043.

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 23 фев 2019, 12:57 
В сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 882
Добрый день.

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

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

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 25 фев 2019, 07:24 
Не в сети

Зарегистрирован: 24 дек 2011, 14:04
Сообщений: 224
Откуда: Украина, г. Днепропетровск
В принципе помогло, спасибо.

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

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

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 01 апр 2019, 18:21 
В сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 882
Добрый день.

Код:
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;

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 апр 2019, 11:42 
Не в сети

Зарегистрирован: 24 дек 2011, 14:04
Сообщений: 224
Откуда: Украина, г. Днепропетровск
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 не нашел.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 апр 2019, 11:48 
Не в сети

Зарегистрирован: 14 окт 2014, 11:19
Сообщений: 30
Stalker4 писал(а):
А откуда взята функция GetFontTextHeight ? Что то я такой ни в самом EhLib 9.1.x ни в Delphi 10.2.3 не нашел.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 апр 2019, 16:50 
В сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 882
Цитата:
А откуда взята функция 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');

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB