![]() |
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; |
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:
ist da erheblich besser in diesem Fall.
TObjectDictionary<string,TBitmap>
Was funktioniert denn konkret nicht? Gibt es einen Fehler, wenn ja welchen? |
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. |
AW: Bilddateien auf Vorrat laden für spätere Darstellung in TBitmap
:roll:
Zitat:
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; |
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; |
AW: Bilddateien auf Vorrat laden für spätere Darstellung in TBitmap
Moin...8-)
Zitat:
|
AW: Bilddateien auf Vorrat laden für spätere Darstellung in TBitmap
Zitat:
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:
schreibt man mit Inline-Variablen
with TBla.Create, TControl(Controls[i]) do begin
property1 := 1; property2 := Left; end
Delphi-Quellcode:
...und x sowie y gelten nur hier, nicht 10 Zeilen davor und nicht 20 Zeilen dahinter.
begin
var x := TBla.Create; var y := TControl(Controls[i]); x.property1 := 1; x.property2 := y.Left; end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:14 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