![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TDrawGrid [D3, D7]
Бу © (2005-07-06 06:11:00)Можно ли сделать так чтобы TDrawGrid автоматически изменял ширину колонок
AbrosimovA (2005-07-06 11:16:00) [1]
> -=XP=- © (06.07.05 11:07) [4]
А не будете столь любезны рассказать о
> заранее подготовленные пути выполнения
-=XP=- (2005-07-06 11:07:00) [2]в OnDrawCell ... одновременно меняем ширину колонки
Вопрос: Интересно, что происходит после изменения ширины колонки?
Ответ (превращающий предыдущий вопрос в риторический): А происходит, среди прочего, Grid.Invaidate, в результате чего производится перерисовка, вызывающая OnDrawCell. И так - несколько раз. Правда, за счет того, что сообщения WM_PAINT в очереди "сливаются" в одно, это не так заметно. Но, на самом деле, это - действительно, не самый оптимальный вариант.
Резюме: Выполнять действия надо там, где это предусмотрено разработчиком компонента. Тем более, что Borland это предусмотрел. Партизанщина - это иногда полезно, но зачем она нужна, если есть заранее подготовленные пути выполнения тех или иных действий?
AbrosimovA (2005-07-06 10:57:00) [3]А я это делал в OnDrawCell методом, похожим на алгоритм сортировки, т.е. в процессе прорисовки строк грида определяется длина выводимого текста Grid.Canvas.TextWidth(). Если длина текста больше какого-то начального значения, то начальное значение меняем на наибольшее, одновременно меняем ширину колонки. В конце получаем наибольшее значение ширины. Возможно не самый оптимальный вариант, но работает.
-=XP=- (2005-07-06 07:10:00) [4]Автоматическую корректировку ширины любой колонки следовало бы делать в момент изменения размеров самого контрола TDrawGrid, а так же при изменении размеров прочих колонок (или запретить его Cледует перекрывать Protected методы, в зависимости от того, что конкретно Вы хотите сделать:
procedure TCustomGrid.SizeChanged(OldColCount, OldRowCount: Longint); dynamic;
procedure TCustomGrid.ColWidthsChanged; dynamic;
procedure TCustomGrid.DeleteColumn(ACol: Longint); virtual;
procedure TCustomGrid. AdjustSize(Index, Amount: Longint; Rows: Boolean); reintroduce; dynamic;
Про AdjustSize советую прочитать подробнее - ее поведение не только reintroduced, но и redefined.
ЮЮ (2005-07-06 06:34:00) [5]Элементарно. Т.к. вывод информации выводится в обработчике OnDrawCell, то в нём же и рассчитать, хватает ли ARect для правильного вывода информации и, если нет, увеличить ColWidths[ACol].
Если пользователь не меняет ширину колонок, то рассчёт и установку нужной ширины можно сделать единожды, после иницииализации объектов, рисуемых в гриде