OnDragDrop sur la MainForm [Résolu]

Messages postés
123
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
- - Dernière réponse : Cirec
Messages postés
4233
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 juillet 2019
- 10 sept. 2011 à 22:21
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
Afficher la suite 
A voir également:

6 réponses

Meilleure réponse
Messages postés
4233
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 juillet 2019
32
3
Merci
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]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Cirec
Messages postés
123
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
0
Merci
Merci, effectivement cela marche, même si je ne vois pas par quel miracle...
Commenter la réponse de cs_Gerard
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
26 juillet 2018
11
0
Merci
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.
Commenter la réponse de Caribensila
Messages postés
4233
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 juillet 2019
32
0
Merci
[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]
Commenter la réponse de Cirec
Messages postés
123
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
7 août 2018
0
Merci
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!
Commenter la réponse de cs_Gerard
Messages postés
4233
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 juillet 2019
32
0
Merci
je ne sais pas quelle version de Delphi tu utilises mais regarde peut être ici


[hr]@+Cirec
[hr]
Commenter la réponse de Cirec