IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Corrélation Coordonnées Image et Label


Sujet :

Delphi

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 167
    Par défaut Corrélation Coordonnées Image et Label
    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 : 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 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
    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.
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Voronoi sur image de label
    Par velkouby dans le forum Images
    Réponses: 1
    Dernier message: 13/11/2008, 19h46
  2. Coordonnés image en pixels dans Excel
    Par House MD dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/08/2008, 10h13
  3. Coordonnées image en pixels dans Excel
    Par ucfoutu dans le forum Contribuez
    Réponses: 0
    Dernier message: 19/06/2008, 08h29
  4. image et label - etirement
    Par Dragouf dans le forum Windows Forms
    Réponses: 11
    Dernier message: 08/10/2007, 17h22
  5. menuitem avec image et label.
    Par argon dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 31/10/2006, 11h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo