Ich möchte gerne forms in packages zur Verfügung stellen und diese dynamisch laden.
Jetzt habe ich festgestellt, dass der Speicher nicht mehr freigegeben wird (also auch bei leeren Forms ohne Nutzer-Interaktion oder Komponenten).
Wenn die Form angzeigt wird, werden ca. 300 byte nicht mehr freigegeben (vorausgesetzt, "memoryused" stimmt)
Was dagegen tun?
BPL mit Form:
Delphi-Quellcode:
Unit Gui.LoaderTestform;
{ This is a Test form
for loader to test for memory leaks }
Interface
Uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs;
Type
TTestform =
Class(TForm)
Private
{ Private declarations }
Public
{ Public declarations }
End;
Var
Testform: TTestform;
Implementation
{$R *.dfm}
Initialization
Registerclass(TTestform);
Finalization
Unregisterclass(TTestform);
End.
Hauptprgramm:
Form anzeigen, nachdem das
Package dynamisch geladen wurde:
Delphi-Quellcode:
Function Tplgfrm.Loadform(Parent: Tcomponent; Form:
String; Modal: Boolean)
: Boolean;
Var
FormClass: Tformclass;
Begin
Result := True;
Try
Form := '
T' + Form;
FormClass := TFormClass(GetClass(Form));
If FormClass =
Nil Then
Begin
Raise Exception.Create('
The form "' + Form + '
" is not available.');
Result :=
Not Result;
End
Else
Begin
With TComponentClass(FormClass).Create(Parent)
As TCustomForm
Do
Try
If Modal
Then
Showmodal
Else
Show;
Finally
// Free;
End;
End;
Except
Raise Exception.Create('
Form could not be loaded.');
Result :=
Not Result;
End;
End;
Den leak teste ich über die Differenz zweier Aufrufe folgender Funktion:
Delphi-Quellcode:
Function MemoryUsed: Cardinal;
Var
St: TMemoryManagerState;
Sb: TSmallBlockTypeState;
Begin
GetMemoryManagerState(St);
Result := St.TotalAllocatedMediumBlockSize +
St.TotalAllocatedLargeBlockSize;
For Sb In St.SmallBlockTypeStates Do
Begin
Result := Result + Sb.UseableBlockSize * Sb.AllocatedBlockCount;
End;
End;