DbGridEh - высота строк подгоняется автоматически

andrey_andrey

Помогите, пожалуйтса !!!Заполняю DBGridEh данными. При заполнении из БД высота строк подгоняется автоматическив зависимости от размера текста. Ниже приведен код. (БОЛЬШОЕ СПАСИБО ЗА КОД И ЗА ИДЕЮ - Mr.DKSoft !!!).
<b>type</b>
 TCrackCustomGridEh=<b>class</b>(TDBGridEh);

<b>procedure</b> TForm_delo_history.DBGridEh_propDrawColumnCell(Sender: TObject;
 <b>const</b> Rect: TRect; DataCol: Integer; Column: TColumnEh;
 State: TGridDrawState);
<b>var</b>
 ARect : TRect;
 AText : <b>string</b>;
 RowNumber, NewHeight : integer;
 wTxt : integer;
 wRect: integer;
 nLine: integer;
<b>begin</b>
 AText :=Column.Field.AsString;
 wTxt :=DBGridEh_prop.Canvas.TextWidth(AText);
 wRect:=(Rect.Right-Rect.Left)-<b>2</b>;
 nLine:=Trunc(wTxt/wRect)+<b>1</b>;

 <b>if</b> nLine > <b>1</b> <b>then</b>
 <b>begin</b>
 RowNumber:=DBGridEh_prop.DataSource.DataSet.RecNo;
 NewHeight:= nLine*TCrackCustomGridEh(Sender).DefaultRowHeight + <b>7</b>;
 <b>if</b> NewHeight > TCrackCustomGridEh(Sender).RowHeights[RowNumber] <b>then</b>
 <b>begin</b>
 TCrackCustomGridEh(Sender).RowHeights[RowNumber] := NewHeight;
 <b>end</b>;

 ARect:=Rect;
 ARect.Bottom:=ARect.Top+TCrackCustomGridEh(Sender).RowHeights[RowNumber];

 WriteTextEH(DBGridEh_prop.Canvas, <i>// Canvas</i>
 ARect , <i>// Draw rect and ClippingRect</i>
 True , <i>// Fill rect Canvas.Brash.Color</i>
 <b>1</b>, <b>1</b>, <i>// dX,dY InflateRect(Rect, -DX, -DY) for text</i>
 AText,
 taLeftJustify,<i>// Text alignment</i>
 tlTop , <i>// Text layout</i>
 True , <i>// Word break</i>
 False , <i>// Truncate long text by ellipsis</i>
 <b>0</b>, <i>// Left margin</i>
 <b>0</b>, <i>// Right margin</i>
 False);
 <b>end</b>;
Все бы было хорошо, если бы не одно НО !!! Если в DBGridEh отображается строчек например 70, то нижние строчки не видимы (не доступны). Хотя SCROLL ПРОКРУЧЕН ДО САМОГО НИЗА. На приложенном рисунке это хорошо видно.В последней строке в поле - "Новое значение" текста столько же сколько сколько в предпоследней. А на экране видно меньше половины.Как сделать чтобы все было видно !!!!!ПОМОГИТЕ, ПОЖАЛУЙСТА !!!
5 ответов

andrey_andrey

"Возможности, не поддерживаемые текущей версией TDBGridEh .Данная версия TDBGridEh не поддерживает следующие возможности: TDBGridEh не может иметь индивидуальную высоту строк для каждой строки данных..."(Ehlib - Руководство разработчика.doc)Ну да, ты с особым цинизмом изнасиловал грид. Но те его процедуры, что считают высоту прокручиваемой части, очевидно, просто умножают число отображаемых строк на заданную для всего грида высоту. И плевать хотели на твою малохудожественную самодеятельность.


andrey_andrey

Что никто не поможет ????


andrey_andrey

Ну, про "процедуры, что считают высоту прокручиваемой части" я прогнал - там на самом деле не так - для выяснения числа отображаемых строк TCustomDBGridEh.UpdateRowCount делит ClientHeight (за вычетом высоты непрокручиваемых частей) на DefaultRowHeight.Но результат одинаков - грид таки считает, что оставшиеся до конца таблицы записи _должны_ поместиться на экране - и нефиг дальше что-то куда-то мотать.И снаружи это не лечится. Жалуйся Большакову. Или в Лигу сексуальных реформ - все больше толку.


andrey_andrey

TDBGridEh не может иметь индивидуальную высоту строк для каждой строки данных..."(Ehlib - Руководство разработчика.doc)
Начиная с версии 4.4 вроде как может, с некоторыми ограничениями.


andrey_andrey

Вот что грит
Версия 4.4 + В тип TDBGridEhOption (OptionsEh) добавлено значение dghAutoFitRowHeight. В этом режиме грид подсчитывает высоту строк динамически на основе строковых данных в столбцах, у которых TColumnEh.WordWrap = True. Режим работает только когда грид подключен к TMemTableEh и MemTable не в режиме TreeView. Грид обновляет высоту строк не при всех изменениях свойств грида. Например грид не обновляет высоту строк если поменять свойство Grid.Font. По этому в программах, вызывайте Grid.UpdateAllDataRowHeights там, где это нужно.