N'ayant jamais dessiné avec Delphi et de surcroît débutant je me suis fortement inspirer d'un Code Source pour dessiner.
Ce que je fais consiste à dessiner un schéma (électrique) dont les noeuds sont des images (Image propre à chaque type de noeud : Support, Appareil de Coupure, Poste etc.). Ces Informations je les récupère à partir d'une table.
Programme que j'avais écrit il y a très longtemps sous Clipper 5.
Pour me familiariser avec la procédure je fais le test avec un seul type de noeud (Une image quelconque) et je donne des noms différents aux noeuds.
Cette opération j'ai réussi à la faire.
Mais là où les choses se compliquent pour moi c'est lorsque je nomme ces noeuds (dans un label : Noeuds H1, H2, H3, H4).
je n'arrive pas à trouver la corrélation entre les coordonnées des Noeuds
(une Image) et celles du Text nom du Noeud (un label). Les noms sont inscrits très loin du Noeud.
Le nom du noeud devant être situé au dessus de l'image légérement décalé vers le droite (G1) pour permettre de titer des segments verticaux.
Voici mon code:
Code m'ayant inspiré :
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TFMain = class(TForm) btnHoriVerti: TButton; btnEffaceEcran: TButton; btnNoeud: TButton; procedure btnCourbeClick(Sender: TObject); procedure btnHoriVertiClick(Sender: TObject); procedure btnEffaceEcranClick(Sender: TObject); procedure btnNoeudClick(Sender: TObject); private { Déclarations privées } procedure CreeNoeud(Xi,Yi : integer ;TypeNoeud : String ); public { Déclarations publiques } end; var FMain: TFMain; Xi,Yi : integer; TypeNoeud,Ki : String; implementation {$R *.dfm} procedure TFMain.btnHoriVertiClick(Sender: TObject); begin {Appelle en premier FillRect pour peindre la surface de la fiche. Cela supprime les lignes précédemment dessinées (et rien d'autre!)} // Canvas.FillRect(ClientRect); canvas.Brush.Color:=clBtnText; canvas.Rectangle(30,40,FMain.Width-30,FMain.Height-40); Canvas.Pen.Color:=clYellow; Canvas.MoveTo(50 ,FMain.Height div 2); // Coordonnée de départ Hori Canvas.LineTo(FMain.Width-50 ,FMain.Height div 2); // Coordonnée d'arrivée Hori Canvas.MoveTo((FMain.Width div 2), FMain.Height div 2); // Coordonnée de départ Verti Canvas.LineTo((FMain.Width div 2), (FMain.Height div 2)+(FMain.Height div 2) div 2); // Coordonnée d'arrivée Verti end; procedure TFMain.CreeNoeud(Xi,Yi : integer ;TypeNoeud : String ); var Bitmap :TBitMap; NewLabel : TLabel; begin try Bitmap := TBitmap.Create; Bitmap.LoadFromFile(ExtractFilePath(Application.ExeName)+TypeNoeud); FMain.Canvas.Draw(Xi-(Bitmap.Width div 2),Yi-(Bitmap.Height div 2),BitMap); NewLabel := TLabel.Create(FMain); NewLabel.Color:=clBtnText; NewLabel.Font.Color:=clRed; NewLabel.Font.Style:=[fsBold]; NewLabel.Top := Xi-(Bitmap.Width div 2); // Abscice du nom NewLabel.Left := Yi-(Bitmap.Height div 2); // Ordonnée du nom NewLabel.Caption := 'H'+Ki; NewLabel.Parent := FMain; if Ki='1' then begin NewLabel := TLabel.Create(FMain); NewLabel.Color:=clBtnText; NewLabel.Font.Color:=clAqua; NewLabel.Font.Style:=[fsBold]; NewLabel.Caption := 'G1'; NewLabel.Top := 230; // Abscice du nom souhaitée NewLabel.Left := 60; // Ordonnée du nom souhaitée NewLabel.Parent := FMain; end; finally Bitmap.Free; end; end; procedure TFMain.btnEffaceEcranClick(Sender: TObject); begin canvas.Brush.Color:=clBtnText; canvas.Rectangle(30,40,FMain.Width-30,FMain.Height-40); end; procedure TFMain.btnNoeudClick(Sender: TObject); begin Xi:=50; Yi:=(FMain.Height div 2); TypeNoeud:='OK3.Bmp'; Ki:='1'; CreeNoeud(Xi,Yi,TypeNoeud); Xi:=(FMain.Width div 2); Yi:=(FMain.Height div 2); TypeNoeud:='OK3.Bmp'; Ki:='2'; CreeNoeud(Xi,Yi,TypeNoeud); Xi:=(FMain.Width-50); Yi:=(FMain.Height div 2); TypeNoeud:='OK3.Bmp'; Ki:='3'; CreeNoeud(Xi,Yi,TypeNoeud); Xi:=(FMain.Width div 2); Yi:=((FMain.Height div 2)+((FMain.Height div 2) div 2)); TypeNoeud:='OK3.Bmp'; Ki:='4'; CreeNoeud(Xi,Yi,TypeNoeud); end; end.
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 Function TFMain.f(X:Single):Single; // Cette procedure a été écrite par hassan Id Ben Idder begin Result:=Sin(X)-x*x*x; end; procedure TFMain.btnCourbeClick(Sender: TObject); // Cette procedure a été écrite par hassan Id Ben Idder {Soit x,y les coordonnees mathemathiques et Xi,Yi les coordonnees de la fiche on veut tracer la fonction sur un intervalle [-a,a]; x varie de -a à a et Xi varie de 0 à (form1.Width=W ) donc on affecte à Xi un coefficient de 2a/ W, l'origine de la fiche est en haut à gauche alors que l'origine mathematique est au centre donc on fait un decalage de w/2; x=(2a/W)*Xi-a Xi=(W/2a)*x+W/2 Yi=(-W/2/a*y + H/2) ; (H=form1.Height) pour prendre en compte les points ou la fonction n'est pas definit il suffit de bien gerer les exceptions. pour ameleorer ce programme ajouter un compilateur des expressiones mathematiques pour pouvoir saisir la fonction sous forme String dans un TEdit... hassan Id Ben Idder 18/11/2004 } var Xm,Ym : extended; {Coordonnées mathematiques} var Xi,Yi : integer; {coordonnées informatiques} var W,H : integer; var A:Extended; {Intervale des X} begin {Appelle en premier FillRect pour peindre la surface de la fiche. Cela supprime les lignes précédemment dessinées (et rien d'autre!)} Canvas.FillRect(ClientRect); A:=PI; {la fonction sera tracée sur l'intervale [-PI,PI]} W := ClientWidth; H := ClientHeight; for Xi := 0 to W do try {pour tenir compte des points où la fonction n'est pas definit} begin Xm := 2*A/W*Xi - A; Ym := f(Xm); Yi := round(-W/2/A*Ym + H/2); Canvas.Pixels[Xi,Yi] := clgreen; end; except end; {tracer les deux axes} Canvas.Pen.Color:=clred; Canvas.MoveTo(ClientWidth div 2,0); Canvas.LineTo(ClientWidth div 2,ClientHeight); Canvas.MoveTo(0,ClientHeight div 2); Canvas.LineTo(ClientWidth ,ClientHeight div 2); end;
Une autre solution consisterait à convertir de le nom du noeud dans une image (Chose que je ne sais pas non plus faire)
Ne pouvez-vous pas m'orienter SVP.
Merci pour votre aide.
Partager