Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Bilder zur Laufzeit generieren -> Fehler: EOutOfResources (https://www.delphipraxis.net/41637-bilder-zur-laufzeit-generieren-fehler-eoutofresources.html)

fuisch 6. Mär 2005 11:35


Bilder zur Laufzeit generieren -> Fehler: EOutOfResources
 
In meinem Programm sollen zu jeder Bilddatei, deren Adressen in der Stringliste Dateien gespeichert sind Vorschaubilder erzeugt werden. Bei wenigen Bildern geht das so wie es untem im Quellcode steht auch gut, wenn es jetzt aber mehr Bilder werden, bleibt das Programm irgendwann mit der Fehlermeldung "Project Project1.exe raised exception class EOutOfResources with message 'Der Parameter stimmt nicht.'.". hängen. Wie muss ich das mit den Bildern machen damit es funktioniert?
Delphi-Quellcode:
for n:= 0 to Dateien.Count - 1 do begin
      listbox1.items.add(extractfilename(Dateien[n]));
      if (n MOD 8 = 0) AND (n<>0) then begin
        reihe:=reihe+1;
        bildnummer:=0;
      end;
      Image[n]             := TImage.Create(Frame21);
      Image[n].Left        := bildnummer*95+8;
      Image[n].Top         := reihe*90+8;
      Image[n].Height      := 72;
      Image[n].width       := 87;
      Image[n].Parent      := Frame21;
      Image[n].Stretch     := true;
      Image[n].Proportional := true;
      Image[n].Picture.LoadFromFile(Dateien[n]);
      bildnummer:=bildnummer+1;
end;

sniper_w 6. Mär 2005 11:45

Re: Bilder zur Laufzeit generieren -> Fehler: EOutOfResou
 
Wie Gross ist eingentlich "Dateien.Count" ? Und wenn es um "Vorschaubilder" geht, warum nicht gleich auf Vorschaugrösse schrinken?(z.B. 20x20, oder 40x40..)

Rastaman 6. Mär 2005 11:46

Re: Bilder zur Laufzeit generieren -> Fehler: EOutOfResou
 
Delphi-Quellcode:
  private
    image: Array of TImage;
Hasst du das drin?
Und dann noch

Delphi-Quellcode:
  SetLength(image, Dateien.Count - 1)
Image ist ein Array und SetLength legt die Länge fest. Bau das mal ein.

fuisch 6. Mär 2005 12:02

Re: Bilder zur Laufzeit generieren -> Fehler: EOutOfResou
 
20x20 bzw. 40x40 halt ich für einiges zu klein, auf den Bildern soll man schon noch was erkennen.
Mit dem Array hab ich es bisher so gelöst, werde es jetzt umändern, so wie du es geschrieben hast:
Delphi-Quellcode:
Image : array [0..10000] of TImage;
Der Wert von Dateien.Count ist variabel, je nachdem welcher Ordner ausgewählt ist, enthält Dateien verschiedene Werte.

SirThornberry 6. Mär 2005 12:42

Re: Bilder zur Laufzeit generieren -> Fehler: EOutOfResou
 
ich hab den source nicht angeschaut aber ich hatte das problem mal als ich die höhe/breite kleiner 0 hatte.

Luckie 6. Mär 2005 12:57

Re: Bilder zur Laufzeit generieren -> Fehler: EOutOfResou
 
Welches Betriebssystem? Unter Windows 9x können schon mal recht schnell die Ressourcen knapp werden.

fuisch 6. Mär 2005 13:12

Re: Bilder zur Laufzeit generieren -> Fehler: EOutOfResou
 
Liste der Anhänge anzeigen (Anzahl: 1)
Windows 98 SE.
Nochmal das Problem:
Der Benutzer wählt einen Ordner aus. Dann soll für jedes Bild in dem Ordner ein Vorschaubild generiert werden. Wenn es jetzt zu viele Bilder sind und die Bilder auch noch relativ groß sind, bekomme ich, nachdem einige Vorschaubilder erzeugt wurden die Fehlermeldung.
Die Höhe/Breite der Bilder ist auf jeden Fall größer als 0.

Muetze1 6. Mär 2005 16:20

Re: Bilder zur Laufzeit generieren -> Fehler: EOutOfResou
 
Moin!

WIndows 98 SE hat einen beschränkten GDI Handle Pool von 128 KB - daher kann das OS maximal (128 * 1024 / 4) 32768 Handles für GDI Objekte vergeben. (oder waren die 128 KB erst ab ME?). Zumindest braucht eine TImage Instanz vom System schon allein derer 6 (mem dc, bitmap handle, bitmap canvas dc, bitmap canvas pen, bitmap canvas font, bitmap canvas brush) wodurch du sehr schnell in bredouille kommst. (der GDI Handle Pool ist global, also alle Applikation GDI + System GDI Handles)..

Empfehlung:
Nimm eine TImageList und setze dort die Höhe/Weite der gewünschten Vorschaubilder. Darin dann die !verkleinerten! Bilder ablegen und in der Dateianzeige keine TImage mehr instanziieren - selber malen. Einfach das Bild aus der TImageList holen und direkt dahin malen.

Ich habe mal eine klasse geschrieben die dieses Manko nach dem selben Prinzip wie eine TImageList (intern ein Bild) behebt und damit konnte ich eine Anwendung schreiben die dann mehrere Tausend Bitmaps laden und handeln konnte (bis 23.000 Bitmaps ausprobiert), da die Anwendung dies immer machen musste. Diese Klasse werde ich hier aber nicht veröffentlichen, daher nutze die TImageList oder bau dir nach dem selben Prinzip eine solche Klasse...

MfG
Muetze1

sniper_w 6. Mär 2005 17:04

Re: Bilder zur Laufzeit generieren -> Fehler: EOutOfResou
 
Zitat:

bitmap canvas pen, bitmap canvas font, bitmap canvas brush)
Ich glaube, Canvas hat einen ResourceMenager, so das nur VERSCHIEDENE Objekte einen neuen Platz im RAM(und somit auch HANDLE) bekommen. Oder ? :gruebel: Ich bin mir ziemlich sicher.


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