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 :

Déplacement simultané de plusieurs fenètres


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Points : 92
    Points
    92
    Par défaut Déplacement simultané de plusieurs fenètres
    Bonjour,

    Il s'agit d'un code Delphi qui affiche plusieurs Forms sur l'écran : Form1, Form2, Form3, etc. (Form1 est la principale).
    Le but est le suivant : lorsque l'on déplace Form1 (non par programme, mais par la souris), on veut que toutes les autres Forms se déplacent aussi en conservant les mêmes positions relatives entre elles ainsi que relativement à Form1. Par contre, lorsqu'on déplace une autre form que Form1, elle seule est déplacée, les autres ne bougeant pas.
    Actuellement, c'est obtenu par une méthode qui utilise un timer avec une réactualisation périodique des positions relatives des Forms. Cela marche bien, mais sans être totalement satisfaisant. En effet, les déplacements des Form2, Form3, etc. sont sacadés, en rapport avec l'intervalle de temps fixé pour le timer. Si on fixe un intervalle de temps très court, les déplacements des Forms sont plus "smooth", mais l'exécution d'ensemble devient trop lente.
    Connaissez-vous une méthode pour réaliser cette fonctionnalité d'une façon plus "propre" et qui ne fasse pas intervenir de timer si possible ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    Il faudrait gérer les événements souris qui surviennent sur la barre de titre de la Form1 WM_NCLBUTTONDOWN, WM_NCLBUTTONMOVE, etc.

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut,

    TU peux aussi récupérer le Message WMMouve de ta form principal et appliquer une modif au autre form

    Tu déclare :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure WMMove(var Message: TMessage) ; message WM_MOVE;
    et ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.WMMove(var Message: TMessage);
    Begin
      Form2.Left := Self.Left + Self.Width;
    end;
    il existe d'autre message comme
    WMEnterSizeMove(var Message: TMessage); // Quand tu entre avant le mouvement de la form
    WMExitSizeMove(var Message: TMessage); // Quand tu sort après le mouvement de la form

    Bye.

  4. #4
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Points : 92
    Points
    92
    Par défaut
    Merci pour ces tuyaux,
    avec ces informations, j'ai bon espoir d'arriver à quelque chose de plus satisfaisant que ce qui tourne actuellement. En tout cas, je vais essayer.

  5. #5
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Points : 92
    Points
    92
    Par défaut
    Re-bonjour,

    je dois reconnaitre que j'ai trop peu d'expérience sur la gestion des messages.
    Pour l'instant, je n'ai essayé que la méthode proposée par BuzzLeclaire.
    Afin de ne pas bricoler sur le code actuel qui est volumineux et compliqué, j'ai crée un petit programme réduit au minimum et qui ne comporte que deux Forms.
    Je ne comprends pas pourquoi les procédures indiquées dans le message de BuzzLeclaire ne se compilent pas.
    Ensuite, j'ai modifié ces procédures de telle sorte que la compilation se passe bien.
    Mais les modifications que j'ai faites sont certainement pas ce qu'il fallait faire car, à l'exécution, Form2 ne se déplace pas comme il le faudrait.
    Voilà où j'en suis :
    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
     
    unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure AppMessage(var Msg: TMsg;var Handled: Boolean);
      private
        { Déclarations privées}
      public
        { Déclarations publiques}
      end;
    var
      Form1: TForm1;
    implementation
    uses Unit2;
    {$R *.DFM}
    procedure TForm1.FormCreate(Sender: TObject);
    begin
          Application.OnMessage := AppMessage;
    end;
    procedure TForm1.AppMessage(var Msg: TMsg;var Handled: Boolean);
    begin
         if Msg.message = WM_MOVE then
         begin
              Form2.top := Form1.top + Form1.height;
              Form2.left:=form1.left;
         end;
    end;
    end.

  6. #6
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut,

    un petit exemple :

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        procedure WMMove(var Message: TMessage) ; message WM_MOVE;
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    Uses unit2;
     
    {$R *.dfm}
     
    procedure TForm1.WMMove(var Message: TMessage);
    Begin
      If Assigned(Form2) then
      Form2.Left := Self.Left + Self.Width;
    end;
     
    procedure TForm1.FormShow(Sender: TObject);
    begin
        Form2.Show;
    end;
     
    end.

    La procedure TForm1.FormShow qui en fait montre le form2 à ce moment précis peut-être utilisé autrement, genre tu créer un boutton dans le form1 et au clique du show la form2.

    De tout façon tu vera ta form2 coller à ta form principal.

    Bye.

  7. #7
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Points : 92
    Points
    92
    Par défaut
    C'est bon, j'ai compris le truc.
    Les essais pour associer et dissocier les déplacements des Forms marchent bien (exemple joint).
    Ensuite, pour passer au vrai programme avec des Forms plus nombreuses, c'est du bourrin, donc ça devrait être de mon niveau.
    Merci beaucoup pour l'aide efficace.
    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        procedure WMMove(var Message: TMessage) ; message WM_MOVE;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
      Lien:boolean;
     
    implementation
     
    Uses unit2;
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
         Form1.height:=200;
         Form1.width:=300;
         Lien:=true;
    end;
     
    procedure TForm1.WMMove(var Message: TMessage);
    var
       x,y:integer;
    Begin
     
      If Assigned(Form2) then
      begin
           x:=abs(Form2.left-Form1.left);
           y:=abs(Form2.top-Form1.top-Form1.height);
           if((x<10)and(y<10))then lien:=true;
           if lien=true then
           begin
                Form2.top := Form1.top + Form1.height;
                Form2.left:=Form1.left;
           end;
      end;
    end;
     
    end.
     
     
    unit Unit2;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
     
    type
        TForm2 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure WMExitSizeMove(var Message: TMessage) ; message WM_ExitSizeMove;
     
      private
        { Déclarations privées}
      public
        { Déclarations publiques}
      end;
     
    var
      Form2: TForm2;
     
    implementation
     
    uses Unit1;
     
    {$R *.DFM}
     
    procedure TForm2.FormCreate(Sender: TObject);
    begin
         Form2.height:=200;
         Form2.width:=300;
    end;
     
    procedure TForm2.WMExitSizeMove(var Message: TMessage);
    begin
         lien:=false;
    end;
     
    end.

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

Discussions similaires

  1. [Tkinter] Plusieurs fenêtre avec Tkinter
    Par cyrpaut dans le forum Tkinter
    Réponses: 2
    Dernier message: 04/01/2006, 22h24
  2. update simultané de plusieur lignes dans table
    Par jarod_bx dans le forum Access
    Réponses: 2
    Dernier message: 22/12/2005, 22h13
  3. TForm pour plusieurs fenêtre dans une même fonction ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 5
    Dernier message: 15/11/2005, 12h38
  4. Interface graphique avec plusieurs fenêtres
    Par Copps dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 30/03/2005, 18h00
  5. [Syntaxe] Action simultanée sur plusieurs élements
    Par FranT dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/03/2003, 20h20

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