![]() |
Delphi-Version: 10.2 Tokyo
TList Einträge fehlen
Guten Tag,
ich lade in einer for-Schleife Bilder aus dem Internet herunter und speichere sie in einer TList (oder TObjectList). Später möchte ich über eine Listbox das entsprechende Bild in einem TImage anzeigen. Nun habe ich einige "anomalien" entdeckt, die ich mir noch nicht erklären kann. Unter anderem sind die ersten 4 Einträge (also bis zum Index 3) leer bzw. es wird kein Bild angezeigt. Desweiteren funktioniert die Anzeige nicht, wenn ich zur Index-Angabe die Listbox.ItemIndex Property nutze. Konstante Werte oder die last-Eigenschaft gehen wiederum. Beim Debuggen sind die Werte vom ItemIndex korrekt und die selben Werte funktionieren als Konstante.
Delphi-Quellcode:
Nachfolgend kommen ein paar Varianten des gleichen Events
procedure TForm1.Button2Click(Sender: TObject);
var uploadId: String; video: TdJSON; client: THTTPClient; http: IHTTPResponse; pic: TPicture; begin if ListBox1.ItemIndex < 0 then exit; Listbox2.items.clear; videos.Free; videos := TObjectList<TdJSON>.create; thumbnails.free; thumbnails := TObjectList<TPicture>.create; //.....\\ for video in ytapi.JSON['items'] do begin ListBox2.Items.Add(video['snippet|title'].AsString); videos.Add(video); client := THTTPClient.Create; http := client.Get(Video['snippet|thumbnails|high|url'].AsString); // Bild herunterladen thumbnails.Add(TPicture.Create); // Neuer Eintrag thumbnails.Last.LoadFromStream(http.ContentStream); // Bild in Liste speichern end; pic := thumbnails[0]; image1.Picture := pic; // Hier wird ein Bild angezeigt, egal welcher Index (0 - 49) end;
Delphi-Quellcode:
procedure TForm1.ListBox2Click(Sender: TObject);
var client: THTTPClient; http: IHTTPResponse; i: Integer; pic: TPicture; begin if Listbox2.ItemIndex < 0 then exit; pic := thumbnails[ListBox2.ItemIndex]; Image1.Picture := pic; // Liefert nie ein Ergebnis end;
Delphi-Quellcode:
Hat jemand eine Idee, warum das nicht so funktioniert, wie ich mir das denke? :gruebel:
procedure TForm1.ListBox2Click(Sender: TObject);
var client: THTTPClient; http: IHTTPResponse; i: Integer; pic: TPicture; begin if Listbox2.ItemIndex < 0 then exit; pic := thumbnails[30]; Image1.Picture := pic; // Liefert ein Ergebnis für Indizies > 3 end; |
AW: TList Einträge fehlen
Moin... 8-)
Zum Problem kann ich nur vermuten daß der ItemIndex nicht > 0 ist oder das Bild leer ist. Prüfe das mal. Zitat:
Anmerkung: Aus dem Code geht dervor, daß du die Freigabe merkwürdig gestaltest hast. Die Listen werden/sollten einmal erstellt (constructor) und im destructor freigeben werden. Die Liste macht dann mit Clear leer. Und benutze keine globalen Variablen. = bähhh. :zwinker: Der Code hat keine Stuktur. Stelle mal das gesamte Projekt hier rein. (ZIP...pas und dpr) Dann können wir auch dir die Codequalität verbessern. :thumb: |
AW: TList Einträge fehlen
Hallo,
ich würde erst mal ohne den Download arbeiten. Also die Bilder Lokal laden Irgendwas stimmt mit dem Code nicht, den du nicht gezeigt hast. |
AW: TList Einträge fehlen
@haentschmann Hallo, ja, ich weiß, dass mein COde keine struktur hat, ist nur ein "Probierprojekt". Was soll ich denn statt den globalen Variablen nutzen? Ja, er kommt immer dort an. Wie gesagt, das stimmt ja alles, das TImage zeigt dann halt nur nichts an. Aber das Angebot nehme ich gerne an, sobald das Problem geklärt ist und ich ein wenig aufräumen konnte :P
@hoika Moin. Die Downloads klappen ja problemlos. Siehe Kommentare im 1. Codeschnipsel. Es ist nur nach dem Ende dieser Methode, dass die ersten paar Bilder nicht mehr da sind (oder halt nicht darstellbar sind oder so). Und die Sache mit dem ItemIndex konnte auch noch niemand klären, warum im 3. Codeschnipsel trotz gleicher Zahlenwerte (im Debug geprüft) eine Konstante ein Ergebnis liefert und eine Varable nicht? |
AW: TList Einträge fehlen
Zitat:
Beispiel:
Delphi-Quellcode:
TFormBlubb = class(TForm)
procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private FBla: Integer; // Variable FListBlubbchen: TObjectList<TBlubbchen>; // Liste public end; ... procedure TfoMain.FormCreate(Sender: TObject); begin FListBlubbchen := TObjectList<TBlubbchen>.Create; end; procedure TfoMain.FormDestroy(Sender: TObject); begin FListBlubbchen.Free; inherited; end; |
AW: TList Einträge fehlen
Zwei Dinge:
1. Wie hast Du gesehen, dass das globale Variablen waren? Aber ja, das kann ich noch machen 2. Ich habe es gerade noch mal getestet, es geht doch. Kennt ihr das, wenn der Code einen Tag reift und plötzkich geht? Ich schwöre, gestern ging es nicht und ich schwöre auch dass ich nichts am Code geändert habe. Das Problem ist offenbar gelöst... EDIT: Hab den Fehler gefunden, versteh ihn aber nicht. Ich habe ein Custom Draw Event bei der TListBox, wo ich besagte Bilder auch reinmalen will. Derzeit habe ich das über diese Zeile getan
Delphi-Quellcode:
Das macht offenbar die Bilder kaputt, deswegen jetzt so
lb.Canvas.StretchDraw(rect,thumbnails[index].Bitmap);
Delphi-Quellcode:
lb.Canvas.StretchDraw(rect,thumbnails[index].Graphic);
|
AW: TList Einträge fehlen
Zitat:
Die Variablen waren nicht lokal in der procedure deklariert, die Variablen hatten keinen Präfix "F" davor (Styleguide für private Variablen)...da müssen es globale sein...:zwinker: |
AW: TList Einträge fehlen
Zitat:
Diese blöde Präfix. Bei mir gibt es keine globalen Variablen. Daher brauche ich das Präfix nicht.:wink: [/OT] |
AW: TList Einträge fehlen
Zitat:
Ein solches Verhalten trat bei mir immer auf wenn irgendwelche Variablen nicht odentlich initialisiert waren oder ich vom Pfad der Bedienungstugend abgewichen war oder im Speicher etwas überschrieben wurde was nicht so gedacht war ..... Spontanheilungen in Programmen gibt es nicht. Da sind irgendwelche Seiteneffekte die Du noch nicht erkann hast. Gruß K-H |
AW: TList Einträge fehlen
@p80286 Sehe ich genau so, nut weiß ich nciht, wo ich da etwas überscheiben oder nicht richtig initialisieren soll? Der Fehler lässt sich ja provozieren, wenn ich statt
Delphi-Quellcode:
einfach die
TPictureList[i].Bitmap
Delphi-Quellcode:
property nutze. Ich weiß zwar nicht, warum .Bitmap etwas am Bild ändern sollte, aber naja
.Graphic
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:35 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