Corrélation entre les cordonnées d'une Image et celles d'un label dans un dessin
cs_damene
Messages postés9Date d'inscriptionlundi 2 février 2009StatutMembreDernière intervention 5 septembre 2010
-
20 avril 2009 à 20:40
cs_damene
Messages postés9Date d'inscriptionlundi 2 février 2009StatutMembreDernière intervention 5 septembre 2010
-
21 avril 2009 à 16:57
N'ayant jamais dessiné avec Delphi et de surcroît débutant je me suis fortement inspirer d'un Code Source pour dessiner écrit par hassan Id Ben Idder le 18/11/2004.
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.
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
Une autre solution consisterait à mettre le nom du noeud dans une image (Chose que je ne sais pas non plus faire)
var
FMain: TFMain;
Xi,Yi : integer;
TypeNoeud,Ki : String;
implementation
{$R *.dfm}
procedure TFMain.btHoriVertiClick(Sender: TObject);
begin
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.btEffaceEcranClick(Sender: TObject);
begin
canvas.Brush.Color:=clBtnText;
canvas.Rectangle(30,40,FMain.Width-30,FMain.Height-40);
end;
procedure TFMain.btNoeudClick(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.
A voir également:
Corrélation entre les cordonnées d'une Image et celles d'un label dans un dessin
cs_damene
Messages postés9Date d'inscriptionlundi 2 février 2009StatutMembreDernière intervention 5 septembre 2010 21 avril 2009 à 16:57
Merci pour votre réponse Juliodelphi.
Ce n'est pas du dessin que je fais exactement mais je visualise dynamiquement un réseau électrique.
En me faisant aidé par ailleurs, pour noter le nom des noeuds, je crée un autre Bitmap tout simplement. La procédure CreeNoeud(Xi,Yi : integer ;TypeNoeud : String ) devient alors :
procedure TFMain.CreeNoeud(Xi,Yi : integer ;TypeNoeud : String );
var Bitmap,Bitmap0 :TBitMap;
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);
finally
Bitmap.Free;
end;
Bitmap0 := TBitmap.Create;
FMain.Canvas.Font.Color:=clRed;
FMain.Canvas.Font.Style:=[fsBold];
FMain.Canvas.TextOut(Xi +5, Yi-15 -(Bitmap0.Height div 2) - Canvas.Font.Size, 'H'+Ki);
end;