DBAdvGrid RowHeights — изменить все строки, кроме 1

Я использую следующий код в CustomCellDraw событии DBAdvGrid(TMS) для увеличения высоты строки.

procedure TForm1.DBAdvGrid1CustomCellDraw(Sender: TObject; Canvas: TCanvas;
  ACol, ARow: Integer; AState: TGridDrawState; ARect: TRect; Printing: Boolean);
begin
DBAdvGrid1.RowHeights[ARow]:=120;
end;

Как избежать увеличения строки 0, которая является первой строкой в ​​сетке, содержащей имена/заголовки столбцов? - Я бы хотел, чтобы эта строка осталась нетронутой, а все остальные должны быть изменены с помощью приведенного выше кода. В основном он должен игнорировать индекс строки 0 и начинать с индекса строки 1.


person t1f    schedule 11.09.2017    source источник
comment
if ARow > 0 then DBAdvGrid1.RowHeights[ARow] := 120;? Но изменение высоты строки от рисования пахнет событием. Разве этот элемент управления не имеет своего рода событие OnMeasureRowHeight?   -  person Victoria    schedule 11.09.2017
comment
@Victoria Спасибо, это работает. Кажется, я не могу найти ничего, связанного с измерением строк в списке событий, самое близкое, что я мог придумать, это: OnRowSize, OnRowSizing, OnEndRowSize . Использование кода в любом из них не работает. Не могли бы объяснить, почему это проблема с использованием события рисования? А пока почитаю, есть ли более подходящее событие для этого   -  person t1f    schedule 11.09.2017
comment
Никогда не работал с этой сеткой, но похоже, что они срабатывают, когда пользователь изменяет размер или собирается изменить размер строки. Я хочу сказать, что выбранное вами событие рисования будет запускаться гораздо чаще, чем необходимо (не говоря уже о том, что произойдет, когда пользователь попытается изменить размер строки, потому что это, в свою очередь, вызовет это событие рисования). Если нет события, посвященного измерению высоты строки, я бы рассмотрел возможность установки высоты сразу после заполнения сетки. Но я не могу быть более конкретным.   -  person Victoria    schedule 11.09.2017
comment
@Victoria Понятно, спасибо! Я посмотрю документацию, может быть, я могу найти что-то связанное с этим. Также спасибо за предложение по заполнению сетки!   -  person t1f    schedule 11.09.2017
comment
Пожалуйста! Я только что установил пробную версию и нашел свойства, которые могут вас заинтересовать, DefaultRowHeight и FixedRowHeight. Один для установки высоты строк, другой для высоты заголовка (так что в конце концов вам может не понадобиться код). Установите их в том порядке, в котором я написал их здесь, и вы должны получить тот же результат. Событие для установки размера строки (или фактически ячейки) - OnCustomCellSize, но я понятия не имею, как оно запускается.   -  person Victoria    schedule 11.09.2017
comment
@Victoria Христос, я даже не заметил этих свойств oO - действительно, он работает, устанавливая их, код не требуется. Спасибо, что нашли время и посмотрели! Сделайте это ответом, если хотите, и я соглашусь.   -  person t1f    schedule 11.09.2017


Ответы (1)


Это было бы так:

procedure TForm1.DBAdvGrid1CustomCellDraw(Sender: TObject; Canvas: TCanvas; 
  ACol, ARow: Integer; AState: TGridDrawState; ARect: TRect; Printing: Boolean);
begin
  if ARow > 0 then
    DBAdvGrid1.RowHeights[ARow] := 120;
end;

Но не изменяйте высоту строки из события рисования. Такое событие запускается часто и используется исключительно для отрисовки содержимого, а не для настройки размера содержимого. Что еще хуже, если вы, например. разрешенный размер строки, и пользователь попытается настроить высоту строки, это, в свою очередь, вызовет событие, в котором вы вернете высоту обратно, поэтому вы будете сражаться с пользователем.

Как показано в в этом примере, размер контента следует определять заранее. в событии OnCustomCellSize.

Но для вашей цели, я думаю, достаточно установить свойства DefaultRowHeight и FixedRowHeight без дополнительного кода.

person Victoria    schedule 11.09.2017