PaintBox, Image et Memoire [Résolu]

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

8 réponses

Répondre au sujet
neodelphi 442 Messages postés jeudi 4 avril 2002Date d'inscription 11 août 2008 Dernière intervention - 26 août 2005 à 07:43
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de neodelphi
neodelphi 442 Messages postés jeudi 4 avril 2002Date d'inscription 11 août 2008 Dernière intervention - 26 août 2005 à 17:04
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de neodelphi
neodelphi 442 Messages postés jeudi 4 avril 2002Date d'inscription 11 août 2008 Dernière intervention - 25 août 2005 à 17:20
0
Utile
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
neodelphi 442 Messages postés jeudi 4 avril 2002Date d'inscription 11 août 2008 Dernière intervention - 25 août 2005 à 17:22
0
Utile
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
macpc 12 Messages postés jeudi 9 octobre 2003Date d'inscription 2 juin 2006 Dernière intervention - 25 août 2005 à 18:22
0
Utile
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
macpc 12 Messages postés jeudi 9 octobre 2003Date d'inscription 2 juin 2006 Dernière intervention - 26 août 2005 à 12:44
0
Utile
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
macpc 12 Messages postés jeudi 9 octobre 2003Date d'inscription 2 juin 2006 Dernière intervention - 26 août 2005 à 19:15
0
Utile
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
neodelphi 442 Messages postés jeudi 4 avril 2002Date d'inscription 11 août 2008 Dernière intervention - 27 août 2005 à 18:55
0
Utile
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.