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

C++Builder XE6中TListView Tile视图插入项显示位置异常问题

问题:VCL TListView Tile视图插入项显示位置异常

我使用C++Builder XE6开发VCL窗体应用,其中包含一个以Tile视图展示的TListView。由于VCL原生TListView组件未提供Tile视图选项,我先在窗体设计器中将ViewStyle设为vsReport,再通过代码切换为Tile视图:

void __fastcall TForm1::FormShow (TObject *Sender)
{
    TLVTileViewInfo tvi = {};

    tvi.cbSize = sizeof(tvi);
    tvi.dwMask = LVTVIM_COLUMNS;
    tvi.cLines = ListView1->Columns->Count - 1;

    ListView_SetTileViewInfo(ListView1->Handle, &tvi);

    ListView_SetView(ListView1->Handle, LV_VIEW_TILE);
}

该TListView的属性设置如下:Checkboxes=true、GroupView=false、RowSelect=true、ShowWorkAreas=false、SortType=stNone,同时配置了OnInsert事件处理程序:

void __fastcall TForm1::ListView1Insert (TObject *Sender, TListItem *Item)
{
    TLVTileInfo ti = {};

    Item->Caption = " ";    // 标题为空时ComCtl32.dll会抛出访问违例异常

    ti.cbSize    = sizeof(ti);
    ti.iItem     = Item->Index;
    ti.cColumns  = ListView1->Columns->Count - 1;
    ti.puColumns = new unsigned[ti.cColumns];
    ti.piColFmt  = new int[ti.cColumns];

    try
    {
        for (unsigned i = 0; i < ti.cColumns; i++)
        {
            ti.puColumns[i] = 1 + i;
            ti.piColFmt [i] = LVCFMT_LEFT;
        }

        ListView_SetTileInfo(ListView1->Handle, &ti);
    }
    __finally
    {
        delete[] ti.puColumns;
        delete[] ti.piColFmt;
    }
}

当我在列表顶部插入项(例如执行TListItem* Item = ListView1->Items->Insert(0);)时,项的Index为0,但实际显示在列表底部。删除项时列表会出现空白区域,我通过调用ListView_Arrange(ListView1->Handle, LVA_DEFAULT);解决了这个问题,但插入项后调用该方法无效。Report视图下插入项显示正常,仅Tile视图存在此异常。如何让Tile视图按照项的Index升序正确显示?


更新

我发现切换到其他视图再切回LV_VIEW_TILE可让列表正确排序,示例代码如下:

void __fastcall TForm1::Button1Click (TObject *Sender)
{
    ListView1->Items->BeginUpdate();    // 禁用列表视图重绘

    try
    {
        TListItem* Item = ListView1->Items->Insert(0);

        Item->Caption = "New item";

        ListView_SetView(ListView1->Handle, LV_VIEW_LIST);  // 可设置为除LV_VIEW_TILE外的任意LV_VIEW_...值
        ListView_SetView(ListView1->Handle, LV_VIEW_TILE);
    }
    __finally
    {
        ListView1->Items->EndUpdate();  // 启用列表视图重绘
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:00:58