firemonkey 即时将项目添加到 HorzScrollBox

firemonkey add item to HorzScrollBox on the fly

我的 form.after 运行 程序中有一个水平滚动框项目,我将获得一个 json 字符串,其中包含必须位于水平滚动框中的项目列表。我必须动态添加它们。

例如我有这个: 在 运行 中的程序之后?我必须要一张新图片的区域。

我找到了函数: HorzScrollBox1.AddObject(); 但这个需要参数

我有两个问题:

1)如何向其中添加新对象?

2)我可以克隆现有图像并将其添加到列表末尾吗?

添加对象:有两种方式——设置子对象的Parent属性或者执行父对象的AddObject方法。 Parent 属性 setter 有一些检查,并调用 AddObject。 根据控件 class,可以将子对象添加到控件的 Controls 集合或其 Content 私有字段中。并非所有 classes 都提供对此字段的访问(在某些情况下,您可以使用变通方法,例如 )。 HorzScrollBox 在 public 部分有这个字段。

因此,如果您想克隆现有图像,您必须:

  1. Content 中获取现有图像 HorzScrollBox

  2. 创建新图像并设置它的属性

  3. 将新图像放入 HorzScrollBox。

例如:

procedure TForm2.btnAddImgClick(Sender: TObject);
  function FindLastImg: TImage;
  var
    i: Integer;
    tmpImage: TImage;
  begin
    Result:=nil;
    // search scroll box content for "most right" image
    for i := 0 to HorzScrollBox1.Content.ControlsCount-1 do
      if HorzScrollBox1.Content.Controls[i] is TImage then
        begin
          tmpImage:=TImage(HorzScrollBox1.Content.Controls[i]);
          if not Assigned(Result) or (Result.BoundsRect.Right < tmpImage.BoundsRect.Right) then
            Result:=tmpImage;
        end;
  end;

  function CloneImage(SourceImage: TImage): TImage;
  var
    NewRect: TRectF;
  begin
    Result:=TImage.Create(SourceImage.Owner);
    Result.Parent:=SourceImage.Parent;

    // Copy needed properties. Assign not work for TImage...
    Result.Align:=SourceImage.Align;
    Result.Opacity:=SourceImage.Opacity;
    Result.MultiResBitmap.Assign(SourceImage.MultiResBitmap);

    // move new image
    NewRect:= SourceImage.BoundsRect;
    NewRect.Offset(NewRect.Width, 0); // move rect to right.
    Result.BoundsRect:=NewRect;
  end;
begin
  CloneImage(FindLastImg);
end;