Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Timages Ladezeiten (https://www.delphipraxis.net/151486-timages-ladezeiten.html)

Behemoph 19. Mai 2010 22:16


Timages Ladezeiten
 
Hallöchen Leute,
ich bräuchte dringend eure Hilfe :>

Mein Problem ist das folgende:

Und zwar möchte ich gerne jede Sekunde, nach einiger Zeit sogar in noch kleineren Intervallen, die Bilder von 55 dynamischen TImages gleichzeitig ändern.
Meine Überlegungen waren folgende:

Delphi-Quellcode:
for i:= 1 to 55 do
  begin
    if animation[i]=true then
    begin
      if i <= 11 then a[i].picture.loadfromfile('Bilder\invader1.jpg') else
       if i <= 33 then a[i].picture.loadfromfile('Bilder\invader5.jpg') else
        if i <= 55 then a[i].picture.loadfromfile('Bilder\invader3.jpg');
      animation[i]:=false;
    end else
    begin
      if i <= 11 then a[i].picture.loadfromfile('Bilder\invader2.jpg') else
       if i <= 33 then a[i].picture.loadfromfile('Bilder\invader6.jpg') else
        if i <= 55 then a[i].picture.loadfromfile('Bilder\invader4.jpg');
      animation[i]:=true;
    end;
  end;

Das funktioniert zwar, jedoch bleibt die gesamte Anwendung, beim Laden der Bilder, für den Bruchteil einer Sekunde stehen, was sehr unschön ist :/
Könnt ihr mir verraten, wie ich die Ladezeiten verkürzen kann? Oder das Problem vielleicht ganz anders lösen kann? :)

mfg Behemoph

Tryer 19. Mai 2010 22:31

Re: Timages Ladezeiten
 
Alle Bilder von vornherein in eine ImageList? Geht natürlich nur bei gleicher Größe.Sonst trotzdem vorher laden und in Liste/Array of TBitmap o.ä. ablegen.

Grüsse, Dirk

Behemoph 19. Mai 2010 22:40

Re: Timages Ladezeiten
 
Danke für die schnelle Antwort. Die Bilder sind größtenteils gleich groß. Vllt geht es auch mit 2 Imagelists.. Dazu müsste ich nur wissen, wie ich das realisieren kann, wenn du meinst, dass das was ausmachen würde ;)

mfg Behemoph

s.h.a.r.k 19. Mai 2010 22:49

Re: Timages Ladezeiten
 
Du kannst Threads nutzen, die die Bilder im Hintergrund laden. Dabei bleibt deine Anwendung bedienbar. Ist aber etwas komplexer.

Was ich mir noch vorstellen könnte, wäre das vorherige Laden aller Bilder, wie schon angesprochen. Oder auch, wie im Web ab und zu verwendet, dass man alle Bilder in ein Bild wirft und somit nicht 55 Bilder laden muss, sondern nur eines, welches man dann entsprechend zu verarbeiten hat.

Behemoph 19. Mai 2010 23:14

Re: Timages Ladezeiten
 
Auch dir ein Dankeschön :)
Werde dann wohl zur Timagelist-Methode greifen. Nur.. Wie bekomme ich die 110 Bilder(jpegs) da in solche listen rein und wie rufe ich die richtigen zum richtigen zeitpunkt auf?

s.h.a.r.k 19. Mai 2010 23:22

Re: Timages Ladezeiten
 
Du kannst diese schon zur Entwicklungszeit ins Programm laden, wenn du willst. Setze eine TImageList auf die Form und mache einen Doppelklick darauf.

Behemoph 19. Mai 2010 23:46

Re: Timages Ladezeiten
 
Aaaaah, alles klar, danke dir ;)

also.. hab jetzt mal zu testzwecken ne imagelist1 aufs formular gesetzt und bei formcreate reingeschrieben:

Delphi-Quellcode:
for i:= 1 to 55 do
begin
        a[i]:=tbitmap.create;
        a[i].LoadFromFile('bilder\invader1.bmp');
        imagelist1.Add(a[i],nil);
        a[i].free;
end;
a[i] ist ein array of tbitmap.

Es lässt sich soweit schonmal ohne Fehler kompilieren.. stellt sich mir nurnoch die Frage, wie ich dann die Bilder da wieder rauskriege :>
Also mein Ziel war es ja, die Bilder, mit Hilfe eines Timers, abwechselnd darzustellen.

s.h.a.r.k 19. Mai 2010 23:50

Re: Timages Ladezeiten
 
*autsch* was schreibst du denn für Code? :zwinker: erzeug doch einfach nur einmal ein image und lade da jedes mal das bitmap rein.

Delphi-Quellcode:
image := TBitmap.Create();
try
  for i:= 1 to 55 do
  begin
    image.LoadFromFile('bilder\invader1.bmp');
    Imagelist1.Add(image, nil);
  end;
finally
  FreeAndNil(image);
end;

// so kann es es in einem image anzeigen
var
  image : TBitmap;
begin
  image := TBitmap.Create();
  try
    if (ImageList1.GetBitmap(0, image) ) then
      Image1.Picture.Bitmap.Assign(image);
  finally
    FreeAndNil(image);
  end;
end;

Behemoph 20. Mai 2010 00:57

Re: Timages Ladezeiten
 
Okidoki, es läuft.. glaub ich :)

Das letzte Problem ist jetzt allerdings, dass die Bilder viel zu groß sind und mein vorheriges
Delphi-Quellcode:
stretch:=true
irgendwie nicht mehr gültig ist.

Jedenfalls wird nur ein kleiner Teil des viel zu großen Bildes angezeigt :/

mfg Behemoph

BUG 20. Mai 2010 05:30

Re: Timages Ladezeiten
 
Es gibt einen dummen Fehler, der mir immer passiert wenn ich eine Imagelist benutze :mrgreen:

Sind die Eigenschaften height und width der Imagelist auf die richtige Größe eingestellt?

hoika 20. Mai 2010 07:06

Re: Timages Ladezeiten
 
Hallo,

noch ne Anmerkung.

Neben LoadFromFile gibt es auch LoadFromStream.
Damit kann ich auch verschieden grosse Bilder verwalten.


Heiko

Behemoph 20. Mai 2010 12:42

Re: Timages Ladezeiten
 
Guten Morgen..
Hab es jetzt mal mit loadfromstream versucht.. das bild sieht ein wenig anders aus, ist jedoch trotzdem nicht in der richtigen größe :(
Hab es so gemacht:

Delphi-Quellcode:
ms:TMemoryStream;
...
ms := TMemoryStream.Create;
try
  for i:= 1 to 55 do
  begin
    image.LoadFromFile('bilder\invader1.bmp');
    image.SaveToStream(ms);
  end;
  finally
  FreeAndNil(image);
end;
und dann im timer zum aufrufen:

Delphi-Quellcode:
 for i:= 1 to 11 do
 begin
  image := TBitmap.Create();
  try
  a[i].Picture.Bitmap.LoadFromStream(ms);
  finally
  FreeAndNil(image);
  end;
 end;
Und kann es sein, dass .stretch bei bitmaps nicht funktioniert? Hmm.. verzweifle hier noch :/

/edit
Ok, weiß nicht was da schief gelaufen ist.. es funktioniert doch nicht :x. Es kommt zwar kein Fehler, allerdings ist kein Bild zu sehen.. :( :cry:

Behemoph 20. Mai 2010 14:54

Re: Timages Ladezeiten
 
Erstmal ein Sry wegen des doppelpostes, aber habs jetzt einigermaßen hinbekommen :oops:..
Habe die verschiedenen Bilder schon zur entwicklungszeit in die imagelist geladen und rufe sie dann per timer ab. Die Bilder haben alle die richtige größe aber..
Irgendwie verunstaltet die Imagelist meine Bilder total.
Wenn ich die Imagelist doppelklicke und da dann ein Bmp reinlade, sieht das auch schon in der Vorschau total anders aus. Krumm und schief und total unscharf :/
Kann man dem irgendwie Abhilfe schaffen? :>

Blup 21. Mai 2010 08:21

Re: Timages Ladezeiten
 
Hier habe ich u.a. beschrieben wie man eine Liste von Bildern laden kann:
http://www.delphipraxis.net/internal...t.php?t=131850

Die Bilder können dann jederzeit irgend einem Image zugewiesen werden.
Delphi-Quellcode:
Image.Picture.Assign(TPicture(FBilder[i]))

hoika 21. Mai 2010 09:32

Re: Timages Ladezeiten
 
Hallo,

Zitat:

Krumm und schief und total unscharf
1. Welche Auflösung haben die Bilder ?
2. Wie sind Height und Width der ImageList gesetzt ?
3. Wie sind Height und Width der TImages gesetzt ?



Heiko

Behemoph 21. Mai 2010 17:12

Re: Timages Ladezeiten
 
Danke an Euch alle :)
Habs nun hinbekommen.. Das Problem war, dass Höhe und Breite der Imagelist einfach zu klein waren für die Bilder :>

Jetzt läuft alles, kein ruckeln mehr und ja.. Thread kann wohl geschlossen werden :)
Danke schööön

mfg Behemoph


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