PaintBox, Image et Memoire

Résolu
macpc Messages postés 12 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 2 juin 2006 - 25 août 2005 à 12:10
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008 - 27 août 2005 à 18:55
Bonjour,

J'ai un pb de libération de memoire après l'affichage de photo dans un paintBox, en effet l'affichage se passe très bien, mais lors de manipulation qui provoque le refresh, je regenere bien les images, mais la charge memoire augmente et ne rediminue jamais, alors qu'avec les fonctions de dessin de ligne ou texte tout se passe bien

J'utilise un PaintBox pour dessiner et afficher des images, suivant la procedure Paint.
Lors des refresh cette même procedure est appelée par l'eve OnPaint du paintbox pour rétablir le dessin.

Jusque la je n'ai pas de souci avec tout ce qui est dessiné ou ecrit avec les fonction lineto, moveto, rect, etc...

Mon pb apparait des que je veux afficher des images

Je vous livre un extrait allégé de mon code, en espérant que vous pourrez m'apporter une aide

<HR>
constructor TGraphTest.Create;
begin
inherited Create;
MonImage := TImage.Create(nil);
MonBitmap := TBitmap.Create;
PhotoIMG := TImage.Create(nil);
end;

destructor TGraphTest.Destroy;
begin
MonImage.Free;
MonBitmap.Free;
PhotoIMG.Free;
inherited Destroy;
end;

(****************** DESSSIN ***********************)
procedure TGraphTest.Paint(PaintBox: TPaintBox);
var
n: integer;
MonObj: TMonObj;
R: TRect;

begin
if dm.mavariable1 = 0 then
PaintBox.Canvas.Draw(0, 0, MonImage.Picture.Graphic)
else
begin
R.Left := fMonRect.Left;
R.Top := fMonRect.Top;
R.Right := fMonRect.Right;
R.Bottom := fMonRect.Bottom;
PaintBox.Canvas.StretchDraw(R, MonImage.Picture.Graphic);
end;

if dm.mavariable2 = 1 then
begin
MonBitmap.LoadFromFile(PathImages + '\' + dm.ImageName);
MonBitmap.Transparent := True;
MonBitmap.TransparentMode := tmAuto;
end;

for n := 0 to MonComteur do
begin
MonObj := TMonObj(fAll[n]);
// on insére une image
R := Rect(MonObj.A.X, MonObj.A.Y, MonObj.B.X, MonObj.B.Y);
PaintBox.Canvas.StretchDraw(R, MonBitmap);
end;

// insertion photo___________________________________________
if (dm.MaVariable3 = 1) then
begin
PhotoIMG.Picture.Bitmap.Assign(dm.doTrouvePhoto(MonObj.Cle));
R := Rect(MonObj.PlotPhotoA.X, MonObj.PlotPhotoA.Y,
MonObj.PlotPhotoB.X, MonObj.PlotPhotoB.Y);
PaintBox.Canvas.StretchDraw(R, PhotoIMG.Picture.graphic);
end;
end;
end;

<HR>

Bruno

8 réponses

neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
26 août 2005 à 07:43
Dans la ligne de code que j'ai cité tu récupère une instance de TJPEGImage que tu ne libère pas par la suite...

neodelphi
3
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
26 août 2005 à 17:04
C'es normal que tu ai des violations, car en fait si tu fait free, ta fonction va te renvoyer un objet qui n'est plus alloué, et donc dans la suite ça va merder.
Si tu veut que ça marche, il faut que tu récupère le résultat de ta fonction dans une variable au lieu de la passer directement en paramètre, et une fois que t'en ai servi, genre a la fin Paint, tu libère le contenu avec free.

neodelphi
3
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
25 août 2005 à 17:20
A priori je pense que ça viendrai de:
PhotoIMG.Picture.Bitmap.Assign(dm.doTrouvePhoto(MonObj.Cle));

Est-il possible de savoir ce qu'est exactement "dm", et en particulier sa méthode doTrouvePhoto ?

neodelphi
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
25 août 2005 à 17:22
A priori je pense que ça viendrai de:
PhotoIMG.Picture.Bitmap.Assign(dm.doTrouvePhoto(MonObj.Cle));

Est-il possible de savoir ce qu'est exactement "dm", et en particulier sa méthode doTrouvePhoto ?

neodelphi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
macpc Messages postés 12 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 2 juin 2006
25 août 2005 à 18:22
dm est un data module, et ca methode doTrouvePhoto est:

<HR>
function TDM.doTrouvePhoto(iClef: integer): TJPEGImage;
var
MS: TMemoryStream;
PhotoJPG: TJPEGImage;
begin
QPhoto.Close;
QPhoto.Params[0].AsInteger := iClef;


try
QPhoto.Open;


MS := TMemoryStream.Create;


PhotoJPG := TJPEGImage.Create;
(QPhotoMULTI_REDUITE as TBlobField).SaveToStream(MS);


QPhoto.Close;


MS.Position := 0;
result := nil;


if MS.Size > 0 then
begin
PhotoJPG.LoadFromStream(MS);
result := PhotoJPG;
end;
MS.Free;
//PhotoJPG.Free;
except
on E: EIBError do ShowMessage(E.Message);
end;
end;

<HR>

Bruno
0
macpc Messages postés 12 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 2 juin 2006
26 août 2005 à 12:44
C'est bien ca le problème, mais comment la libérée ou la créée,??

si je fais PhotoJPG.Free la où il est en commentaire, alors j'ai des violations
C'est peut être basique, mais je ne maitrise pas bien encore, les create et free
Merci de ton aide

Bruno
0
macpc Messages postés 12 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 2 juin 2006
26 août 2005 à 19:15
Merci neodelphi, je comprends mieux,
J'ai fait différemment: je crée la varaible PhotoJPG dans dmCreate et je la libère dans dm.Destroy, dm actif durant toute l'utilisation de l'appli
Mais je vais quand même testé ta solution

Bruno
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
27 août 2005 à 18:55
Oui ta solution est plus intelligente car tu inclu la gestion de la mémoire dans la classe dm et donc le reste du code n'a pas à s'en occupé. Tu évite également la duplication de code.

neodelphi
0
Rejoignez-nous