Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bilddateien auf Vorrat laden für spätere Darstellung in TBitmap (https://www.delphipraxis.net/201967-bilddateien-auf-vorrat-laden-fuer-spaetere-darstellung-tbitmap.html)

mcmichael 14. Sep 2019 15:35

Bilddateien auf Vorrat laden für spätere Darstellung in TBitmap
 
Hallo liebe Experten,

ich schreibe eine VCL-Anwendung bei der TImages auf dem Form liegen und die
zur Laufzeit Bilddateien (bmp,jpg) nachladen. Beim Laden (Image1.picture.loadfromfile) kommt es leider gelegentlich zu
kleinen Hängern (z.B. stockt die akustische Ausgabe). Deshalb überlege ich, die Dateien zum Start des Programms in ein Array von TBitmaps
zu laden und die dann bei Bedarf über Assign in dem TImage darzustellen.
Dabei stosse ich aber laufend auf Probleme. Ich bin mit TImage und TBitmap nicht besonders versiert und kriege die
Dateien weder geladen und natürlich auch nicht dargestellt...

Erste Frage: Haltet ihr das für eine zielführende Möglichkeit um das Ruckeln zur Laufzeit loszuwerden?

Zweite: Was mache in den Prozeduren preloadImage und showImage falsch?
Übergeben wird der Dateiname in fname und das TImage.Picture.Bitmap welches auf der Form liegt.



Delphi-Quellcode:
var IC:Array [1..100] of TBitmap;
    icname:Array [1..100] of string;
    icmax:integer;




procedure preloadImage(fname:string);
var i,z:integer;
begin
if preload then
  begin
  //doubletten vermeiden
  z:=0;
  for i := 1 to icmax do
    if icname[i]=fname then
      begin
      z:=0;
      break;
      end;
  if z=0 then
    begin
    inc(icmax);
    IC[icmax]:=TBitmap.Create;
    IC[icmax].LoadFromFile(Folder_Images+fname);
    icname[icmax]:=fname;
    end;
  end;
end;


procedure showImage(t:TImage;fname:string);
var i,z:integer;
begin
if preload then
  begin
  z:=0;
  for i := 1 to icmax do
    if icname[i]=fname then
      begin
      z:=0;
      break;
      end;
  if z>0 then
    t.Picture.Bitmap.Assign(IC[z]);
  end
else
  begin
 //hier nur den regulären loadfromfile durchführen
  end;
end;

Schokohase 14. Sep 2019 15:42

AW: Bilddateien auf Vorrat laden für spätere Darstellung in TBitmap
 
Das mit dem Preload ist soweit vom Gedankengang ok.

Aber warum zwei Arrays mit dem ganzen Gewusel? Ein
Delphi-Quellcode:
TObjectDictionary<string,TBitmap>
ist da erheblich besser in diesem Fall.

Was funktioniert denn konkret nicht? Gibt es einen Fehler, wenn ja welchen?

jziersch 14. Sep 2019 18:48

AW: Bilddateien auf Vorrat laden für spätere Darstellung in TBitmap
 
Müsste es nicht
z:=1;

heissen innerhalb des Vergleichs?

Aber natürlich wäre ein Dictionary besser oder mit einer alten Delphi version eine TStringList mit objekten.

mcmichael 14. Sep 2019 19:10

AW: Bilddateien auf Vorrat laden für spätere Darstellung in TBitmap
 
:roll:
Zitat:

Müsste es nicht
z:=1;

heissen innerhalb des Vergleichs?
Danke für den Tipp!!!
mein :=0 war Quatsch, :=1 wäre auch falsch, aber :=i wäre es gewesen.
Und dann läuft auch (ein bißchen) was.

Beim Einlesen von jpg Dateien (trotz "uses jpeg") kommt nämlich die Meldung "Bitmap ist ungültig"
Das TImage liest jpg immer klaglos ein. Wie gehe ich denn da vor?

TObjectDictionary<string,TBitmap> kannte ich noch nicht, scheint aber einen Blick wert - Danke!

procedure preloadImage(fname:string);
var i,z:integer;
begin
if preload then
begin
//doubletten vermeiden
z:=0;
for i := 1 to icmax do
if icname[i]=fname then
begin
z:=i;
break;
end;
if z=0 then
begin
inc(icmax);
IC[icmax]:=TBitmap.Create;
IC[icmax].LoadFromFile(fname);
icname[icmax]:=fname;
end;
end;
end;


procedure showImage(t:TImage;fname:string);
var i,z:integer;
begin
if preload then
begin
z:=0;
for i := 1 to icmax do
if icname[i]=fname then
begin
z:=i;
break;
end;
if z>0 then
t.Picture.Bitmap.Assign(IC[z]);
end
else
begin
//kein preload - Direkt anzeigen
end;
end;

mcmichael 15. Sep 2019 06:34

AW: Bilddateien auf Vorrat laden für spätere Darstellung in TBitmap
 
Problem gelöst, auch jpgs laufen jetzt.
Vielen Dank für die Lösung der Gehirnbremse...


Delphi-Quellcode:
procedure preloadImage(fname:string);
var i,z:integer;
begin
if preload then
  begin
  //doubletten vermeiden
  z:=0;
  for i := 1 to icmax do
    if icname[i]=fname then
      begin
      z:=i;
      break;
      end;
  if z=0 then
    begin
    inc(icmax);
    with TPicture.Create do
      try
        IC[icmax]:=TBitmap.Create;
        LoadFromFile(fname);
        IC[icmax].Assign(Graphic);
        icname[icmax]:=fname;
      finally
        Free;
      end;
    icname[icmax]:=fname;
    end;
  end;
end;

haentschman 15. Sep 2019 06:44

AW: Bilddateien auf Vorrat laden für spätere Darstellung in TBitmap
 
Moin...8-)
Zitat:

Problem gelöst
...kann ich mir nicht vorstellen...du hast immer noch das with drin. :stupid:

Frickler 16. Sep 2019 09:45

AW: Bilddateien auf Vorrat laden für spätere Darstellung in TBitmap
 
Zitat:

Zitat von haentschman (Beitrag 1446209)
Moin...8-)
Zitat:

Problem gelöst
...kann ich mir nicht vorstellen...du hast immer noch das with drin. :stupid:

Jetzt wirds off topic...

Um with adäquat ablösen zu können, braucht man m.E. zwingend inline-Variablen. with verkürzt ja nicht nur den Ausdruck, sondern begrenzt auch den Scope. Eine prozedurglobale Variable macht das eben nicht.

Statt mit "with"
Delphi-Quellcode:
with TBla.Create, TControl(Controls[i]) do begin
  property1 := 1;
  property2 := Left;
end
schreibt man mit Inline-Variablen
Delphi-Quellcode:
begin
  var x := TBla.Create; var y := TControl(Controls[i]);
  x.property1 := 1;
  x.property2 := y.Left;
end
...und x sowie y gelten nur hier, nicht 10 Zeilen davor und nicht 20 Zeilen dahinter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:06 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