c++builderfiremonkeyc++builder-10.1-berlin

TListView DynamicAppearance with TImageObjectAppearance will not view image when using LiveBindingsDesigner with TFDMemTable


I am welcoming Embarcaderos efforts to make TListView more dynamically, and was exited to see Sarina Duponts post here where you could just link the imageindex to the TListView properties in LiveBindings Designer, and even the image property to a datafield (integer) when using DynamicAppearance and TImageObjectAppearance.

But... I tried, and did almost succeed.

In my challenge I have an application where I use TFDMemTable with TREST* function to populate the TFDMemTable. All works well if I don't use the DynamicAppearance and use i.e. ImageListItem and links the datafield I want to use to the imageindex property in TListView using LiveBindings Designer.

With DynamicApperance though, there are no imageindex property to link to, but Sarina Dupont says in here post that you could link the integer field directly to the image property (and IDE/compiler will figure it out).

Well... I figured following out: My data fields (semicreated from TREST* and TFDMemTable) are not neccesserely what they seems to be. Since I am using REST/JSON, the fieldtypes are "anonymized" to WideString, actually the FieldDefs->'dataitem'->DataType is set to "ftWideString". I tried to change this value to ftInteger in hope that this would help, but I did just get this errormessage: "FDMemtTable1: Type mismatch in field for 'datafield', exepecting: WideString actual: Integer".

So... I was nearly there, and I really want to use DynamicAppearance and view several images and textfields for each TListViewItem...

...or is it easier to make a ListViewItem 'Template' dynamically and populate it with data instead, and what is the best way to do that ?


Solution

  • I usually try to avoid LiveBindings. The fastest, most stable and easiest way is to add items using code.

        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();