1

我在 a 中渲染数据库表的内容TGrid,效果很好。现在我想在每一行上显示一个垃圾桶的图像作为删除该行的按钮。如何才能做到这一点?

4

2 回答 2

3

有几种方法可以在网格中绘制图像。如果图像将在运行时加载,例如从数据库中加载,我更喜欢使用OnDrawColumnCell事件:

procedure TForm1.Grid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
  const Column: TColumn; const Bounds: TRectF; const Row: Integer;
  const Value: TValue; const State: TGridDrawStates);
var
  bmp: TBitmap;
begin
  if Column.Name = 'ImageColumn1' then
  begin
    bmp := ImageList1.Bitmap(Bounds.Size, Row mod ImageList1.Count);
    if assigned(bmp) then
    begin
      Grid1.BeginUpdate;
      Canvas.DrawBitmap(bmp, bmp.Bounds, Bounds, 1);
      Grid1.EndUpdate;
    end;
  end;
end;

此示例需要一个ImageList1带有多个预加载图像的图像。它将所有图像绘制到名称为 的列中ImageColumn1。要从数据库中获取图像,请将行替换为bmp访问权限。

21 年 4 月 18 日更新:

如果您只是想显示一个垃圾桶图标或状态图标,您可以在表单上放置一个图像列表。添加TImageColumnTGlyphColumn(例如作为列号 2)并将此事件中的图像填充到单元格中:

procedure TForm1.Grid1GetValue(Sender: TObject; const ACol, ARow: Integer;
  var Value: TValue);
begin
  if ACol = 2 then
    Value := ImageList1.Bitmap(Bounds.Size, <NumberOfBitmapWithinImageList>);
end;

对于垃圾桶图标,您可以将删除操作写入以下事件方法:

procedure TForm1.Grid1CellClick(const Column: TColumn; const Row: Integer);
begin
  if Column = ImageColumn1 then
    ShowMessage('Row ' + Row.ToString + ' clicked');
end;
于 2021-04-17T12:59:13.067 回答
1

在事件 onDrawColumnCell 上尝试此代码

if stgMain.Cells[0, Row] = 'isImage' then begin
  Bounds.Location := PointF(Bounds.Location.X, Bounds.Location.Y + ((Bounds.Height - Bounds.Width) / 2));

  Bounds.Width := Bounds.Width;
  Bounds.Height := Bounds.Width;

  Canvas.Fill.Kind := TBrushKind.Bitmap;
  Canvas.Fill.Bitmap.WrapMode := TWrapMode.TileStretch;

  Canvas.FillRect(Bounds, 0, 0, AllCorners, 1);

  Canvas.Fill.Bitmap.Bitmap := FMain.img.Bitmap(Bounds.Size, 2);
end;
于 2021-04-22T23:20:33.640 回答