首页 > 解决方案 > Delphi DrawGrid 只显示第一张图片

问题描述

我想在TDrawGrid. 在下面的示例中,我的 DrawGrid 仅显示 1 个图像及其第一个图像。其他 2 个图像不显示在网格中。网格RowCount是 3,而ColCount是 1。

procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Bmp: TBitmap;
  R: TRect;
  JImg: TJPEGImage;
begin
  JImg := TJPEGImage.Create;
  Bmp := TBitmap.Create;

  try
    JImg.LoadFromFile('c:\tmp\photo'+IntToStr(ARow+1)+'.jpeg');

    Bmp.PixelFormat := pf24bit;
    Bmp.Width := 73;
    Bmp.Height := 73;

    R.Top := Rect.Top + 1;
    R.Left := Rect.Left + 1;
    R.Right := R.Left + 73;
    R.Bottom := R.Top + 73;
    Bmp.Canvas.StretchDraw(R, JImg);
    DrawGrid1.Canvas.StretchDraw(R, Bmp);
  finally
    JImg.Free;
    Bmp.Free;
  end;
end;

标签: delphi

解决方案


您正在使用错误的值TJPEGImage绘制。您使用的值是相对于 Grid 的,而不是相对于 的,因此第二个和后续图像被绘制在的边界之外。TBitmapTRectTBitmapTBitmap

您需要使用更像这样的东西:

procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  ARect: TRect; State: TGridDrawState);
var
  Bmp: TBitmap;
  R: TRect;
  JImg: TJPEGImage;
begin
  JImg := TJPEGImage.Create;
  try
    JImg.LoadFromFile(Format('c:\tmp\photo%d.jpeg', [ARow+1]));

    Bmp := TBitmap.Create;
    try
      Bmp.PixelFormat := pf24bit;
      Bmp.Width := 73;
      Bmp.Height := 73;

      R := Rect(0, 0, Bmp.Width, Bmp.Height);
      Bmp.Canvas.StretchDraw(R, JImg);

      R.Offset(ARect.Left, ARect.Top);
      DrawGrid1.Canvas.StretchDraw(R, Bmp);
    finally
      Bmp.Free;
    end;
  finally
    JImg.Free;
  end;
end;

但是,实际上根本不需要TBitmap,因为您可以TJPEGImage直接将 绘制到网格上Canvas

procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  ARect: TRect; State: TGridDrawState);
var
  R: TRect;
  JImg: TJPEGImage;
begin
  JImg := TJPEGImage.Create;
  try
    JImg.LoadFromFile(Format('c:\tmp\photo%d.jpeg', [ARow+1]));

    R := Rect(0, 0, 73, 73);
    R.Offset(ARect.Left + 1, ARect.Top + 1);
    DrawGrid1.Canvas.StretchDraw(R, JImg);
  finally
    JImg.Free;
  end;
end;

.jpeg话虽如此,每次在屏幕上重新绘制网格时,此代码都会重新加载文件。您应该一次加载文件并缓存图像,例如在TImageList. 或者,根本不使用TDrawGrid。例如,您可以在 aTImage上放置一系列控件TScrollBox,然后将.jpeg文件加载到TImage控件中,让它们为您处理绘图。


推荐阅读