ich habe eine Frage zur ImageList:
In einer Anwendung verwende ich eine TDataModul um die global verwendeten
Komponenten für Datenbankzugriff und ImageList zu platzieren.
Das funktioniert soweit alles Bestens.
Jetzt habe ich aber versucht in den Compilereinstellungen den Schalter -gh zu
aktivieren um mögliche Memory-Leak zu finden.
Es werden mir sehr viele Error-Meldungen angezeigt:
---------------------------
Error
---------------------------
Heap dump by heaptrc unit of C:\Users\Service.exe
9513 memory blocks allocated : 1861927/1891040
9420 memory blocks freed : 1610476/1639464
93 unfreed memory blocks : 251451
True heap size : 1048576 (128 used in System startup)
True free heap : 789552
Should be : 790920
Call trace for block $00250C20 size 48
$0043D32C
$00556B3E
$0055174E
$005C9AE4
$00428656
$0041C02D
$0041A52A
$00420A5E
Call trace for block $001F64A0 size 92
$0067AF3D
$005C9B8C
$0043E28D
$0043E1B2
$00428644
$0041C02D
$0041A52A
$00420A5E
und so weiter ...
Ich habe herausgefunden, daß das Problem von der Komponente TimageList kommt.
Die Komponente habe ich ebenfalls auf mein TdataModul platziert und dies enthhällt folgenden Coden:
Code: Alles auswählen
unit uDM;
{$mode objfpc}{$H+}
interface
uses
Classes, sqldb, mysql55conn, Forms, Controls, UniqueInstance;
type
{ TuDM }
TuDM = class(TDataModule)
ImageList: TImageList;
mSqlTrans : TSQLTransaction;
mSQLConn : TMySQL55Connection;
mSqlQuery : TSQLQuery;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
private
public
property SqlConn : TMySQL55Connection read mSqlConn write mSqlConn;
property SqlQuery : TSQLQuery read mSqlQuery write mSqlQuery;
property SQLTrans : TSQLTransaction read mSqlTrans write mSqlTrans;
end;
var
gDM: TuDM;
implementation
{$R *.frm}
procedure TuDM.DataModuleCreate(Sender: TObject);
begin
ImageList := TImageList.Create(self);
mSqlConn := TMySQL55Connection.Create(self);
mSqlQuery := TSQLQuery.Create(self);
mSqlTrans := TSQLTransaction.Create(self);
end;
procedure TuDM.DataModuleDestroy(Sender: TObject);
begin
mSqlTrans.Free;
mSqlQuery.Free;
mSqlConn.Free;
ImageList.Free;
end;
end.
Wenn ich das ImageList entferne habe ich keinen Fehler mehr:
---------------------------
Error
---------------------------
Heap dump by heaptrc unit of C:\Users\Service.exe
8471 memory blocks allocated : 1278836/1305176
8471 memory blocks freed : 1278836/1305176
0 unfreed memory blocks : 0
True heap size : 327680 (128 used in System startup)
True free heap : 327552
Die Procedur DataModuleDestroy wird aufgerufen, das habe ich überprüft.
Könnte mir vielleicht jemand einen Hinweis geben, was ich da falsch mache?
Danke