2016-09-27 1 views
0

Ich begrüße Embarcaderos Bemühungen, TListView dynamischer zu machen, und wurde zu Sarina Duponts post here, wo Sie einfach den Bildindex zu den TListView-Eigenschaften in LiveBindings Designer verknüpfen können und sogar die image -Eigenschaft in ein Datenfeld (Ganzzahl), wenn DynamicAppearance und TImageObjectAppearance verwendet werden.TListView DynamicAppearance mit TImageObjectAppearance wird kein Bild angezeigt, wenn LiveBindingsDesigner mit TFDMemTable verwendet

Aber ... Ich habe versucht, und ist fast gelungen.

In meiner Herausforderung habe ich eine Anwendung, wo ich TFDMemTable mit TREST * Funktion verwenden, um die TFDMemTable zu füllen. Alles funktioniert gut, wenn ich DynamicAppearance nicht verwende und z. B. ImageListItem verwende und das Datenfeld, das ich verwenden möchte, mit LiveBindings Designer mit der imageindex -Eigenschaft in TListView verlinke.

Mit DynamicAppearance gibt es zwar keine imageindex -Eigenschaft, zu der verlinkt werden kann, aber Sarina Dupont sagt hier, dass Sie das Integer-Feld direkt mit der image -Eigenschaft verknüpfen könnten (und der IDE/Compiler wird es herausfinden).

Nun ... Ich dachte mir folgendes heraus: Meine Datenfelder (aus TREST * und TFDMemTable) wurden nicht benötigt, was sie zu sein scheinen. Da ich REST/JSON verwende, sind die Feldtypen in WideString "anonymisiert", in Wirklichkeit sind FieldDefs -> 'Datenelement' -> DataType auf "ftWideString" gesetzt. Ich habe versucht, diesen Wert in ftInteger zu ändern, in der Hoffnung, dass dies helfen würde, aber ich habe nur diese Fehlermeldung erhalten: "FDMemetTable1: Typ nicht übereinstimmen in Feld für 'Datenfeld', unter Berücksichtigung: WideString tatsächlich: Integer".

So ... Ich war fast da, und ich möchte wirklich DynamicAppearance verwenden und mehrere Bilder und Textfelder für jeden TListViewItem ...

sehen ... oder ist es einfacher, eine ‚Vorlage‘ ListViewItem zu machen dynamisch und füllen Sie es stattdessen mit Daten, und was ist der beste Weg, das zu tun?

Antwort

1

Ich versuche normalerweise LiveBindings zu vermeiden. Der schnellste, stabilste und einfachste Weg besteht darin, Elemente mithilfe von Code hinzuzufügen.

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

Wird das nicht langsamer als LiveBindings sein? –

+0

Sie meinen langsamer in der Leistung? Ich habe keine komplexeren Tests durchgeführt, aber sowohl auf Windows als auch auf Android, wenn ich meine Methode verwende, ist die Leistung der Anwendung großartig. Wenn Sie langsamer im Sinne der Zeit meinen, die zum Schreiben von Code benötigt wird - für mich ist das schneller im Code. Herauszufinden, wie LiveBindings funktioniert, nimmt zu viel Zeit in Anspruch und immer, wenn ich es versuchte, endete ich mit einer Unmenge von Problemen, wie z. –

+0

Nicht programmieren Geschwindigkeit, aber Ausführungsgeschwindigkeit. Ich hoffe, es gibt nicht viel Overhead in diesen Bibliotheken ... –

Verwandte Themen