Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Win32-Fehler. Code 87 Falscher Parameter (https://www.delphipraxis.net/113541-win32-fehler-code-87-falscher-parameter.html)

GuenterS 9. Mai 2008 15:22


Win32-Fehler. Code 87 Falscher Parameter
 
Hallo,

ich verwende Delphi5 Enterprise (Servicepack 1).

Ich lade in meiner Anwendung sehr viele Bitmaps, welche ich in einer ObjectList verwalte. Leider bekomme ich immer bei einer fixen Anzahl, auf meinem Laptop sind das 9961, einen Win32-Fehler. Code87 Falscher Parameter.

Die Googel Suche hat immer nur etwas übers Drucken gebracht.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  function nGetBitMap: Graphics.TBitMap;
  begin
    Result := Graphics.TBitMap.Create;
    Result.PixelFormat := pf4bit;
    Result.TransparentMode := tmAuto;
    Result.Transparent := true;
  end;
var
  lObjectList: TObjectList;
  lBitmap: Graphics.TBitMap;
  i, lCount: integer;
begin
  lObjectList := TObjectList.Create(true);
  try
     lCount := 9961;
     for i := 0 to lCount do
     begin
        lBitmap := nGetBitMap;
        lBitMap.LoadFromFile('c:\test.bmp');
        lObjectList.Add(lBitMap);
     end;
     ShowMessage('Ready');
  finally
     lObjectList.Free;
  end;
end;
Bei der Datei handelt es sich um eine kleine existierende Bitmap Datei (11x11 pixel).


Wie kann ich dieses Problem umgehen?


P.S.: Dieser Code stellt bei mir den Fehler nach, dh. er tritt mit diesem auch auf ... ich bin auch so erst an die genaue Anzahl gekommen.

Bernhard Geyer 9. Mai 2008 15:27

Re: Win32-Fehler. Code 87 Falscher Parameter
 
GDI-Ressourcen (und TBitmap verwendet solche) stellen auch unter XP/Vista eine begrenzte Ressource dar.
Du wirst wohl oder übel deine Programmlogik umstellen müssen.

GuenterS 12. Mai 2008 19:17

Re: Win32-Fehler. Code 87 Falscher Parameter
 
Ich hatte gehofft das Setzen eines Properties oder ähnliches könnte das Problem lösen....

Gibt es eine gleichwertige Komponente, welche nicht diese Resourcen aufbraucht?

Muetze1 12. Mai 2008 19:31

Re: Win32-Fehler. Code 87 Falscher Parameter
 
1. Wozu setzen von PixelFormat etc, wenn danach geladen wird? Damit nimmt das TBitmap doch eh die Werte der zu ladenen Datei an
2. Wozu soviele Bitmaps? Brauchst du wirklich alle gleichzeitig und kannst diese nicht nachladen (on demand)?
3. Eine andere Komponente die Bitmaps hält und keine GDI Resourcen verbraucht? Das wäre dann das on demand laden in Punkt 2.
4. Nutze eine TImageList. Diese hält alle Bitmaps auf einer grossen internen Bitmap. Voraussetzung: alle deine Bitmaps haben die gleiche Abmasse.
5. Falls deine Bitmaps unterschiedliche Grössen haben: schreib dir eine Klasse, welche die Bitmaps auf einigen internen Bitmaps optimal verteilt ablegen. Bei Gebraucht wird das nötige Bitmap herauskopiert. Genau eine solche Klasse habe ich entwickelt und meine Anwendung kommt ohne Probleme mit über 326.000 Bitmaps klar - und das unter Windows 98! (Die GDI Resourcen waren dort noch begrenzter).

Grundlegend muss dein Konzept und dein Code umgearbeitet werden, weil so ist es der falsche Weg bzw. Ansatz.

GuenterS 12. Mai 2008 20:14

Re: Win32-Fehler. Code 87 Falscher Parameter
 
Zitat:

Zitat von Muetze1
1. Wozu setzen von PixelFormat etc, wenn danach geladen wird? Damit nimmt das TBitmap doch eh die Werte der zu ladenen Datei an
2. Wozu soviele Bitmaps? Brauchst du wirklich alle gleichzeitig und kannst diese nicht nachladen (on demand)?
3. Eine andere Komponente die Bitmaps hält und keine GDI Resourcen verbraucht? Das wäre dann das on demand laden in Punkt 2.
4. Nutze eine TImageList. Diese hält alle Bitmaps auf einer grossen internen Bitmap. Voraussetzung: alle deine Bitmaps haben die gleiche Abmasse.
5. Falls deine Bitmaps unterschiedliche Grössen haben: schreib dir eine Klasse, welche die Bitmaps auf einigen internen Bitmaps optimal verteilt ablegen. Bei Gebraucht wird das nötige Bitmap herauskopiert. Genau eine solche Klasse habe ich entwickelt und meine Anwendung kommt ohne Probleme mit über 326.000 Bitmaps klar - und das unter Windows 98! (Die GDI Resourcen waren dort noch begrenzter).

Grundlegend muss dein Konzept und dein Code umgearbeitet werden, weil so ist es der falsche Weg bzw. Ansatz.

Es wird im Grunde aus einem Stream geladen, aus einer Datenbank, deshalb setze ich das Pixelformat vorher. Hab den Code für die Testprozedure da einfach nur übernommen.

Werde es wohl in dieser Art lösen und die Streams speichern. Dann sinds sicher deutlich weniger.


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