Corrélation entre les cordonnées d'une Image et celles d'un label dans un dessin

cs_damene Messages postés 9 Date d'inscription lundi 2 février 2009 Statut Membre Dernière intervention 5 septembre 2010 - 20 avril 2009 à 20:40
cs_damene Messages postés 9 Date d'inscription lundi 2 février 2009 Statut Membre Derniè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)

Ne pouvez-vous pas m'orienter SVP.

Merci pour votre aide.

Voici mon Code:

unit Unit1;



interface



uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;



type
  TFMain = class(TForm)
    btHoriVerti: TButton;
    btEffaceEcran: TButton;
    btNoeud: TButton;
    procedure btHoriVertiClick(Sender: TObject);
    procedure btEffaceEcranClick(Sender: TObject);
    procedure btNoeudClick(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.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.

2 réponses

JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
20 avril 2009 à 21:21
Pour dessiner, utilise une boite à peindre ^^ : TPaintBox
0
cs_damene Messages postés 9 Date d'inscription lundi 2 février 2009 Statut Membre Derniè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;
0
Rejoignez-nous