AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TList Einträge fehlen

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

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

TList Einträge fehlen

  Alt 20. Aug 2019, 18: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.275 Beiträge
 
Delphi 12 Athens
 
#2

AW: TList Einträge fehlen

  Alt 21. Aug 2019, 06: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.269 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TList Einträge fehlen

  Alt 21. Aug 2019, 06: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, 07: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 07:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

AW: TList Einträge fehlen

  Alt 21. Aug 2019, 07: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, 09: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 09:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

AW: TList Einträge fehlen

  Alt 21. Aug 2019, 09:53
Zitat:
Wie hast Du gesehen, dass das globale Variablen waren?

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

Geändert von haentschman (21. Aug 2019 um 09:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.330 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: TList Einträge fehlen

  Alt 21. Aug 2019, 10:03
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...
[OT]
Diese blöde Präfix. Bei mir gibt es keine globalen Variablen. Daher brauche ich das Präfix nicht.
[/OT]
Peter
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: TList Einträge fehlen

  Alt 21. Aug 2019, 10:19

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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
tumo

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

AW: TList Einträge fehlen

  Alt 21. Aug 2019, 11:59
@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 TPictureList[i].Bitmap einfach die .Graphic property nutze. Ich weiß zwar nicht, warum .Bitmap etwas am Bild ändern sollte, aber naja
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:34 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