Как **FIX** значение к высоте заголовка DBGrid?

Когда пользователь выбирает заголовок моей сетки, я бы хотел выделить заголовок столбца сетки.
Я использую следующий код для достижения этой цели:

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var I: Integer;
begin
  //Prevent multiple clicks!  
  if fsBold in Column.Title.Font.Style then
    Exit;

  for I:= 0 to Column.Collection.Count-1 do
    (Column.Collection.Items[I] as TColumn)
            .Title.Font.Style := [];
  Column.Title.Font.Style := [fsBold];
end;

Этот код работает нормально.

в OnFormCreate Я определил следующую высоту заголовка:

type
  DBGridHack = class(TDBGrid);

procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGridHack(DBGrid1).RowHeights[0] := 45;
end;

Когда я нажимаю в заголовке, процедура InternalLayout.MeasureTitleHeights изменяет размер обратно на оригинал. Таким образом, каждый раз, когда я меняю стиль шрифта, мне нужно переопределить значение для RowHeight[0],

Код будет выглядеть так:

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var I: Integer;
begin
  //Prevent multiple clicks!  
  if fsBold in Column.Title.Font.Style then
    Exit;

  for I:= 0 to Column.Collection.Count-1 do
    (Column.Collection.Items[I] as TColumn)
            .Title.Font.Style := [];
  Column.Title.Font.Style := [fsBold];

  //Every time!!
  DBGridHack(DBGrid1).RowHeights[0] := 45;
end;

Существует другая проблема, когда пользователь переопределяет ширину столбца, в этом случае RowHeight[0] также возвращается к исходному значению. Единственный способ решить эту проблему - наследовать DBGrid и переопределять ColWidthsChanged, но сколько еще методов мне придется переопределить?

Почему это происходит?
Это ошибка, или мой код прослушивается?
Есть ли способ обойти это?

В простом вопросе.

Как исправить значение высоты заголовка DBGrid?

1 ответ

Решение

Кажется, если я переопределить Paint Процедура, она будет работать как положено. Я не знаю, есть ли побочные эффекты в этом решении.

Это код для пользовательского DBGrid. Пожалуйста, если это не хорошее решение, я был бы признателен, если бы вы заявили об этом.

TDBGrid1 = class(TDBGrid)
  private
    FTitleFixedHeight: Integer;
    function CheckHeaderFixed: Boolean;
  protected
    procedure Paint; override;
  public
    { Public declarations }
  published
    property TitleFixedHeight: Integer read FTitleFixedHeight write FTitleFixedHeight;
  end;

function TDBGrid1.CheckHeaderFixed: Boolean;
begin
  Result := (TitleFixedHeight <> 0) and (RowHeights[0] <> TitleFixedHeight);
end;

procedure TDBGrid1.Paint;
begin
  if CheckHeaderFixed then
  begin
    RowHeights[0] := TitleFixedHeight;
  end;    
  inherited;
end;
Другие вопросы по тегам