AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TList Einträge fehlen

Ein Thema von tumo · begonnen am 20. Aug 2019 · letzter Beitrag vom 21. Aug 2019
Antwort Antwort
tumo

Registriert seit: 28. Apr 2014
46 Beiträge
 
Delphi 10.3 Rio
 
#1

TList Einträge fehlen

  Alt 20. Aug 2019, 17:56
Delphi-Version: 10.2 Tokyo
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?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.431 Beiträge
 
Delphi 12 Athens
 
#2

AW: TList Einträge fehlen

  Alt 21. Aug 2019, 05:23
Moin...
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. 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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TList Einträge fehlen

  Alt 21. Aug 2019, 05:48
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.
Heiko
  Mit Zitat antworten Zitat
tumo

Registriert seit: 28. Apr 2014
46 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: TList Einträge fehlen

  Alt 21. Aug 2019, 06:31
@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

@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?

Geändert von tumo (21. Aug 2019 um 06:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.431 Beiträge
 
Delphi 12 Athens
 
#5

AW: TList Einträge fehlen

  Alt 21. Aug 2019, 06:52
Zitat:
Was soll ich denn statt den globalen Variablen nutzen?
...private Felder deiner Form / Klasse
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;
  Mit Zitat antworten Zitat
tumo

Registriert seit: 28. Apr 2014
46 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: TList Einträge fehlen

  Alt 21. Aug 2019, 08:17
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

lb.Canvas.StretchDraw(rect,thumbnails[index].Bitmap); Das macht offenbar die Bilder kaputt, deswegen jetzt so

lb.Canvas.StretchDraw(rect,thumbnails[index].Graphic);

Geändert von tumo (21. Aug 2019 um 08:27 Uhr)
  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 21:08 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