OnDragDrop sur la MainForm [Résolu]

Signaler
Messages postés
121
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
-
Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
-
Bonjour,

Je voudrais mémoriser l'emplacement et la taille de la fenêtre d'une application telle que l'utilisateur la souhaite pour les sessions futures.
Curieusement alors que l'évènement "OnResize" fonctionne bien, je n'arrive pas à avoir la même chose avec "OnDragDrop".
Je fais pourtant quelque chose de très simple. Une nouvelle appli est créée, une procédure est associée à l'évenement OnDragDrop:
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  showmessage('Nouvelle position: '+ IntToStr(X)+'   '+IntToStr(Y));
end;

Mais lorsque la fenêtre est déplacée la procédure n'est pas appelée...

Quelqu'un peut-il m'expliquer ce qui ne va pas?
Certes, je peux mémoriser ces valeurs lors de la fermeture de l'appli, et c'est ce que je ferai si je n'ai pas de solution, mais cela m'intrigue que cela ne marche pas...


Merci en avance pour celui qui répondra
A voir également:

6 réponses

Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
Salut,

utilise plutôt le message "WM_ExitSizeMove" à la place:
...

  [b]private
    /b{ Déclarations privées }
    procedure WMExitSizeMove(var Msg: TMessage); message WM_ExitSizeMove;
...
[b]implementation

/b{$R *.dfm}
...
procedure TForm1.WMExitSizeMove(var Msg: TMessage);
[b]begin
  /bShowMessagefmt('Top = %d'#13#10+
                 'Left = %d'#13#10+
                 'Width = %d'#13#10+
                 'Height = %d', [Top, Left, Width, Height]);
end;
[hr]

du coup il fait les deux évènements (OnResize & OnMove)

[hr]@+Cirec
[hr]
Messages postés
121
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018

Merci, effectivement cela marche, même si je ne vois pas par quel miracle...
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
Salut,
« même si je ne vois pas par quel miracle »


C'est parce que Cirec est directement branché sur les Messages du Bon Dieu.
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
[quote= Le Divin m'][quote=Gérard]Merci, effectivement cela marche, même si je ne vois pas par quel miracle.../quote[quote=Caribensila]C'est parce que Cirec est directement branché sur les Messages du Bon Dieu./quote/quote

En fait non ... il n'y a pas de miracle là dedans ...

L'évènement "OnDragDrop" n'est tout simplement pas fait pour cet usage. "OnDragDrop" n'est déclenché que si un objet est déplacé au dessus et que la variable "Accept" de l'évènement "OnDragOver" est à True. (voir le petit exemple en dessous)

Mais dans le cadre d'un déplacement de Form ça ne fonctionnera jamais ... on utilise le message Windows "WM_ExitSizeMove" à la place qui se déclenche dès qu'un déplacement et/ou un redimensionnement a été fait.

Pour info il existe aussi "WM_EnterSizeMove" qui lui est déclenché avant le redimensionnement et/ou le déplacement ... pratique pour controler la taille et la position.

Mais ....[quote=Gérard]Je voudrais mémoriser l'emplacement et la taille de la fenêtre d'une application telle que l'utilisateur la souhaite pour les sessions futures. /quote
Pour réaliser ça j'utiliserai Get/SetWindowPlacement à la place ... elles sont prévues pour cet usage



Le petit exemple de DragDrop ...

Tu places deux TLabel sur ta Form et tu mets leurs propriétés "DragMode" à dmAutomatic
ensuite tu double cliques sur les évènements "OnDragOver" & "OnDragDrop" de la Form et tu complètes comme suit:
[hr] procedure  TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;

  State: TDragState; var Accept: Boolean);
[b]begin
  /bAccept : = Source is TLabel;
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
[b]begin
  with /b(Source as TLabel) [b]do
    /bSetBounds(X, Y, Width, Height);
end;
[hr]
Tu lances l'application et maintenant tu peux déplacer les deux TLabel partout sur la Form parent avec la souris.
J'espère que cette fois c'est plus clair pour toi ... et tu vois ... il n'y a pas de miracle

[hr]@+Cirec
[hr]
Messages postés
121
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018

Merci de ces explications.

je ne comprenais pourquoi ce que j'avais fait avec onresize marchait et pas onDragDrop et l'Aide est vraiment insuffisante, parce d'après de qu'on y lit cela devrait marcher!
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
je ne sais pas quelle version de Delphi tu utilises mais regarde peut être ici


[hr]@+Cirec
[hr]