Bonjour,
Je voudrais ajouter à une analyse de ventes tabulaire un graphe démonstratif et pour cela, j'ai essayé d'utilisé le canvas d'un Tpaintbox mais le schéma disparaît aussitôt crée, et c'est la même chose dans le canevas d'un Tlabel.
Bonjour,
Je voudrais ajouter à une analyse de ventes tabulaire un graphe démonstratif et pour cela, j'ai essayé d'utilisé le canvas d'un Tpaintbox mais le schéma disparaît aussitôt crée, et c'est la même chose dans le canevas d'un Tlabel.
le canvas est à l'écran ce que le crayon est au papier.
avec TPaintBox il faut utiliser le canvas dans l'évènement OnPaint, et l'image sera redessinée à chaque fois que nécessaire.
pour conserver le dessin, il faut utiliser le canvas d'un Bitmap et placer ce bitmap dans un TImage par exemple, dès lors le dessin devient persistant puisqu'il a été "imprimé" dans le Bitmap qui en garde le résultat en mémoire.
Bonjour,
ça ce n'est pas efficace parceque j'utilise le canvas pour créer un graphe on se basant sur le résultat d'une requête sql, et si je met la requête dans le onpaint alors là le nbre de fois ou le onpaint est appelé!avec TPaintBox il faut utiliser le canvas dans l’événement OnPaint, et l'image sera redessinée à chaque fois que nécessaire.
par contre
là c'est intéressant, maintenant je vai voir si on peut dessiner sur le canevas d'un Timage vide.
pour conserver le dessin, il faut utiliser le canvas d'un Bitmap et placer ce bitmap dans un TImage par exemple, dès lors le dessin devient persistant puisqu'il a été "imprimé" dans le Bitmap qui en garde le résultat en mémoire.
Il faut regarder le code des samples Embarcadero (moi j'ai Xe ) comme TGauge pour voir comment il faut faire.
Vcl.Samples.Gauges.TGauge
Il faut créer des TBitmap (en fonction des états par exemple) et les flush-er dans le OnPaint.
Moi j'ai testé et je ne suis arrivé à rien 1) Les primitives TCanvas restent trop lentes et le temps de création était assez conséquent 2) La gestion mémoire n'est pas terrible parce qu'il faut se trimballer des TBitmaps (création, initialisation et destruction, je travaille en C++)
Je suis passé à la bibliothèque TBitmap32 et avec un peu de temps je n'ai plus eu de problème
non, un TImage vide n'a pas de conteneur, si tu veux calculer ton image et la conserver, il faut la mettre dans un Bitmap
ensuite cette image peut être dessiner sur la fiche à la demande (ou sur un TPaintBox qui n'est qu'une sous-zone de son parent)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 var b: TBitmap; begin b := TBitmap.Create; b.SetSize(Width, Height); with b.Canvas do begin ... end; end;
on simplement placée dans un TImage qui se charger de l'afficher.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 procedure TForm1.OnPaint(Sender: TObject); begin Canvas.Draw(x, y, b); // évidement le Bitmap doit être déclaré dans la partie private de la fiche, créé dans le OnCreate, détruit dans le OnDestroy et rafraîchit à la demande end;
Bonjour,
J'ai modifier le code de cette manièreet ça marche mais un autre problème se pose , mais je vai l'exposer dans une autre discussion
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 procedure Tform1.button1click(sender); var img:Tbitmap; begin img:=tbitmap.create; /// execution du code sql ////dessiné dans le canevas du bitmap img.savetofile('grapghe.bmp'); gra.picture.loadfromfile('graphe.bmp'); end;
Bonjour,
ça sent quand même la fuite mémoire cette affaire !
et pourquoi ne pas utiliser un stream plutôt qu'un fichier sauvegardé sur disque ?
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
Bonjour à tous.
Evidemment, puisque le bitmap est créé, mais pas libéré (Img.Free).ça sent quand même la fuite mémoire cette affaire !
Et pourquoi faire compliqué quand on peut faire simple ?
Pas besoin de sauver dans un fichier ou un stream.
Simplement dessiner le bitmap sur le Canvas du TImage. Il faut savoir que, dans un TImage, toute modification de son Canvas est "mémorisée" dans un Bitmap.
Cordialement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 procedure TForm1.Button1Click(Sender: TObject); var MyBitmap: TBitmap; begin MyBitmap:= TBitmap.Create; try MyBitmap.SetSize(Image1.width, Image1.height); // exemple de dessin sur le bitmap with MyBitmap do begin Canvas.Brush.Color:= clYellow; Canvas.Rectangle(0,0,Width,Height); end; // affection au TImage Image1.Canvas.Draw(0,0,MyBitmap); finally MyBitmap.Free; end; end;
Thierry
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager