AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Fehlermeldung:Für diesen Befehl ist nicht genügend Speicher
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung:Für diesen Befehl ist nicht genügend Speicher

Ein Thema von meg91 · begonnen am 5. Sep 2006 · letzter Beitrag vom 6. Sep 2006
Antwort Antwort
Benutzerbild von meg91
meg91

Registriert seit: 25. Apr 2006
131 Beiträge
 
Turbo Delphi für Win32
 
#1

Fehlermeldung:Für diesen Befehl ist nicht genügend Speicher

  Alt 5. Sep 2006, 19:10
hi@all
ich hab ein Programm geschrieben, welches in regelmäßigen Abständen nen Screenshot macht und daraus die Durchschnitssfarbe berechnet
anschließend wird der eine Farbwert als RBG auf dem Com Port ausgegeben

am anfang funktioniert es auch wunderbar nur nach einiger Zeit kommt die Fehlermeldugn von Delphi:Für diesen Befehl ist nicht genügend Speicher verfügbar

hier mal mein Quelltext
Delphi-Quellcode:
procedure TForm1.ScreenToLine();
var
  Bitmap: TBitmap;
  Canvas: TCanvas;
  iFor, iFor2: LongInt;
  bRed, bGreen, bBlue: Byte;
  PixelColor: LongInt;
  bXgesRed, bXgesGreen, bXgesBlue: LongInt; //Duchschnittsfarben Horizontal
  bYgesRed, bYgesGreen, bYgesBlue: LongInt; //Duchschnittsfarben Vertikal
begin
  Canvas := TCanvas.Create;
  try
    Canvas.Handle := GetWindowDC(0);
    try
      Bitmap := TBitmap.Create;
      try
        Bitmap.Width := Screen.DesktopWidth;
        Bitmap.Height:= Screen.DesktopHeight;
        Bitmap.PixelFormat := pfDevice;

        BitBlt(Bitmap.Canvas.Handle, 0, 0, Pred(Screen.DesktopWidth), Pred(
            Screen.DesktopHeight), Canvas.Handle, Screen.DesktopLeft,
            Screen.DesktopTop, Bitmap.Canvas.CopyMode); //Screenshot machen

        bXgesBlue := 0;
        bXgesGreen := 0;
        bXgesRed := 0;
        for iFor := 0 to 20 do
        begin
          bYgesBlue := 0;
          bYgesGreen := 0;
          bYgesRed := 0;

          for iFor2 := 0 to 16 do
          begin
            //jeden 64-ten Pixel in der hotizontalen addieren
            PixelColor := ColorToRGB(Bitmap.Canvas.Pixels[(iFor * 64), (iFor2 * 64)]);
            bBlue := PixelColor;
            bGreen := PixelColor shr 8;
            bRed := PixelColor shr 16;

            bYgesBlue := bYgesBlue + bBlue;
            bYgesGreen := bYgesGreen + bGreen;
            bYgesRed := bYgesRed + bRed;

          end;
          bYgesBlue := StrToInt(FloatToStr(Round(bYgesBlue / 16)));
          bYgesGreen := StrToInt(FloatToStr(Round(bYgesGreen / 16)));
          bYgesRed := StrToInt(FloatToStr(Round(bYgesRed / 16)));

          bXgesBlue := bXgesBlue + bYgesBlue;
          bXgesGreen := bXgesGreen + bYgesGreen;
          bXgesRed := bXgesRed + bYgesRed;

        end;

        bXgesBlue := StrToInt(FloatToStr(Round(bXgesBlue / 20)));
        bXgesGreen := StrToInt(FloatToStr(Round(bXgesGreen / 20)));
        bXgesRed := StrToInt(FloatToStr(Round(bXgesRed / 20)));

        //Werte ausgeben
        TrackBar1.Position := bXgesRed;
        TrackBar2.Position := bXgesGreen;
        TrackBar3.Position := bXgesBlue;

        Application.ProcessMessages;
      finally
        Bitmap.Free;
        iFor := 0;
        iFor2 := 0;
        bRed := 0;
        bGreen := 0;
        bBlue := 0;
        PixelColor := 0;
        bXgesRed := 0;
        bXgesGreen := 0;
        bXgesBlue := 0;
        bYgesRed := 0;
        bYgesGreen := 0;
        bYgesBlue := 0;
        end;
    finally
      ReleaseDC(0, Canvas.Handle);
    end;
  finally
    Canvas.Free;
  end;
end;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Fehlermeldung:Für diesen Befehl ist nicht genügend Speic

  Alt 5. Sep 2006, 19:17
Ich würde die benötigten Objekte einmalig anlegen und dann wiederverwenden.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von meg91
meg91

Registriert seit: 25. Apr 2006
131 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Fehlermeldung:Für diesen Befehl ist nicht genügend Speic

  Alt 5. Sep 2006, 19:20
also die Bitmaps als globale variabelen?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Fehlermeldung:Für diesen Befehl ist nicht genügend Speic

  Alt 5. Sep 2006, 19:21
Und den Canvas auch.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von meg91
meg91

Registriert seit: 25. Apr 2006
131 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Fehlermeldung:Für diesen Befehl ist nicht genügend Speic

  Alt 5. Sep 2006, 19:26
ich hab das ganze mal getestet, aber dann geht gar nix mehr
warum auch immer
  Mit Zitat antworten Zitat
KrasserChecker

Registriert seit: 21. Jul 2004
120 Beiträge
 
#6

Re: Fehlermeldung:Für diesen Befehl ist nicht genügend Speic

  Alt 5. Sep 2006, 19:53
Lass doch mal das Canvas-Objekt weg. Das brauchst du doch gar nicht. Da dort auch das Handle verwendet wird, könnte ich mi gut vorstellen, dass dort auch (irgendwo) der Fehler liegt.

Delphi-Quellcode:
var TempDC: THandle;
...
TempDC := GetWindowDC(0);
try
  BitBlt(Bitmap.Canvas.Handle, 0, 0, Pred(Screen.DesktopWidth), Pred(
    Screen.DesktopHeight), TempDC, Screen.DesktopLeft,
    Screen.DesktopTop, SRCCOPY); //Screenshot machen
finally
  ReleaseDC(TempDC);
end;
...
Ach ja, und du brauchst im "finally"-Abschnitt nicht alle lokalen Variablen wieder auf 0 zu setzen. Freigeben lokal erzeugter Objekte (hier die Bitmap) reicht.
  Mit Zitat antworten Zitat
Benutzerbild von meg91
meg91

Registriert seit: 25. Apr 2006
131 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Fehlermeldung:Für diesen Befehl ist nicht genügend Speic

  Alt 5. Sep 2006, 20:01
ohne dem Canvas bekomm ich genau die gleiche Fehlermeldung wie am anfang
und das mit den Variabelen auf null war mein Lösungansatz zu den Abstürtzen
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#8

Re: Fehlermeldung:Für diesen Befehl ist nicht genügend Speic

  Alt 5. Sep 2006, 20:46
Hallo,

verwende mal folgende Routine. Hier wird kein Bitmap verwendet, sondern direkt vom Desktop gelesen. Außerdem habe ich diesen Blödsinn mit der Umwandlung in String und wieder zurück rausgeschmissen.
Delphi-Quellcode:
procedure TForm1.ScreenToLine;
var
  Handle: THandle;
  iFor, iFor2: Integer;
  bRed, bGreen, bBlue: Byte;
  PixelColor: Integer;
  bXgesRed, bXgesGreen, bXgesBlue: Integer; //Duchschnittsfarben Horizontal
  bYgesRed, bYgesGreen, bYgesBlue: Integer; //Duchschnittsfarben Vertikal
begin
  Handle := GetDC(0);
  try
    bXgesBlue := 0;
    bXgesGreen := 0;
    bXgesRed := 0;

    for iFor := 0 to 20 do
    begin
      bYgesBlue := 0;
      bYgesGreen := 0;
      bYgesRed := 0;

      for iFor2 := 0 to 16 do
      begin
        //jeden 64-ten Pixel in der Horizontalen addieren
        PixelColor := GetPixel(Handle, (iFor * 64), (iFor2 * 64));
        bBlue := PixelColor;
        bGreen := PixelColor shr 8;
        bRed := PixelColor shr 16;

        bYgesBlue := bYgesBlue + bBlue;
        bYgesGreen := bYgesGreen + bGreen;
        bYgesRed := bYgesRed + bRed;
      end;

      bYgesBlue := Round(bYgesBlue / 16);
      bYgesGreen := Round(bYgesGreen / 16);
      bYgesRed := Round(bYgesRed / 16);

      bXgesBlue := bXgesBlue + bYgesBlue;
      bXgesGreen := bXgesGreen + bYgesGreen;
      bXgesRed := bXgesRed + bYgesRed;
    end;

    bXgesBlue := Round(bXgesBlue / 20);
    bXgesGreen := Round(bXgesGreen / 20);
    bXgesRed := Round(bXgesRed / 20);

    //Werte ausgeben
    TrackBar1.Position := bXgesRed;
    TrackBar2.Position := bXgesGreen;
    TrackBar3.Position := bXgesBlue;

    Application.ProcessMessages;
  finally
    ReleaseDC(0, Handle);
  end;
end;
Das läuft bei mir ohne die geringsten Ressourcenlecks.

Übrigens: Mit Deinen Berechnungen (jeden 64. Pixel nehmen und daraus den Durchschnitt berechnen) bekommst Du keine wirkliche Durchschnittsfarbe des Desktops, sondern nur eine sehr grobe Näherung, die auch komplett falsch sein kann. Außerdem funktioniert Deine Methode nur bei der Auflösung von 1280x1024 (20 * 64 x 16 * 64).

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von meg91
meg91

Registriert seit: 25. Apr 2006
131 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Fehlermeldung:Für diesen Befehl ist nicht genügend Speic

  Alt 6. Sep 2006, 00:11
vielen Dank
endlich gehts super
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 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