[Delphi] form.onMove + onMouseUp

Pagina: 1
Acties:

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20-04 07:00
Ik ben bezig met een applicatie in Delphi, en hierin moet een actie plaatsvinden als het form verplaatst is. Delphi ondersteunt standaard geen onMove-procedure, maar die is met een simpel stukje code makkelijk zelf te implementeren.

Echter, deze functie wordt, als ik het form beweeg, constant aangeroepen, ook al zou dit niet het geval mogen zijn (vgl. WM_MOVE met WM_MOVING). Kennelijk is dit een foutje/onvolkomenheid in Delphi, maar feit blijft dat ik pas actie wil ondernemen als de gebruiker de muis heeft losgelaten (omdat je anders een te schokkerig beeld krijgt). Ik kan echter geen enkele manier vinden om, zonder event, de status van de muis uit te lezen!

Is er niet een global variabele met daarin de muisstatus, iets dat je overal aan kan roepen?

form.onMouseUp werkt ook niet, want de titelbalk (waarmee je het form verplaatst) valt buiten het 'form'.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Delphi heeft niets te maken met welke Windows Messages Microsoft Windows zelf verstuurd. Het is dan ook niet een onvolkomenheid in Delphi, maar het is zoals Windows werkt. Als je 'Update Window While Dragging' uit zet in Windows vermoed ik dat het wel werkt zoals jij denkt. Ik zou zelf voor WM_WINDOWPOSCHANGED gaan.

We adore chaos because we like to restore order - M.C. Escher


  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20-04 07:00
WM_WINDOWPOSCHANGED doet exact hetzelfde, maar het uitzetten van 'Show window contents while dragging' heeft wel geholpen, dank!

Met één opmerking achteraf (voor toekomstige zoekers):
Doel van deze code is: als het venster verplaatst wordt, verplaats dan ook een venster van een andere draaiende applicatie, zodat die weer goed uitgelijnd staat t.o.v. het Delphi-programma.
Het lijkt echter zo te zijn dat zowel WM_MOVE als WM_WINDOWPOSCHANGED worden aangeroepen na het verplaatsen (goed), maar bij WM_WINDOWPOSCHANGED geven TForm.Left en Top de oude waarden terug, en WM_MOVE geeft de nieuwe waarden terug.

Kan dit gedrag niet in de documentatie terugvinden, maar handig om te weten :).

[ Voor 71% gewijzigd door sjroorda op 03-11-2005 14:58 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Als je WM_WINDOWPOSCHANGED af vangt doe je dat kennelijk voordat Delphi die Left en Top waardes aangepast heeft, maar zowel WM_WINDOWPOSCHANGED als WM_MOVE geven in hun parameters de correcte locatie terug. Als je die gebruikt is er niets aan de hand.

We adore chaos because we like to restore order - M.C. Escher