Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 500 images in ein Array einladen (https://www.delphipraxis.net/39099-500-images-ein-array-einladen.html)

alleinherrscher 28. Jan 2005 16:37


500 images in ein Array einladen
 
Hi! Habe folgendes Problem...

Möchte ca. 300-500 bilder nacheinander (per timer) auf dem bildschirm ausgeben. also so eine Art "Diashow" ganz wichtig ist jedoch, dass die bilder keine ladezeit oder so benötigen, jedenfalls nicht während der timer läuft, da sie auf die milisekunde genau angezeigt werden müssen.

Habe versucht, ein Array von TBitmaps zu erstellen und die Bilder direkt beim Start einzulesen, damit keine Zeit beim Einlesen der Bilder von der Festplatte zur Laufzeit des Timers entsteht, also praktisch alle Bilder schon in einem Array im Arbeitsspeicher vorliegen...bekomme aber immer eine Zugriffsverletzung im Speicher:

Jemand ne Idee?

Delphi-Quellcode:
var bild:array[1..500] of tbitmap;
   
//....

for i:= 1 to bildanzahl do

bild[i].LoadFromFile(bilddateiname[i]);

//....
Liebe Grüße, Alleinherrscher

Dax 28. Jan 2005 16:39

Re: 500 images in ein Array einladen
 
Erstmal
Delphi-Quellcode:
bild[i] := TBitmap.Create();
;-)

alcaeus 28. Jan 2005 16:40

Re: 500 images in ein Array einladen
 
Hallo Alleinherrscher,

zuerst musst du den einzelnen Arrayfeldern eine Instanz von TBitmap zuweisen:

Delphi-Quellcode:
bild[i] := TBitmap.Create;
bild[i].LoadFromFile(...);
Du solltest das Ganze natuerlich noch in einen Resourcenschutzblock setzen, da die 500 Bilder viel Platz benoetigen, und wenn irgendwas crasht dann gibt das ein schoenes Speicherleck...

Greetz
alcaeus

DelphiFreund 28. Jan 2005 16:40

Re: 500 images in ein Array einladen
 
Vielleicht greifst du irgendwie auf einen nil Wert zu oder beispielsweise auf Bild 501, schwer zusagen bei so wenig Text.


Gruß DelphiFreund

alleinherrscher 28. Jan 2005 16:55

Re: 500 images in ein Array einladen
 
Danke leute, ich bin echt doof :-( da hätte man auch selber drauf kommen können!

Was muss ich jetzt noch genau beachten,damit es bei 500 bildern keine überlastung gibt?

was ist ein "Resourcenschutzblock"@alcaeus

nochmals liebe Grüße!

SirThornberry 28. Jan 2005 16:58

Re: 500 images in ein Array einladen
 
ressourcenschutzblock heißt das du du mit "try"-"except", "try"-"finally" etc. arbeitest.

malo 28. Jan 2005 18:21

Re: 500 images in ein Array einladen
 
zu try.. except gibts in unserer Tutorialsparte sogar ein kleines Tutorial. Solltest du dir eventuell mal ansehen ;)

alleinherrscher 29. Jan 2005 14:05

Re: 500 images in ein Array einladen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke Leute! Soweit klappt alles, leider verstehe ich jetzt etwas beim timer nicht...
(ich hoffe, das darf noch in diesen Thread)

Also:

Der Timer soll 2 Funktionen haben:

1: Es sollen pro Minute 100 Bilder angezeigt werden.
2: Es sollen optional diese Bilder "eingeblendet werden" also immer weiter vergrößert werden

Hierzu habe ich folgendes überlegt:

Ich benutzte einen Timer mit dem Intervall "1" also eine Milisekunde

Zunächst wird die Dauer ermittelt, wie lange ein Bild angezeigt werden soll:

Delphi-Quellcode:
bilddauer:=60/strtoint(edit1.text);
bilddauer:=round(bilddauer*1000);
Bild dauer hat also nun die Zeit in Milisekunden gespeichert.


In dem Timer wird nun eine Variable hochgezählt:

Delphi-Quellcode:
inc(sleeper);

If sleeper=bilddauer then begin
    inc(nummer);
    image1.Picture.Graphic :=form1.bild[nummer];
end;

Ich könnte natürlich das Interval des Timers direkt auf Bilddauer setzten, allerdings habe ich dann ein problem mit dem einblenden von den bildern... dieses Einblenden soll genau 2*bilddauer entsprechen, das bild wird mit 50 Schritten immer weiter vergrößert:

Delphi-Quellcode:
if scrollen=True then
begin
image1.left:=round(image1.Left-form2.Width /strtoint(form1.edit3.text));
image1.Top:=round(image1.Top-form2.height /strtoint(form1.edit3.text));
image1.width:=round(image1.width+form2.Width / strtoint(form1.edit3.text) *2);
image1.Height:=round(image1.Height+form2.Height / strtoint(form1.edit3.text)*2);
image1.refresh;
end;
Allerdings habe ich bemerkt, dass der Timer nun viel zu langsam arbeitet, auch wenn bilder nicht vergrößert werden...jemand ne ahnung warum?

Khabarakh 29. Jan 2005 14:44

Re: 500 images in ein Array einladen
 
Du wirst nie einen Timer mit einem Intervall kleiner 15 (oder warens noch mehr ?) zum Laufen bringen, jede Millisekunde ein Aufruf brauchst du sicher nicht :wink: . Wenn ich es richtig verstanden habe, stellst du Inervall auf bilddauer, beim Scrollen wertest du nur jedes zweite Event aus.

Gandalfus 29. Jan 2005 15:28

Re: 500 images in ein Array einladen
 
timer tutorial


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