我正在尝试为TDBGridEh
编写自定义绘制单元格方法。问题是当我更改笔,刷子的属性时,...绘画变得混乱。这是因为控件在调用事件处理程序后会对其自身进行一些额外的绘制。因此,我必须保留所有道具,然后在我完成自己的绘画后重置它们。
我试图创建自己的TControlCanvas
并为其分配网格的AssignTo
,但是却收到一条带有消息的运行时异常:
无法将TControlCanvas分配给TControlCanvas
,表示TControlCanvas
方法没有为TControlCanvas
或其祖先实现。所以我的问题是:
为什么AssignTo
没有TPen
方法?问题是什么?
如何保留和还原TControlCanvas的所有属性?我的意思是比创建TBrush
,TFont
,等更方便。
最佳答案
不确定这是否符合您的期望,但是有TPenRecall
,TBrushRecall
和TFontRecall
以半自动的方式保存和恢复这三个属性的设置。
处理非常简单:使用相应的属性作为参数创建这些类的实例,并使用Pen,Brush和Font进行所需的操作。最后释放这些实例,这将恢复设置。
结合TObjectList
和一些内部参考,可以将保存和恢复这些画布属性所需的工作减少到一个衬里。
type
TCanvasSaver = class(TInterfacedObject)
private
FStorage: TObjectList<TRecall>;
public
constructor Create(ACanvas: TCanvas);
destructor Destroy; override;
class function SaveCanvas(ACanvas: TCanvas): IInterface;
end;
constructor TCanvasSaver.Create(ACanvas: TCanvas);
begin
inherited Create;
FStorage := TObjectList<TRecall>.Create(True);
FStorage.Add(TFontRecall.Create(ACanvas.Font));
FStorage.Add(TBrushRecall.Create(ACanvas.Brush));
FStorage.Add(TPenRecall.Create(ACanvas.Pen));
end;
destructor TCanvasSaver.Destroy;
begin
FStorage.Free;
inherited;
end;
class function TCanvasSaver.SaveCanvas(ACanvas: TCanvas): IInterface;
begin
Result := Self.Create(ACanvas);
end;
用法:
procedure TForm274.DoYourDrawing(ACanvas: TCanvas);
begin
TCanvasSaver.SaveCanvas(ACanvas);
{ Change Pen, Brush and Font of ACanvas and do whatever you need to do.
Make sure that ACanvas is still valid and the same instance as at the entry of this method. }
end;