PaintBox, Image et Memoire [Résolu]

Messages postés
12
Date d'inscription
jeudi 9 octobre 2003
Dernière intervention
2 juin 2006
- - Dernière réponse : neodelphi
Messages postés
442
Date d'inscription
jeudi 4 avril 2002
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
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
442
Date d'inscription
jeudi 4 avril 2002
Dernière intervention
11 août 2008
3
Merci
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

Merci neodelphi 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de neodelphi
Messages postés
442
Date d'inscription
jeudi 4 avril 2002
Dernière intervention
11 août 2008
3
Merci
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

Merci neodelphi 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de neodelphi
Messages postés
442
Date d'inscription
jeudi 4 avril 2002
Dernière intervention
11 août 2008
0
Merci
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
Commenter la réponse de neodelphi
Messages postés
442
Date d'inscription
jeudi 4 avril 2002
Dernière intervention
11 août 2008
0
Merci
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
Commenter la réponse de neodelphi
Messages postés
12
Date d'inscription
jeudi 9 octobre 2003
Dernière intervention
2 juin 2006
0
Merci
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
Commenter la réponse de macpc
Messages postés
12
Date d'inscription
jeudi 9 octobre 2003
Dernière intervention
2 juin 2006
0
Merci
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
Commenter la réponse de macpc
Messages postés
12
Date d'inscription
jeudi 9 octobre 2003
Dernière intervention
2 juin 2006
0
Merci
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
Commenter la réponse de macpc
Messages postés
442
Date d'inscription
jeudi 4 avril 2002
Dernière intervention
11 août 2008
0
Merci
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
Commenter la réponse de neodelphi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.