如何解决我无法在我自己的 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,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
的调用会重置 Canvas 的格式。
如果我无法在 DrawColumnCell 中挂钩我的格式化事件,我可以在哪里这样做?。
谢谢。
解决方法
我认为您的 DrawColumnCell 只是缺少对 DefaultDrawDataCell 的调用以获取网格以实际绘制单元格。 F.i.in my answer 到你的另一个 q,
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) .
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。