Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Pobleme mit FREE (bzw. Destroy) (https://www.delphipraxis.net/109537-pobleme-mit-free-bzw-destroy.html)

DoktorD 3. Mär 2008 10:55


Pobleme mit FREE (bzw. Destroy)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi. Habe ein kleines Tool in dem ich ein Panel dynamisch erzeuge. In diesem Panel erzeuge ich ein Image.

Zur Laufzeit hole ich mir mit "self.GetFormImage" dann das aktuelle Bild der Form.

Funktion:
Ich will, wenn ich ein Fenster aufmache den Hintergrund verschleiern.

Das Funktioniert soweit ganz gut, aber nach dem ca. 47 maligen aufrufen des Fensters kommt die Fehlermeldung:

Exception-Klasse EOutOfResources mit Meldung 'Für diesen Befehl ist nicht genügend Speicher verfügbar.

Ich hab keine Ahnung wie ich den Fehler lokalisieren soll, bzw. ich weiß garnicht warum hier ein Fehler auftritt.


Delphi-Quellcode:
procedure TFrmMain.Button1Click(Sender: TObject);
var
  ModalesFenster: TForm2;
begin
  Verschleiern(TRUE);
  ModalesFenster := TForm2.Create(Self);
  ModalesFenster.ShowModal;
  Verschleiern(FALSE);
end;




procedure TFrmMain.Verschleiern(Status: Boolean);
begin
  if Status = TRUE then
  begin
    PanelVerschleiern               := TPanel.Create(nil);
    PanelVerschleiern.Parent        := FrmMain;
    PanelVerschleiern.Align         := alclient;
    PanelVerschleiern.Visible       := FALSE;
    PanelVerschleiern.BevelOuter    := bvNone;

    ImageVerschleiern               := TImage.Create(PanelVerschleiern);
    ImageVerschleiern.Parent        := PanelVerschleiern;
    ImageVerschleiern.Align         := alclient;
    ImageVerschleiern.Picture.Bitmap := self.GetFormImage;

    AlphaBlendRect(ImageVerschleiern.Canvas,PanelVerschleiern.ClientRect,clblack,80);

    PanelVerschleiern.Show;
  end
  else
  begin
    PanelVerschleiern.Hide;
    ImageVerschleiern.Free;
    PanelVerschleiern.Free;
  end;
end;




procedure TFrmMain.AlphaBlendRect (const aCanvas: TCanvas;
                                 const aRect: TRect;
                                 const aColor: TColor;
                                 const aIntensity: Byte);
var
  w, h       : Integer;
  Bitmap     : TBitmap;
  BlendParams : TBlendFunction;
begin
  w := Succ(aRect.Right - aRect.Left);
  h := Succ(aRect.Bottom - aRect.Top);
  Bitmap := TBitmap.Create;
  try
    Bitmap.Width := w;
    Bitmap.Height := h;
    Bitmap.Canvas.Brush.Color := ColorToRGB(aColor);
    Bitmap.Canvas.FillRect (Rect(0, 0, w, h));
    BlendParams.BlendOp := AC_SRC_OVER;
    BlendParams.BlendFlags := 0;
    BlendParams.SourceConstantAlpha := aIntensity;
    BlendParams.AlphaFormat := 0;
    Windows.AlphaBlend(aCanvas.Handle, aRect.Left, aRect.Top, w, h,
                       Bitmap.Canvas.Handle, 0, 0, w, h,
                       BlendParams);
  finally
    Bitmap.Free;
  end;
end;


Im Anhang ist das Projekt

mkinzler 3. Mär 2008 11:04

Re: Pobleme mit FREE (bzw. Destroy)
 
Versuch mal
Delphi-Quellcode:
FreeAndNil( ImageVerschleiern);
satt de, .Free
Auerdem erzeugst du ja in denem Button immer ein neues Fenster, welches du nicht mehr freigibst.

DoktorD 3. Mär 2008 11:11

Re: Pobleme mit FREE (bzw. Destroy)
 
Hab ich auch schon probiert. Das geht auch nicht. Ich bin jetzt soweit, dass ich meine, dass es nicht an den dynamisch erzeugten Objekten liegt (Panel, Image), sondern irgendwie an "self.GetFormImage"

Aber wo belegt das denn speicher? Oder wie könnte ich den freigeben?

Aurelius 3. Mär 2008 11:20

Re: Pobleme mit FREE (bzw. Destroy)
 
Ich denke dass es, wie mkinzler schon geschrieben hat, daran liegt, dass du das "ModaleFenster" wahrscheinlich nicht wieder freigibst...

Bernhard Geyer 3. Mär 2008 11:23

Re: Pobleme mit FREE (bzw. Destroy)
 
Binde doch mal FastMM ein und schau was der über deinen Code so zu berichten hat.

DoktorD 3. Mär 2008 11:24

Re: Pobleme mit FREE (bzw. Destroy)
 
Danke für den Tipp.

Aber was ist denn FastMM? Wo bekomme ich das her und wie binde ich das ein?

Aurelius 3. Mär 2008 11:25

Re: Pobleme mit FREE (bzw. Destroy)
 
http://sourceforge.net/projects/fastmm/

Das überwacht dein Delphiprogramm und sagt dir ob irgendwo Speicherlecks auftreten, weil du z.b. ein dyn. erzeutes Formular nicht wieder freigibst und dieses somit immer noch Arbeitspeicher belegt.

DoktorD 3. Mär 2008 11:42

Re: Pobleme mit FREE (bzw. Destroy)
 
Wie genau wird das denn eingebunden oder gestartet? Hab jetzt die deutsche Unit FastMM4 und FastMM4Messages dem Projekt hinzugefügt.
Aber irgedwas muss ich doch noch machen, oder?

Muetze1 3. Mär 2008 12:05

Re: Pobleme mit FREE (bzw. Destroy)
 
Am besten noch kontrollieren, dass FastMM4 als aller erste Unit in der DPR in der Uses Liste steht. Dann Programm aufrufen, arbeiten und beenden. Dann erhälst du eine entsprechende Liste.

DoktorD 3. Mär 2008 12:46

Re: Pobleme mit FREE (bzw. Destroy)
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, habs nun hinbekommen. Nur verstehe ich die Meldung nicht. Was bedeutet das denn?

Bild ist im Anhang


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52 Uhr.
Seite 1 von 2  1 2      

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