AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein FMX Listview Einträge Richtig Laden
Thema durchsuchen
Ansicht
Themen-Optionen

FMX Listview Einträge Richtig Laden

Ein Thema von jacky213 · begonnen am 7. Aug 2019 · letzter Beitrag vom 8. Aug 2019
Antwort Antwort
jacky213

Registriert seit: 2. Mär 2011
146 Beiträge
 
#1

FMX Listview Einträge Richtig Laden

  Alt 7. Aug 2019, 18:07
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:
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]='Tthen AK := True else AK := False;
Item.Objects.FindObjectT<TListItemImage>('LineImage').Visible := AK;

LVEinkauf.itemIndex := -1;
end;
Wenn ich diese Procedure zur Laufzeit ausführe funktioniert alles wie es soll.

Zum Beispiel:
AddAllItems('1#Laden1#Nägel 25x2,5#F'); 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.

Kann mir jeman sagen was da schief läuft?

Geändert von jacky213 ( 7. Aug 2019 um 18:23 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.162 Beiträge
 
Delphi 12 Athens
 
#2

AW: FMX Listview Einträge Richtig Laden

  Alt 7. Aug 2019, 18:22
Delphi-Quellcode:
Item.Objects.FindObjectT<TListItemImage>('LineImage').Visible := AK;
...
LObj := Item.Objects.FindObjectT<TListItemImage>('LineImage');
if Assigned( LObj )
    LObj.Visible := AK;
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.

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;

Geändert von Rollo62 ( 7. Aug 2019 um 18:25 Uhr)
  Mit Zitat antworten Zitat
jacky213

Registriert seit: 2. Mär 2011
146 Beiträge
 
#3

AW: FMX Listview Einträge Richtig Laden

  Alt 7. Aug 2019, 18:38
Also er kann mit TryFindObject nichts anfangen. Was muss dafür in die Uses?
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.162 Beiträge
 
Delphi 12 Athens
 
#4

AW: FMX Listview Einträge Richtig Laden

  Alt 7. Aug 2019, 20:10
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:
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;
So ein Zugriff über eine Textsuche ist nicht unbedingt ideal, ich würde versuchen das anders zu lösen.
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.

Geändert von Rollo62 ( 7. Aug 2019 um 20:16 Uhr)
  Mit Zitat antworten Zitat
jacky213

Registriert seit: 2. Mär 2011
146 Beiträge
 
#5

AW: FMX Listview Einträge Richtig Laden

  Alt 7. Aug 2019, 20:21
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
  Mit Zitat antworten Zitat
jacky213

Registriert seit: 2. Mär 2011
146 Beiträge
 
#6

AW: FMX Listview Einträge Richtig Laden

  Alt 7. Aug 2019, 21:12
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:25 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 by Thomas Breitkreuz