OnDragDrop sur la MainForm

Résolu
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018 - 7 sept. 2011 à 08:35
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 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

6 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
7 sept. 2011 à 13:24
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]
3
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018
7 sept. 2011 à 18:53
Merci, effectivement cela marche, même si je ne vois pas par quel miracle...
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
9 sept. 2011 à 02:29
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.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
10 sept. 2011 à 13:14
[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]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Gerard Messages postés 121 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 7 août 2018
10 sept. 2011 à 13:19
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!
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
10 sept. 2011 à 22:21
je ne sais pas quelle version de Delphi tu utilises mais regarde peut être ici


[hr]@+Cirec
[hr]
0
Rejoignez-nous