2

当用户选择我的网格的标题时,我想加粗网格的列标题。
我使用以下代码来实现这一点:

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;

当用户重新定义 Column 的宽度时,还有另一个问题,在这种情况下,它RowHeight[0]也会返回到原始值。我想解决这个问题的唯一方法是继承 DBGrid 和 override ColWidthsChanged,但是我还要重写多少方法?

为什么会发生这种情况?
这是一个错误,还是我的代码有问题?
有没有办法解决这个问题?

在一个简单的问题中。

如何修复DBGrid 标题高度的值?

4

1 回答 1

0

似乎如果我覆盖该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;
于 2014-02-12T13:05:33.480 回答