我在Lazarus上有一个在Linux上运行的TStringGrid。我有一个列有编辑器类型cbsButton。我希望按钮显示某个图像,而不是省略号。我有以下代码,导致错误:
procedure TForm1.streams_gridDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState);
var
aCanvas: TCanvas;
aGrid: TStringGrid;
Editor: TWinControl;
image: TImage;
begin
if (aCol <> 1) or (aRow = 0) then begin
Exit;
end;
aGrid := (Sender as TStringGrid);
aCanvas := image.Canvas;
aCanvas.FillRect(aRect);
imagelist1.Draw(aCanvas, aRect.Left+2, aRect.Top+2, 8);
Editor := (aGrid.EditorByStyle(cbsButton) as TButtonCellEditor);
Editor.Brush.Style := TBrushStyle.bsImage;
(Editor.Brush.Image as TImage) := image; // causes the error below
end;
错误是:
mainform.pas(156,23)错误:类或对象类型&#34; TFPCustomImage&#34;和 &#34;的TImage&#34;不相关
在这一点上,我确定我完全以错误的方式解决这个问题。有人可以让我回到正确的道路上吗?
答案 0 :(得分:3)
我怀疑OnDrawCell事件是修改单元格编辑器的正确位置,因为在绘制单元格时此时可能不存在正确的单元格编辑器。
定义单元格编辑器的正确事件是网格的OnSelectEditor事件。请阅读wiki(http://wiki.lazarus.freepascal.org/Grids_Reference_Page)。
您使用的cbsButton编辑器继承自TButton。 TButton没有Glyph属性 - 您无法为按钮指定位图。但是,您可以轻松编写自己的单元格编辑器,只需按照 examples / gridexamples / gridcelleditor 中的标准示例进行操作:
procedure TForm1.BitBtn1Click(Sender: TObject); begin StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] := InputBox('Input some text', 'Text:', ''); end;
procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer; var Editor: TWinControl); var R: TRect; begin if (aCol=2) and (aRow > 0) then begin R := StringGrid1.CellRect(aCol, ARow); R.Left := R.Right - (R.Bottom - R.Top); BitBtn1.BoundsRect := R; Editor := BitBtn1; end; end;
答案 1 :(得分:0)
Editor.Brush.Image
是TFPCustomImage
类型的属性。这是TPersistent
后代。 TImage
是TCustomImage
的后代,因此是TGraphicControl
和TControl
的后代。所以这些是不兼容的完全不同的类。
因此,您不应该转换(Editor.Brush.Image as TImage)
并为其分配任何TImage实例。