在TStringGrid中的单元格中的按钮上绘制和图像

时间:2016-08-18 15:47:11

标签: linux pascal lazarus freepascal

我在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;不相关

在这一点上,我确定我完全以错误的方式解决这个问题。有人可以让我回到正确的道路上吗?

2 个答案:

答案 0 :(得分:3)

我怀疑OnDrawCell事件是修改单元格编辑器的正确位置,因为在绘制单元格时此时可能不存在正确的单元格编辑器。

定义单元格编辑器的正确事件是网格的OnSelectEditor事件。请阅读wiki(http://wiki.lazarus.freepascal.org/Grids_Reference_Page)。

您使用的cbsButton编辑器继承自TButton。 TButton没有Glyph属性 - 您无法为按钮指定位图。但是,您可以轻松编写自己的单元格编辑器,只需按照 examples / gridexamples / gridcelleditor 中的标准示例进行操作:

  • 将TBitBtn添加到表单中。删除其标题,将请求的图像添加到Glyph属性。将Visible属性设置为false。
  • 在此按钮的OnClick事件中,写下您要如何编辑单元格。访问由网格的属性Col和Row指定的单元格。举个例子,我假设您只想打开一个InputBox:
    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] := 
        InputBox('Input some text', 'Text:', '');
    end;
  • 现在为网格的OnSelectEditor事件编写一个事件处理程序。它必须将BitBtn分配给事件的Editor参数,并确保按钮位于所选单元格中的正确位置 - 这就是全部!
    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.ImageTFPCustomImage类型的属性。这是TPersistent后代。 TImageTCustomImage的后代,因此是TGraphicControlTControl的后代。所以这些是不兼容的完全不同的类。

因此,您不应该转换(Editor.Brush.Image as TImage)并为其分配任何TImage实例。