繁体   English   中英

我无法在我自己的 TDBGrid 派生上设置文本格式

[英]I can't set the text formatting on my own derivative of a TDBGrid

我正在创建 TDBGrid 的衍生物,我想实现一种更好的方式来定义其文本格式,类似于 QuantumGrid 的 GetContentStyle。

问题是 DBGrid 忽略了我的新事件在其画布上设置的字体和颜色。

type TSetCellStyle = procedure(const Sender: TObject; const AColumn: TColumn; const ARow: TDataset; const AField: TField; const State: TGridDrawState; var TextFont: TFont; var BackgroundColor: TColor) of object;

TMyDBGrid = class(TDBGrid)
  private
    FSetCellStyle: TSetCellStyle;
  protected
    procedure DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); override;
  published
    property OnSetCellstyle: TSetCellStyle read FSetCellStyle write FSetCellStyle;
  ...
  ...

implementation
  procedure TMyDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); 
  begin
    BeginUpdate;
    Canvas.Lock; // Prevents other threads from drawing on the canvas.

    if Assigned(FSetCellStyle) then begin
      var TextFont: TFont;
      var BackgroundColor: TColor;
      TextFont := Canvas.Font;
      BackgroundColor := Canvas.Brush.Color;
      FSetCellStyle(Self, Column, Self.DataSource.DataSet, Self.DataSource.DataSet.FindField(Column.FieldName), State, TextFont, BackgroundColor);
      Canvas.Font := TextFont;
      Canvas.Brush.Color := BackgroundColor;
    end;

    Canvas.Unlock;
    inherited DrawColumnCell(Rect, DataCol, Column, State);
    EndUpdate;     
  end;

这是应用程序如何使用新事件自定义网格格式的示例:

procedure TFInspira.GridInspiraSetCellStyle(const Sender: TObject; const AColumn: TColumn; const ARow: TDataSet; const AField: TField; const State: TGridDrawState; var TextFont: TFont; var BackgroundColor: TColor);
begin
  if (AColumn.FieldName = 'ReferenciaGrup') and (ARow.FieldByName('PrimerDeGrup').AsBoolean) then begin
    BackgroundColor := clYellow;
  end;
  if ARow.FieldByName('Selected').AsBoolean then begin
    TextFont.Style := TextFont.Style + [fsItalic];
  end;
end;

我可以调试我的网格并看到覆盖的 DrawColumnCell 将某些单元格的画布设置为黄色和斜体,但网格从不显示它们。 看起来inherit DrawColumnCell的调用重置了画布的格式。

如果我无法在 DrawColumnCell 中挂钩我的格式化事件,我可以在哪里这样做?

谢谢你。

我认为您的 DrawColumnCell 只是缺少对 DefaultDrawDataCell 的调用来让网格实际绘制单元格。 完成对你其他问题的回答

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  AGrid : TDBGrid;
begin
  AGrid := (Sender as TDBGrid);

  if Odd(AGrid.RowBeingDrawn) then begin
     AGrid.Canvas.Brush.Color := clGreen;
  end;
  AGrid.DefaultDrawDataCell(Rect, Column.Field, State);

end;

显然,这会将交替行的单元格涂成绿色。

我已经使用了我的其他答案的中介层类,这样我就可以参考添加的 RowBeingDrawn 属性,但与上述类似的代码将与标准 TDBGrid 一起工作(假设其 DefaultDrawing 属性设置为 True)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM