Delphi-PRAXiS
Seite 2 von 2     12   

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)

mkinzler 3. Mär 2008 12:48

Re: Pobleme mit FREE (bzw. Destroy)
 
Wie sieht den TForm2 aus?

hoika 3. Mär 2008 12:55

Re: Pobleme mit FREE (bzw. Destroy)
 
Hallo,

in FastMM4Options.Inc die in der MessageBox gezeigten
Compiler-Schalter enabled ($define ..}

und noch mal:
Warum wir TForm2 erzeugt, aber nicht freigegeben ?
Das ist dein 1. mem leak .

Merke die Form-Variable global unbd guib sie wieder frei,
wenn du das nächste Fenster erzeugst.


Heiko

DeddyH 3. Mär 2008 12:56

Re: Pobleme mit FREE (bzw. Destroy)
 
Und GetFormImage erzeugt AFAIK auch bei jedem Aufruf eine neue Bitmap, die man wieder freigeben muss.

DoktorD 3. Mär 2008 13:05

Re: Pobleme mit FREE (bzw. Destroy)
 
Huch, gleich so viele antworten.

Zitat:

Zitat von mkinzler
Wie sieht den TForm2 aus?

Wenn ich Form2 mit Close schließe ist doch der Speicher frei gegeben, oder?

Delphi-Quellcode:
unit UntModalesFenster;

interface

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

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

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  Close;
end;

end.


Zitat:

Zitat von DeddyH
Und GetFormImage erzeugt AFAIK auch bei jedem Aufruf eine neue Bitmap, die man wieder freigeben muss.

Wie gebe ich den frei?

DeddyH 3. Mär 2008 13:07

Re: Pobleme mit FREE (bzw. Destroy)
 
Zitat:

Zitat von DoktorD
Wie gebe ich den frei?

Mit Free.
Delphi-Quellcode:
var bm: TBitmap;
begin
  bm := GetFormImage;
  try
    //irgendwas mit dem Bitmap machen
    ...
  finally
    bm.Free;
  end;
end;

mkinzler 3. Mär 2008 13:13

Re: Pobleme mit FREE (bzw. Destroy)
 
Zitat:

Wenn ich Form2 mit Close schließe ist doch der Speicher frei gegeben, oder?
Nein. das Formular wird nur geschlossen.

DoktorD 3. Mär 2008 13:23

Re: Pobleme mit FREE (bzw. Destroy)
 
Tatsächlich. Jetzt klappts. Super. Ich weiß aber immer noch nicht warum?

Hier erstmal der neue Code
Delphi-Quellcode:
procedure TFrmMain.Verschleiern(Status: Boolean);
var
  bm : TBitmap;
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;

    bm                              := self.GetFormImage;
    try
      ImageVerschleiern.Picture.Bitmap := bm;
    finally
      bm.Free;
    end;

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

    PanelVerschleiern.Show;
  end
  else
  begin
    PanelVerschleiern.Hide;
    FreeAndNil( ImageVerschleiern);
    FreeAndNil( PanelVerschleiern);
  end;
end;
Was ist denn nun der unterschied? Ob ich das Bitmap gleich zuordne, ...
Delphi-Quellcode:
ImageVerschleiern.Picture.Bitmap := self.GetFormImage;

...oder erst über eine neue Variable?
Delphi-Quellcode:
    bm                              := self.GetFormImage;
    try
      ImageVerschleiern.Picture.Bitmap := bm;
    finally
      bm.Free;
    end;

DeddyH 3. Mär 2008 13:30

Re: Pobleme mit FREE (bzw. Destroy)
 
Das sollte nur ein Beispiel sein. Eigentlich müsste es auch so gehen (ungetestet):
Delphi-Quellcode:
FreeAndNil(ImageVerschleiern.Picture.Bitmap);
Das natürlich, bevor Du das Image selbst freigibst.

DoktorD 3. Mär 2008 13:42

Re: Pobleme mit FREE (bzw. Destroy)
 
Das hatte ich so gemacht. Und da ging es nicht. Komisch

Trotzdem vielen Dank an alle!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz