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.116 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.116 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
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#7

AW: FMX Listview Einträge Richtig Laden

  Alt 8. Aug 2019, 08:08
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?

MfG Incocnito
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#8

AW: FMX Listview Einträge Richtig Laden

  Alt 8. Aug 2019, 09:30
Hi,
... von FormCreate nach FormShow verschoben habe.
Ja richtig, das sollte man vor Allem bei Mobile-Plattformen, weil sonst das Pohone die App einfach rauswirft, wenn es mal länger daueret.
Und auch Styles könnten noch nicht verfügbar sein.
  Mit Zitat antworten Zitat
jacky213

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

AW: FMX Listview Einträge Richtig Laden

  Alt 8. Aug 2019, 22:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: FMX Listview Einträge Richtig Laden

  Alt 8. Aug 2019, 22:45
OnActivate?
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 22:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz