delphi - 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;
解决方案
您正在使用错误的值TJPEGImage
绘制。您使用的值是相对于 Grid 的,而不是相对于 的,因此第二个和后续图像被绘制在的边界之外。TBitmap
TRect
TBitmap
TBitmap
您需要使用更像这样的东西:
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
控件中,让它们为您处理绘图。
推荐阅读
- docusignapi - 实际签名者和委托签名者之间的映射
- flutter - 如何修复“底部无限像素溢出的 RenderFlex”。颤振错误?
- ruby-on-rails - 如何使用 rspec 测试返回的异常?
- javascript - Firebase:如何处理传递给 firebase.initializeApp() 的无效 firebaseConfig
- rxjs - 如何正确使用静态 combineLatest
- android - EditText.selectAll() 不选择文本
- node.js - 使用 Winston 进行日志锻造和日志完整性
- gps - 是否可以通过插补来近似缺失的位置数据?
- javascript - 怎么刮
- python-3.x - 如何在 Sanic 中获取推荐网站 url