![]() |
FMX Listview Einträge Richtig Laden
Ich habe eine Android App mit einer Listview erstellt.
Sobald man die App startet werden alle werte mittels Memo geladen und dann in die Listview mittels folgender Procedure in die Listview eingefügt.
Delphi-Quellcode:
Wenn ich diese Procedure zur Laufzeit ausführe funktioniert alles wie es soll.
function ReAddBlanks (St:String) : String;
begin result := StringReplace(St, '§', ' ',[rfReplaceAll, rfIgnoreCase]); end; Procedure TfrmMain.AddAllItems(Value : String); var VList : TStringlist; Item : TListViewItem; AK : Boolean; begin Value := StringReplace(Value, ' ', '§',[rfReplaceAll, rfIgnoreCase]); VList := TStringlist.Create; VList.Delimiter := '#'; VList.DelimitedText := Value; Item := LVEinkauf.items.Add; Item.Objects.FindObjectT<TListItemText>('Anzahl').Text := ReAddBlanks(VList[0]); Item.Objects.FindObjectT<TListItemText>('Trenner').Text := 'x'; Item.Objects.FindObjectT<TListItemText>('Laden').Text := ReAddBlanks(VList[1]); Item.Objects.FindObjectT<TListItemText>('Produkt').Text := ReAddBlanks(VList[2]); Item.Objects.FindObjectT<TListItemImage>('LineImage').Bitmap := Image1.Bitmap; if VList[3]='T' then AK := True else AK := False; Item.Objects.FindObjectT<TListItemImage>('LineImage').Visible := AK; LVEinkauf.itemIndex := -1; end; Zum Beispiel:
Delphi-Quellcode:
Aber wenn die App startet und die Daten lädt, wird bleibt der TListItemImage Visible stand immer auf False und die daten werden einfach nur eingefügt. Es kommt keine Fehlermeldung.
AddAllItems('1#Laden1#Nägel 25x2,5#F');
Kann mir jeman sagen was da schief läuft? |
AW: FMX Listview Einträge Richtig Laden
Delphi-Quellcode:
Nenn mich paranoid, aber ich würde solche Abfragen immer in einer Variablen speichern und gegenchecken, denn jeder kleine Typo könnte mit nil zurückkommen.
Item.Objects.FindObjectT<TListItemImage>('LineImage').Visible := AK;
... LObj := Item.Objects.FindObjectT<TListItemImage>('LineImage'); if Assigned( LObj ) LObj.Visible := AK; Dafür baue ich mir in solchen Fällen oft ein paar einfache Wrapper die das Ganze mit TryFindObject absichern
Delphi-Quellcode:
if TryFindObject<TListItemImage>(Item, 'LineImage', LObj ) then
LObj.Visible := AK; |
AW: FMX Listview Einträge Richtig Laden
Also er kann mit TryFindObject nichts anfangen. Was muss dafür in die Uses?
|
AW: FMX Listview Einträge Richtig Laden
Das war ein genereller Vorschlag um den Zugriff auf die Elemente abzusichern.
Solche Wrapper kannst Du selber schreiben, am Besten in einer eigenen Unit, oder als class helper. Hier mal schnell hingekritzelt (ungetestet), solange das über deinem Code steht sollte der Zugriff wie unten OK sein. Das Problem in der App kann aber auch von einer ganz anderer Stelle kommen, mir ging es nur darum diese möglichen Zugriffsfehler auf nil schonmal ausschliessen.
Delphi-Quellcode:
So ein Zugriff über eine Textsuche ist nicht unbedingt ideal, ich würde versuchen das anders zu lösen.
function TryFindObject(const AItem : TListViewItem;
const AName : String; var AObj : TListItemText ) : Boolean; overload; begin if Assigned( AItem ) then begin AObj := AItem.Objects.FindObjectT<TListItemText>( AName ); if Assigned( AObj ) then Result := True else Result := False; end else begin AObj := nil; Result := False; end; end; function TryFindObject(const AItem : TListViewItem; const AName : String; var AObj : TListItemImage ) : Boolean; overload; begin if Assigned( AItem ) then begin AObj := AItem.Objects.FindObjectT<TListItemImage>( AName ); if Assigned( AObj ) then Result := True else Result := False; end else begin AObj := nil; Result := False; end; end; ´ //... procedure InDeinerAnwendungsfunktion; var LItem : TListViewItem; LObjText : TListItemText; LObjImg : TListItemImage; begin LItem := LVEinkauf.items.Add; if TryFindObject( LItem, 'Anzahl', LObjText) then LObjText.Text := ReAddBlanks(VList[0]); // <-- hier kannst Du sicher sein das LObj existiert //... if TryFindObject( LItem, 'LineImage'', LObjImg) then LObjImg.Bitmap := Image1.Bitmap; // <-- hier kannst Du sicher sein das LObj existiert end; Geht aber wolh in diesem Fall, wenn die Elemente auch wirklich da sind und gefunden werden können. Am Besten einfach mal debuggen und sehen was zurückgeliefert wird, bevor man darauf zugreift. |
AW: FMX Listview Einträge Richtig Laden
Habe nochmal jeden Schritt geprüft. Alle Werte werden richtig gelesen und gespeichert. Er setzt die Image visible einfach nicht auf true, keine Ahnung warum
|
AW: FMX Listview Einträge Richtig Laden
ich konnte mein Problem lösen, indem ich einen Timer auf die Form gesetzt habe welcher nach 1000 ms die gespeicherte Datei lädt. Erst dann wurden die Einträge richtig geladen und auch das Image Object wurde richtig dargestellt.
|
AW: FMX Listview Einträge Richtig Laden
Hi,
mal so eine Idee hierzu: Wurde deine Methode im FormCreate (gibt es in FMX doch auch, oder?) aufgerufen? Vielleicht lief das, bevor die Res-Daten (etwas vergleichbares gibt es bei FMX doch sicher auch) verarbeitet wurden. Oder die Komponente war halt (weil im Create) noch in einer Art "Create-Status", so dass Änderngen an den Einstellungen ignoriert wurden. ... Ich konnte schon einige Probleme lösen, indem ich Methoden/Aufrufe/... von FormCreate nach FormShow verschoben habe. Jeder ist sicherlich schonmal darauf reingefallen im Create "SetFocus" zu schreiben, oder bin ich der einzige Depp? :wink: MfG Incocnito |
AW: FMX Listview Einträge Richtig Laden
Zitat:
Und auch Styles könnten noch nicht verfügbar sein. |
AW: FMX Listview Einträge Richtig Laden
Das dachte ich mir auch und habe es auch mit dem OnShow versucht, doch leider brachte mich das auch nicht weiter. Hab den Timer nun auf 255 ms gesetzt und es funktioniert einwandfrei.
|
AW: FMX Listview Einträge Richtig Laden
OnActivate?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz