Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Für diesen Befehl ist nicht genügend Speicher verfügbar

202 views
Skip to first unread message

Roland Reimann

unread,
Jan 17, 2011, 3:50:34 AM1/17/11
to
Hallo,

es handelt sich um eine MDI-Anwendung, bei der nach und nach ein
Dokument nach dem anderen geöffnet wird. Bei ca. 2 bis 20 geöffneten
Dokumenten (je nach Rechner) wird die Fehlermeldung 'Für diesen Befehl
ist nicht genügend Speicher verfügbar ' angezeigt.

Der Fehler kann mit der unten angehängten Minimalanwendung erzeugt
werden:
Das Hauptformular enthält einen Button und einen Zählerlabel, welcher
anzeigt wie oft bereits der Button gedrückt wurde. Je Button-Klick
wird ein relativ großes Image erzeugt und angezeigt.

Der Fehler tritt unter XP früher (z.B. je nach Rechner nur 2 Klicks),
unter Vista später (mehr Klicks, mehr Image Komponenten) auf.
Getestet wurde unter D2010.

Wo ist da die System-Begrenzung?
Gibt es eine Möglichkeit das Problem zu umgehen?

Gruß aus Aßlar
Roland


unit UMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm2 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form2: TForm2;
i : integer;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
Im : TImage;
begin
// TImage erzeugen :
Im := TImage.Create(self);

// Größe festlegen :
Im.width := 3000;
Im.height := 3000;

// Parent und Position festlegen :
Im.Parent := Self;
Im.Left := 0;
Im.Top := 100;

// Etwas draufzeichnen :
Im.Canvas.Rectangle(10,10,500,500);

// Zähler erhöhen und anzeigen :
inc(i);
Label1.Caption := IntToStr(i);
end;

end.

Arno Garrels

unread,
Jan 17, 2011, 5:30:28 AM1/17/11
to
Roland Reimann wrote:
> Der Fehler kann mit der unten angehängten Minimalanwendung erzeugt
> werden:

Google mal nach "GDIError EOutOfResources CopyBitmap".

DIB scheint hier die Lösung:

procedure TForm1.Button1Click(Sender: TObject);


var
Im : TImage;
begin
// TImage erzeugen :

Im := TImage.Create(Self);
Im.AutoSize := TRUE;


// Parent und Position festlegen :
Im.Parent := Self;
Im.Left := 0;
Im.Top := 100;

// Device independent bitmap
Im.Picture.Bitmap.PixelFormat := pf24bit;
Im.Picture.Bitmap.Width := 3000;
Im.Picture.Bitmap.Height := 3000;



// Etwas draufzeichnen :
Im.Canvas.Rectangle(10,10,500,500);

// Zähler erhöhen und anzeigen :
inc(i);
Label1.Caption := IntToStr(i);
end;

--
Arno Garrels

Roland Reimann

unread,
Jan 17, 2011, 7:56:30 AM1/17/11
to
Antwort auf eine Nachricht von "Arno Garrels"
<vornam...@nospamgmx.de> vom Mon, 17 Jan 2011 11:30:28 +0100 :

Hallo Arno,

>DIB scheint hier die L�sung:

DIB ist die L�sung!

Vielen Dank! Du hast mir sehr geholfen.

Gru� aus A�lar
Roland

Heiko Nocon

unread,
Jan 17, 2011, 11:19:20 AM1/17/11
to
Roland Reimann wrote:

>Wo ist da die System-Begrenzung?

Grafik-Resourcen. Jedes der Images verbraucht rund 30MB Grafikspeicher,
das ist (au锟絜r bei SharedMemory-Hardware) nicht der normale
Arbeitsspeicher, sondern der Teil des Speichers der Grafikkarte, der
auch von der CPU aus ansprechbar, also im PCI-IO-Bereich eingeblendet
ist.
Die Gr锟斤拷e dieses Speichers hat nix mit WXP vs. W7 zu tun, sondern mit
32Bit-OS vs. 64Bit-OS. Bei 32Bit-OS stehen f锟絩 alle PCI-Ger锟絫e zusammen
nur maximal 1GB Adressraum f锟絩 IO-Zwecke zur Verf锟絞ung, der allerdings
hardwarebedingt meist noch erheblich kleiner ausf锟絣lt und nat锟絩lich auch
nicht vollst锟絥dig f锟絩 den Graka-Speicher verf锟絞bar ist.

>Gibt es eine M锟絞lichkeit das Problem zu umgehen?

Ja. Grafikresourcen nur dann allozieren, wenn sie tats锟絚hlich ben锟絫igt
werden, d.h. im Extremfall: genau nur dann, wenn sie sichtbar sind oder
demn锟絚hst werden sollen. Grafikdaten f锟絩 den Rest der Zeit im normalen
Arbeitsspeicher halten, z.B. DIBs oder in MemoryStreams oder gar auf dem
Massenspeicher, wenn's auch im RAM eng wird.

--
Wer Komponenten ohne Quelltext oder richtig miese Komponenten
oder gute Komponenten mit Quelltext, ohne die Source zu verstehen, sich verschafft,
um sie in Form "eigener" Programme in Verkehr zu bringen,
der wird mit Gef锟絥gnis nicht unter 5 Jahren bestraft.

Roland Reimann

unread,
Jan 19, 2011, 3:33:56 AM1/19/11
to
Antwort auf eine Nachricht von Heiko Nocon <Heiko...@gmx.net> vom
Mon, 17 Jan 2011 17:19:20 +0100 :

Hallo Heiko,

>>Wo ist da die System-Begrenzung?

>Grafik-Resourcen. Jedes der Images verbraucht ...

vielen Dank für die interessanten Hintergrundinformationen!

Gruß aus Aßlar
Roland

0 new messages