seba31stien
Messages postés51Date d'inscriptionlundi 13 juin 2005StatutMembreDernière intervention25 juillet 2006
-
10 mai 2006 à 11:45
seba31stien
Messages postés51Date d'inscriptionlundi 13 juin 2005StatutMembreDernière intervention25 juillet 2006
-
11 mai 2006 à 11:40
Bonjour,
dans mon appli, je charge une carte au format bitmap dans un paintbox.
Cependant, la procédure StretchDraw :
Paintbox1.canvas.StretchDraw(PaintBox1.ClientRect,BmpM); étire bien la
carte mais dès que je dessine sur cette carte, les positions sont aussi
étirées: plus je m'éloigne de la position (0,0), plus l'image que je déplace
s'éloigne de la souris alors qu'elle devrait être dessous.
J'ai opté pour la solution de redimensionner mon image avec paint, puis
de la charger sur mon appli. Cette solution n'étant que temporaire, je souhaiterias redimensionner cette image avec mon appli comme le permet paint
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 11 mai 2006 à 06:58
Bon alors là, ça coince.
@ Shining : ZeroMemory remet la memoire indéxée à zero (#0) mais ne libère pas la mémoire. C'est comme si tu faisait FillChar(CC, SizeOf(CC), 0). Je ne crios pas que ce soit ce que Sébastien recherche.
@ Sébastien : C'est pas Finalize(CC[I]) mais Finalize(CC[I].Bond)
En gros, cela donne :
{ Libération des éléments des tableaux "bond". }
for I : = 0 to High(CC) do Finalize(CC[I].Bond);
{ Libération du tableau CC. }
Finalize(CC);
Si tu ne te plantes pas ......
tu ne pousseras jamais
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 10 mai 2006 à 15:14
Alors, c'est toujours un problème quand on dessine sur un TPaintBox.
Enfin, avec un peu de méthode, on y arrive.
Tout d'abord, tu aurais du poster ce que tu as mis dans l'évenement OnPaint de ton PaintBox, ça aurait pu nous aider.
Ensuite, normalement, quand tu dessine sur un PaintBox, au prochain dessin, tu dois tout redessiner. tu devrais peut être passer pa un bimap temporaire avant de dessiner sur ton PaintBox.
A + pour un bout de code (met aussi l'évent OnMouveMove, OnMouseDown et OnMouseUp, mieux vaut plus que pas assez)
++
Si tu ne te plantes pas ......
tu ne pousseras jamais
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 10 mai 2006 à 15:51
Pour ton problème, je ne vois pas trop du fait que tu places des triangles sur ta carte (correspondants à des sites) que tu peux déplacer et aussi relier entre eux.
En plus, tu oublies de préciser que CC[x] contient aussi un array of Boolean à ce que je vois. Mais ça, c'est pas grave.
Le truc, c'est que tes procédures DessineCurseur() et Rafraichir_Liaisons() dessinent-elles directement dans le PaintBox ou alors dans le BmpM ??
Alors là, ça coince pour moi. Désolé.
Si tu ne te plantes pas ......
tu ne pousseras jamais
Vous n’avez pas trouvé la réponse que vous recherchez ?
Abadianet
Messages postés40Date d'inscriptionmercredi 2 novembre 2005StatutMembreDernière intervention19 juin 20061 10 mai 2006 à 16:08
Salut Seb,
Et si tu redimensionnais ton BMP avant, aurais-tu le même problème ?
Pour redimensionner un BMP, tu as plein d'exemples dans le forum.
Tu peux prendre le source de Pilot All posté dans les sources du site ou sur www.abadiane.net et voir dans l'unité UTools.pas la fonction ImageResizeToBMP
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 10 mai 2006 à 16:33
Ah, si tu dessines dans le BmpM, c'est normal que ça marche pas.
Car si ta souris est sur le pixel 100,100 de ton PaintBox, comme l'image qui est dedans est agrandie, cela correspond peut être au point 30,30 du BmpM. En gros, il faut appliquer le facteur de redimentionnement horisontal et vertical (calculé par la méthode StrctchDraw) et l'appliquer aux coordonées du curseur.
Bre, quel bazar.
Alors que si, dès le départ, tu as BmpM de la même taille que ton PaintBox, là, plus de problèmes.
Tu dois alors modifier ta procédure FormCrate comme suit :
procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
BmpTemp: TBitmap;
begin //
BmpTemp : = TBitmap.Create;
BmpTemp.LoadFromFile('C:\...carte_dept31__.bmp');
BmpM := TBitmap.Create;
BmpM.Width := PaintBox.Width;
BmpM.Height := PaintBox.Height;
BmpM.Canvas.StretchDraw(BmpM.Canvas.ClipRect, BmpTemp);
BmpTemp.Free;
end ;<hr size ="2" width= "100%">et ta procédure PaintBoxPaint comme ça :
begin
PaintBox.Canvas.Draw(0, 0, BmpM);
end; <hr size ="2" width="100%">
Si ça ne marche pas, dis nous ce qui cloche avec un maximum de détails.
++
Si tu ne te plantes pas ......
tu ne pousseras jamais
seba31stien
Messages postés51Date d'inscriptionlundi 13 juin 2005StatutMembreDernière intervention25 juillet 20061 10 mai 2006 à 16:48
merci florenth, ça marche impeccable mais lorsque je quitte l'appli,
j'ai violation d'accès ..; puis plein de messagedlg :' runtime error
216 at 00405E86'
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 10 mai 2006 à 17:06
Ah non, pas tout à fait.
Tu fais simplement
Finalize(CC);
Mais je ne suis pas sur que cela suffise.
Alors je pense qu'il faut aussi ajouter :
for I := 0 to High(CC) do
Finalize(CC[I].Bond);
"tu commences surement à comprendre que je suis vraiment débutant et sans formation de base"
Si tu es autodidacte (comme moi et une bonne partie des gens sur ce forum) c'est tout à fait compréhensible.
On ne sait jamais par quel bout commencer à apprendre et souvent, on commence par le compliqué en négligeant certaines bases essentielles.
Dur, dur d'être un codeur ^^
++
Si tu ne te plantes pas ......
tu ne pousseras jamais
seba31stien
Messages postés51Date d'inscriptionlundi 13 juin 2005StatutMembreDernière intervention25 juillet 20061 10 mai 2006 à 17:21
voici le code qui provoque toujours une violation d'accès et erreur 216 :
"
procedure TForm1.FormDestroy(Sender: TObject);
var
i :integer;
begin
BmpF.free; // destruction des bitmaps
BmpM.free; // quand on ferme la fiche
for I := 0 to High(CC) do
Finalize(CC[I]);
end;
"
si je ne mets pas le finalize et que je ferme l'appli sans avoir rien dessiné, alors pas de problème.
si je mets le finalize et que je ferme l'appli sans avoir rien dessiné, alors violation d'accès ... erreur 216
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 11 mai 2006 à 00:05
juste une petite précision...si CC est un array of TSite et qu'il est créer dynamiquement il faudra muliplié SizeOf(TSite) par la dimension du tableau cela va de soi !!!
seba31stien
Messages postés51Date d'inscriptionlundi 13 juin 2005StatutMembreDernière intervention25 juillet 20061 11 mai 2006 à 07:56
@florenth : j'ai bien mis cela dans le ondestroy de ma fiche, mais ça provoque toujours EAccessViolation et erreur 216 dès que je déplace un triangle. par contre, no problème si je ne déplace pas de triangle.
DELPHI m'indique que "Finalize(CC[I].Bond);" ne nécessite pas de Initialize/Finalize.
je ne sais pas comment essayer (dois je le faire ?) la proposition de shinning.
seba31stien
Messages postés51Date d'inscriptionlundi 13 juin 2005StatutMembreDernière intervention25 juillet 20061 11 mai 2006 à 08:15
le message EAccessviolation indique la dll ntdll.dll. j'ai fait une recherche sur google et sur commentçamarche.net, il est dit que c'est dû à un virus.
qu'en pensez vous ?