macpc
Messages postés12Date d'inscriptionjeudi 9 octobre 2003StatutMembreDernière intervention 2 juin 2006
-
25 août 2005 à 12:10
neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 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
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;
neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 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.
macpc
Messages postés12Date d'inscriptionjeudi 9 octobre 2003StatutMembreDerniè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;
macpc
Messages postés12Date d'inscriptionjeudi 9 octobre 2003StatutMembreDerniè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
macpc
Messages postés12Date d'inscriptionjeudi 9 octobre 2003StatutMembreDerniè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
neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 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.