【问题标题】:TListView DynamicAppearance with TImageObjectAppearance will not view image when using LiveBindingsDesigner with TFDMemTable将 LiveBindingsDesigner 与 TFDMemTable 一起使用时,带有 TImageObjectAppearance 的 TListView DynamicAppearance 将不会查看图像
【发布时间】:2016-09-27 09:23:12
【问题描述】:

我欢迎 Embarcaderos 努力使 TListView 更加动态化,并且很高兴看到 Sarina Duponts 发布 here 在其中您可以将 imageindex 链接到 LiveBindings Designer 中的 TListView 属性,甚至将 image 属性链接到数据字段(整数) 使用 DynamicAppearance 和 TImageObjectAppearance 时。

但是……我试过了,几乎成功了。

在我的挑战中,我有一个应用程序,我使用带有 TREST* 函数的 TFDMemTable 来填充 TFDMemTable。如果我不使用 DynamicAppearance 并使用即 ImageListItem 并使用 LiveBindings Designer 将我要使用的数据字段链接到 TListView 中的 imageindex 属性,则一切正常。

虽然使用 DynamicApperance,没有可链接的 imageindex 属性,但 Sarina Dupont 在此处的帖子中说,您可以将整数字段直接链接到 image 属性(IDE/编译器会弄清楚)。

嗯...我想通了:我的数据字段(从 TREST* 和 TFDMemTable 生成)不一定是它们看起来的样子。由于我使用的是 REST/JSON,因此字段类型被“匿名化”为 WideString,实际上 FieldDefs->'dataitem'->DataType 设置为“ftWideString”。我试图将此值更改为 ftInteger,希望这会有所帮助,但我确实收到了以下错误消息:“FDMemtTable1:'datafield' 的字段类型不匹配,预期:WideString 实际:整数”。

所以...我快到了,我真的很想使用 DynamicAppearance 并查看每个 TListViewItem 的多个图像和文本字段...

...或者更容易动态地制作 ListViewItem 'Template' 并用数据填充它,最好的方法是什么?

【问题讨论】:

    标签: c++builder firemonkey c++builder-10.1-berlin


    【解决方案1】:

    我通常会尽量避免使用 LiveBindings。最快、最稳定和最简单的方法是使用代码添加项目。

        ListView1->BeginUpdate();
    
    try {
        for (int i = 0; i <   arrayOfThings->item.Length; i++) {
            TListViewItem* item = ListView1->Items->Add();
    
            item->Text = arrayOfThings->item[i]->item_name;
            item->Data["itemName"]  = TValue::From<UnicodeString>( arrayOfThings->item[i]->item_name);
            item->Data["itemId"]        = TValue::From<UnicodeString>( IntToStr( arrayOfThings->item[i]->id ));
            item->Data["itemDate"]      = TValue::From<UnicodeString>(arrayOfThings->item[i]->item_date);
    // adding the image - imgClock is name of the image field [TImageObjectAppearance ] added to items in ItemAppearance in the TListView object that uses DynamicAppereance
            const UnicodeString imgClock = L"imgClock";
            dynamic_cast<TListItemImage*>(item->Objects->FindDrawable(imgClock))->Bitmap = //bitmap source;
        }
    } catch (...) {
    
    }
    ListView1->EndUpdate();
    

    【讨论】:

    • 这不会比 LiveBindings 慢吗?
    • 你的意思是在性能方面更慢?我没有做任何更复杂的测试,但是在 Windows 和 Android 上,当我使用我的方法时,应用程序的性能都很棒。如果您的意思是编写代码所需的时间更慢 - 对我来说,在代码中执行它会更快。弄清楚 LiveBindings 的工作原理花费了我太多时间,而且当我尝试时,我总是遇到很多像你这样的问题,例如
    • 不是编程速度,而是执行速度。我希望这些库中没有太多开销...
    • 像魅力一样工作!
    猜你喜欢
    • 2016-09-18
    • 2021-01-06
    • 2020-06-09
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多