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

Delphi FMX代码创建TListView显示图片及TFlowLayout布局求助

问题解决方案

一、修复TListViewItem图片不显示的问题

你的代码核心问题是没有将创建的TListItemImage添加到ListViewItem的视图对象集合中,同时需要确保ListView使用支持自定义视图的外观模式。以下是修正后的代码:

function TForm1.BuildGrpObj(GroupSize, CurrPicIdx: integer): boolean;
var
  aPicObj : TListViewItem;
  k: Integer;
  aPicObjImg: TListItemImage;
  FName: string;
begin
  // 确保ListView使用动态外观(设计时也可直接设置ItemAppearance为DynamicAppearance)
  ListView1.ItemAppearance.ItemAppearance := 'DynamicAppearance';
  
  for k := 0 to GroupSize-1 do
  begin
    aPicObj := Listview1.Items.Add;
    aPicObj.Text := 'Picture: ' + IntToStr(CurrPicIdx + k);
    
    // 创建图片视图对象并关联到当前ListViewItem的ViewObjects
    aPicObjImg := TListItemImage.Create(aPicObj);
    aPicObjImg.Parent := aPicObj.ViewObjects; // 关键:添加到视图集合
    
    FName := LList[CurrPicIdx + k];
    if FileExists(FName) then
    begin
      aPicObjImg.Bitmap.LoadFromFile(FName);
      // 设置图片适配模式,避免拉伸变形
      aPicObjImg.Bitmap.ScaleMode := TBitmapScaleMode.Smoothed;
      aPicObjImg.Bitmap.Size := TSize.Create(40, 40);
    end;
    
    // 调整图片在Item中的位置
    aPicObjImg.Align := TListItemAlign.Center;
    aPicObjImg.VertAlign := TListItemAlign.Center;
    aPicObjImg.Width := 40;
    aPicObjImg.Height := 40;
  end;
  Result := True;
end;

额外注意事项:

  • 检查LList中的文件路径是否正确(Android下需注意权限,比如读取外部存储需要申请权限)
  • 桌面平台确保图片格式支持(如PNG/JPG)
  • 若要让ListView横向滚动,需设置ListView1.ScrollViewHorz := True,同时设置ListView1.ItemAppearance.ItemWidth为固定值(比如100)

二、将TListView添加到TFlowLayout的方法

不管是设计时还是代码动态创建,核心是将ListView的Parent属性设置为TFlowLayout:

1. 设计时操作

  • 把TFlowLayout拖放到窗体上
  • 直接将TListView拖入TFlowLayout中,FlowLayout会自动管理它的布局位置

2. 代码动态创建并添加

var
  NewListView: TListView;
begin
  NewListView := TListView.Create(Self);
  NewListView.Parent := FlowLayout1; // 关联到FlowLayout
  NewListView.Width := 200; // 设置合适宽度
  NewListView.Height := 100; // 设置合适高度
  NewListView.ScrollViewHorz := True; // 横向滚动
  NewListView.ItemAppearance.ItemAppearance := 'DynamicAppearance';
  
  // 调用你的BuildGrpObj方法填充内容
  BuildGrpObj(5, 0);
end;

TFlowLayout会根据自身的FlowDirection(横向/纵向)自动排列所有子控件,你可以通过设置FlowLayout1.Padding、FlowLayout1.Spacing来调整控件间的间距。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:25:21