Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TList Einträge fehlen (https://www.delphipraxis.net/201728-tlist-eintraege-fehlen.html)

tumo 20. Aug 2019 18:56

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:
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;
Nachfolgend kommen ein paar Varianten des gleichen Events
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:
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;
Hat jemand eine Idee, warum das nicht so funktioniert, wie ich mir das denke? :gruebel:

haentschman 21. Aug 2019 06:23

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:

Liefert nie ein Ergebnis
...kommt er den an dem eingerichteten Breakpoint an?

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:

hoika 21. Aug 2019 06:48

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.

tumo 21. Aug 2019 07:31

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?

haentschman 21. Aug 2019 07:52

AW: TList Einträge fehlen
 
Zitat:

Was soll ich denn statt den globalen Variablen nutzen?
...private Felder deiner Form / Klasse :wink:
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;

tumo 21. Aug 2019 09:17

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:
lb.Canvas.StretchDraw(rect,thumbnails[index].Bitmap);
Das macht offenbar die Bilder kaputt, deswegen jetzt so

Delphi-Quellcode:
lb.Canvas.StretchDraw(rect,thumbnails[index].Graphic);

haentschman 21. Aug 2019 09:53

AW: TList Einträge fehlen
 
Zitat:

Wie hast Du gesehen, dass das globale Variablen waren?
:wink:
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:

Jasocul 21. Aug 2019 10:03

AW: TList Einträge fehlen
 
Zitat:

Zitat von haentschman (Beitrag 1442394)
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:

[OT]
Diese blöde Präfix. Bei mir gibt es keine globalen Variablen. Daher brauche ich das Präfix nicht.:wink:
[/OT]

p80286 21. Aug 2019 10:19

AW: TList Einträge fehlen
 
Zitat:

Zitat von tumo (Beitrag 1442387)

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

Wahrscheinlich: Nein!
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

tumo 21. Aug 2019 11:59

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:
TPictureList[i].Bitmap
einfach die
Delphi-Quellcode:
.Graphic
property nutze. Ich weiß zwar nicht, warum .Bitmap etwas am Bild ändern sollte, aber naja


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:50 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf