OnDragDrop sur la MainForm [Résolu]

cs_Gerard 123 Messages postés jeudi 10 janvier 2002Date d'inscription 7 août 2018 Dernière intervention - 7 sept. 2011 à 08:35 - Dernière réponse : Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention
- 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 

Votre réponse

6 réponses

Meilleure réponse
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 7 sept. 2011 à 13:24
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]

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Cirec
cs_Gerard 123 Messages postés jeudi 10 janvier 2002Date d'inscription 7 août 2018 Dernière intervention - 7 sept. 2011 à 18:53
0
Merci
Merci, effectivement cela marche, même si je ne vois pas par quel miracle...
Commenter la réponse de cs_Gerard
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 9 sept. 2011 à 02:29
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
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 10 sept. 2011 à 13:14
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
cs_Gerard 123 Messages postés jeudi 10 janvier 2002Date d'inscription 7 août 2018 Dernière intervention - 10 sept. 2011 à 13:19
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
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 10 sept. 2011 à 22:21
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.