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

Langage Delphi Discussion :

Comment dessiner lignes entre des fenêtres ?


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut Comment dessiner lignes entre des fenêtres ?
    Bonjour,
    je suis à la recherche d'un exemple graphic qui permet de relier des forms par des lignes. genre lignes de relations dans certaines fenêtres de Sql graphique ou bien celles de la fenêtre de relations d'Access. Est ce que quelqu'un s'est déjà penché sur ce type d'éxercice? Avez vous un lien de tuto à m'indiquer? J'ai fait F1, FAQ, Google mais nada
    d'avance merci pour votre aide
    Cordialement,
    Hauwke

  2. #2
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Oui, moi aussi je me suis souvent posé la question :
    En fait, c'est le système qui relie (on va dire) 2 rectangles avec une ligne en 1 ou trois segments (2 horizontaux et un vertical), non ?

    Peut-être faudrait tu que tu commence tes investigations ici (pour la ligne le segment de ligne vertical du milieu) :
    http://www.efg2.com/Lab/Library/Graphics/LineStretch.htm

    Ensuite pour les segments horizontaux, le tout, c'est de savoir vers où les faire partir (vers la gauche ou la droite), leur longueur minimale, quand ils partent des rectangles tout les deux vers la droite ou tout les deux vers la gauche.

    Enfin, tu as trois cas à considérer selon la position de tes rectangles (forms). Soient left1,right1,top1 et bottom1 les bords de ton premier rectangle, et left2, etc pour les bords de ton second rectangle :
    - right1<left2
    - right2<left1
    - ni l'un ni l'autre (les rectangles sont l'un au dessus de l'autre).

    De plus, il faudra que tu gère une liste des lignes si tu en a plusieurs.

    Bon courage
    Bidouilleuse Delphi

  3. #3
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    748
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 748
    Points : 500
    Points
    500
    Par défaut
    Si je comprends bien tu veux dessiner a l'exterieur de tes form ?
    Donc sur le bureau ou sur une application qui se trouverait " sous" tes forms ?
    Est ce bien cela ?
    bye
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  4. #4
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut
    Bonjour,
    Citation Envoyé par Wascol
    Peut-être faudrait tu que tu commence tes investigations ici (pour la ligne le segment de ligne vertical du milieu) :
    http://www.efg2.com/Lab/Library/Graphics/LineStretch.htm
    Je suis déjà passé par ce site, merci pour ça.
    Pour les lignes, je pense qu'il n'y aura pas trop de probléme. Les positions de départ et d'arrivée sont fournies par le chemin de la souris de l'utilisateur. En prenant mon conteneur comme point de référence absolue, j'ai P1(X, Y); P2(X1, Y1). J'aurai deux transformations pour amener ces deux vecteurs plan dans les référentiels relatifs des deux forms à relier= P1'(X',Y'); P2'(X1', Y1') et le calcul d'un Cosinus^-1 pour l'angle. La distance entre les deux si besoin était= ((X2-X1)^2+(Y2-Y1)^2)^-2. Tant que les forms restent statiques, pas de gros problème à gérer mais j'ai le sentiment que dés que les choses deviennent dynamiques; que les forms vont se déplacer; les choses vont se corser sévérement.
    Citation Envoyé par Wascol
    De plus, il faudra que tu gère une liste des lignes si tu en a plusieurs.
    Bon courage
    La seule solution que je vois, sur le moment, est de gérer des tableaux de coordonnées!Effectivement!
    Avec deux forms ça reste acceptable mais avec 10, 20, 50? J'ai l'impression d'utiliser une bombe H pour attaquer un moustique! D'où mon post...
    Citation Envoyé par petitcoucou31
    Si je comprends bien tu veux dessiner a l'exterieur de tes form ?
    Donc sur le bureau ou sur une application qui se trouverait " sous" tes forms ?
    Est ce bien cela ?
    Oui, c'est celà. Avoir une form conteneur et dessiner des lignes entre des forms contenues. De la façon la plus simple, celà va sans dire...
    Je reste, donc, à l'écoute de toute suggestion simplificatrice...
    Cordialement,
    Hauwke

  5. #5
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Hauwke
    Tant que les forms restent statiques, pas de gros problème à gérer mais j'ai le sentiment que dés que les choses deviennent dynamiques;
    Je te rassure, ce n'est pas qu'un sentiment !

    Citation Envoyé par Hauwke
    La seule solution que je vois, sur le moment, est de gérer des tableaux de coordonnées!
    En fait, tu n'as qu'une coordonnée : la position en X de ton segment vertical

    Citation Envoyé par Hauwke
    J'ai l'impression d'utiliser une bombe H pour attaquer un moustique! D'où mon post...
    Tout à fait d'accord avec toi, mais sinon je ne vois pas comment faire...

    Sinon, pour un début, dans la JVCL, tu peux fouiller dans le code du TJvSIMConnector (onglet JV Jans SIM dans la palette de composants) , ça te donnera paut-être des idées.
    Bidouilleuse Delphi

  6. #6
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Tiens voici un exemple :
    J'ai utilisé la JVCL pour avoir le composant TJVCaptionPanel.

    Dans l'unité "Main" j'ai une fiche avec un bouton (en haut a droite) et un PaintBox (Align=alclient) :

    Unité MAIN :
    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
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
     
    unit MAIN;
     
    interface
     
    uses Windows, SysUtils, Classes, Graphics, Forms, Controls, 
      StdCtrls, Dialogs, Messages, ExtCtrls, ChildPanel,JvCaptionPanel;
     
    type
      TConnector=class(TComponent)
      private
        FFromPanel: TMyPanel;
        FToPanel: TMyPanel;
        procedure SetFromPanel(const Value: TMyPanel);
        procedure SetToPanel(const Value: TMyPanel);
      public
        constructor Create(AOwner:TComponent); override;
        destructor Destroy; override;
        procedure DrawLine(ACanvas:TCanvas);
      published
        property FromPanel:TMyPanel read FFromPanel write SetFromPanel;
        property ToPanel:TMyPanel read FToPanel write SetToPanel;
      end;
     
      TMainForm = class(TForm)
        ButtonNewForm: TButton;
        PaintBox1: TPaintBox;
        procedure ButtonClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure PaintBox1Paint(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { déclarations privées }
         procedure CreatePanelChild(const Name: string);
      public
        { déclarations publiques }
        CurrentFrom:TMyPanel;
        PanelChildCount:Integer;
      end;
     
    var
      MainForm: TMainForm;
     
    implementation
    {$R *.dfm}
     
    procedure TMainForm.CreatePanelChild(const Name: string);
    var
      Child: TJvCaptionpanel;
    begin
      { crée une nouvelle fenêtre Panel enfant }
     
      Child := TMyPanel.Create(self);
      Child.Parent:=Self;
      Child.Caption := Name;
      Child.CaptionFont.Name:='Arial';
      Child.Buttons:=[capClose];
      Child.Width:=150;
      Child.Height:=150;
    end;
     
    procedure TMainForm.ButtonClick(Sender: TObject);
     
    begin
      Inc(PanelChildCount);
      CreatePanelChild('NONAME' + IntToStr(PanelChildCount));
    end;
     
    { TConnector }
     
    constructor TConnector.Create(AOwner: TComponent);
    begin
      inherited;
      FFromPanel:=nil;
      FToPanel:=nil;
    end;
     
    destructor TConnector.Destroy;
    begin
      inherited;
      FFromPanel:=nil;
      FToPanel:=nil;
    end;
     
    procedure TConnector.DrawLine(ACanvas:TCanvas);
    var X1,Y1,X2,Y2:Integer;
    begin
      if ((FToPanel=nil) or  (FFromPanel=nil)) then Exit;
      with ACanvas do
      begin
        Pen.Color:=clRed;
        Pen.Width:=2;
        X1:=FFromPanel.Left+FFromPanel.Width div 2;
        Y1:=FFromPanel.Top+FFromPanel.Height div 2;
        X2:=FToPanel.Left+FToPanel.Width div 2;
        Y2:=FToPanel.Top+FToPanel.Height div 2;
        MoveTo(X1,Y1);
        LineTo(X2,Y2);
      end;
    end;
     
    procedure TConnector.SetFromPanel(const Value: TMyPanel);
    begin
      FFromPanel := Value;
    end;
     
    procedure TConnector.SetToPanel(const Value: TMyPanel);
    begin
      FToPanel := Value;
    end;
     
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
      CurrentFrom:=nil;
      PanelChildCount:=0;
    end;
     
    procedure TMainForm.PaintBox1Paint(Sender: TObject);
    var i:Integer;
        AConnector:TConnector;
    begin
      if MainForm.ComponentCount>0 then
      for i:=MainForm.ComponentCount-1 downto 0 do
      if (MainForm.Components[i] is TMyPanel) then
      begin
        if not (MainForm.Components[i] as TMyPanel).Visible then
        (MainForm.Components[i] as TMyPanel).Free;
      end;
      if MainForm.ComponentCount>0 then
      for i:=0 to MainForm.ComponentCount-1 do
      if (MainForm.Components[i] is TConnector) then
      begin
        AConnector:=(MainForm.Components[i] as TConnector);
        AConnector.DrawLine(PaintBox1.Canvas);
      end;
     
    end;
     
    procedure TMainForm.FormDestroy(Sender: TObject);
    var i:Integer;
        AConnector:TConnector;
    begin
      if ComponentCount>0 then
      for i:=0 to MainForm.ComponentCount-1 do
      if (Components[i] is TConnector) then
      begin
        AConnector:=(Components[i] as TConnector);
        AConnector.Free;
        AConnector:=nil;
      end;
    end;
     
    end.
    voici l'untité ChildPanel :
    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
    unit ChildPanel;
     
    interface
     
    uses Windows, Classes, Graphics, Forms, Controls, Buttons,Messages,
      ExtCtrls, JvExExtCtrls, JvCaptionPanel;
     
    type
      TMyPanel=class(TJvCaptionPanel)
        FSpeedButtonConnecter: TSpeedButton;
        private
          procedure SpeedButtonConnecterClick(Sender: TObject);
          procedure JvCaptionPanel1ButtonClick(Sender: TObject;
                    Button: TJvCapBtnStyle);
          procedure OnMove(var Msg: TWMMove); message WM_MOVE;
        public
          constructor Create(AOwner: TComponent); override;
          destructor Destroy; override;
          property SpeedButtonConnecter: TSpeedButton read FSpeedButtonConnecter;
      end;
     
     
    implementation
    uses MAIN;
     
    procedure TMyPanel.SpeedButtonConnecterClick(Sender: TObject);
    var AConnector:TConnector;
    begin
      if FSpeedButtonConnecter.Down then
      begin
        if MainForm.CurrentFrom=nil
        then begin
              MainForm.CurrentFrom:=Self;
             end
        else begin
               AConnector:=TConnector.Create(MainForm);
               AConnector.FromPanel:=MainForm.CurrentFrom;
               AConnector.ToPanel:=Self;
               MainForm.PaintBox1.Repaint;
               MainForm.CurrentFrom.SpeedButtonConnecter.Down:=False;
               MainForm.CurrentFrom:=nil;
               FSpeedButtonConnecter.Down:=False;
             end;
      end
      else MainForm.CurrentFrom:=nil;
    end;
     
    procedure TMyPanel.OnMove(var Msg: TWMMove);
    begin
      inherited;
      MainForm.PaintBox1.Repaint;
    end;
     
    procedure TMyPanel.JvCaptionPanel1ButtonClick(Sender: TObject;
      Button: TJvCapBtnStyle);
    var i:Integer;
        AConnector:TConnector;
    begin
      if Button=capclose then
      begin
      if MainForm.ComponentCount>0 then
      for i:=0 to MainForm.ComponentCount-1 do
      if (MainForm.Components[i] is TConnector) then
      begin
        AConnector:=(MainForm.Components[i] as TConnector);
        if ((AConnector.FromPanel=Self) or (AConnector.ToPanel=Self)) then
        begin
          AConnector.Free;
          AConnector:=nil;
        end;
      end;
      visible:=False;
      end;
    end;
     
    constructor TMyPanel.Create(AOwner: TComponent);
    begin
      inherited;
      FSpeedButtonConnecter:=TSpeedButton.Create(self);
      FSpeedButtonConnecter.Parent:=Self;
      FSpeedButtonConnecter.Caption:='connecter';
      FSpeedButtonConnecter.Left:=40;
      FSpeedButtonConnecter.top:=10;
      FSpeedButtonConnecter.height:=25;
      FSpeedButtonConnecter.width:=80;
      FSpeedButtonConnecter.GroupIndex:=1;
      FSpeedButtonConnecter.AllowAllUp:=True;
      FSpeedButtonConnecter.Visible:=true;
      FSpeedButtonConnecter.OnClick:=SpeedButtonConnecterClick;
      OnButtonClick:=JvCaptionPanel1ButtonClick;
    end;
     
    destructor TMyPanel.Destroy;
    begin
    //  FSpeedButtonConnecter.Free;
      inherited;
    end;
     
    end.
    Bidouilleuse Delphi

Discussions similaires

  1. Problème de saut de ligne entre des systèmes d'accolades
    Par Fox213 dans le forum Mise en forme
    Réponses: 3
    Dernier message: 14/06/2007, 14h48
  2. Réponses: 1
    Dernier message: 30/01/2007, 09h10
  3. Réponses: 3
    Dernier message: 25/07/2005, 14h58
  4. Comment faire un retour ligne entre des " ??
    Par DrTank dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 09/05/2005, 09h35
  5. Empêcher le retour á la ligne entre des balises <Hx> e
    Par thomas_chamas dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 29/11/2004, 16h39

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