You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VCL中替换FMX的Bitmap.ClearRect方法?

问题描述

将FMX项目改写为VCL项目时,需要替换FMX中绘制二维码的ClearRect方法。原FMX代码如下:

for Column := 0 to QRCode.Columns - 1 do
begin
  if QRCode.IsBlack[Row, Column] then
    QRCodeBitmap.ClearRect(TRectF.Create(PointF(Column, Row) * Scale,
      Scale, Scale), TAlphaColors.Black);
end;

尝试了以下VCL代码但效果不符合预期:

if (QRCode.IsBlack[Row, Column]) then
begin
  QRCodeBitmap.Canvas.Pixels[Column, Row] := clBlack;
end else
begin
  QRCodeBitmap.Canvas.Pixels[Column, Row] := clWhite;
end; 

解决方案

原FMX代码的ClearRect是绘制一个Scale×Scale大小的矩形来表示二维码的一个模块,而你尝试的VCL代码仅修改了单个像素,忽略了缩放逻辑,所以效果不对。在VCL中可以用Canvas.FillRect方法来实现相同的缩放绘制逻辑:

正确代码示例

var
  Rect: TRect;
begin
  // 先初始化背景为白色,对应FMX未绘制区域的默认逻辑
  QRCodeBitmap.Canvas.Brush.Color := clWhite;
  QRCodeBitmap.Canvas.FillRect(QRCodeBitmap.Canvas.ClipRect);

  for Row := 0 to QRCode.Rows - 1 do
  begin
    for Column := 0 to QRCode.Columns - 1 do
    begin
      if QRCode.IsBlack[Row, Column] then
      begin
        // 按Scale计算当前二维码模块的矩形区域
        Rect.Left := Column * Scale;
        Rect.Top := Row * Scale;
        Rect.Right := Rect.Left + Scale;
        Rect.Bottom := Rect.Top + Scale;

        QRCodeBitmap.Canvas.Brush.Color := clBlack;
        QRCodeBitmap.Canvas.FillRect(Rect);
      end;
    end;
  end;
end;

关键说明

  1. 背景填充:先将整个Bitmap填充为白色,避免残留旧的图像内容,和FMX中未绘制黑色模块的区域逻辑匹配。
  2. 缩放逻辑还原:每个二维码模块对应VCL中的一个TRect,尺寸由Scale参数控制,和原FMX代码的缩放逻辑完全一致。
  3. 性能优化:使用FillRect比逐个设置Pixels效率更高,尤其是处理大尺寸二维码时,不会出现卡顿问题。

内容的提问来源于stack exchange,提问作者W300I

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:52:36