Ich starte in Delphi Drag&Drop mittels begindrag. Nun möchte ich den Vorgang beenden, wenn eine Maustaste losgelassen wurde. Das Problem ist nur, dass sobald der D&D-Vorgang gestartet ist, das OnMouseup-Ereignis nicht mehr abgearbeitet wird, obwohl die Maustaste losgelassen wurde. Gibt’s da eine Lösung?
jo…gibts
beendet wird das ganze im OnDragDrop-Ereignis. im OnDragOver legst fest, ob OnDragDrop ausgelöst wird (Param. Accept). IN der Hilfe ist ein doch ganz gutes Beispiel.
viel Erfolg
Rüdiger
Ja schon, aber allein von DragOver wird DragDrop nicht ausgelöst. Wenn DragMode manual ist, muss man ja dass Ende des Vorgangs selbst auslösen:
Enddrag(true/false);
Und dann wird erst DragDrop ausgeführt.
äähh…berichtige mich, wenn ich falsch liege…aber DragDrop wird automatisch nach loslassen des Mausbuttons ausgelöst, auch wenn Dragmode dmManual ist…jedenfalls in meinen Programmen klappts so…
Das Problem ist halt, ich starte den Vorgang sobald die rechte Maustaste und Alt gedrückt wird. Wenn ich dann den Vorgang gestartet habe und die rechte Taste loslasse bleibt der D&D-Cursor da.
Mario
Das Problem ist halt, ich starte den Vorgang sobald die rechte
Maustaste und Alt gedrückt wird. Wenn ich dann den Vorgang
gestartet habe und die rechte Taste loslasse bleibt der
D&D-Cursor da.
Hi Mario,
ich würde Dir empfehlen, Dich beim DnD auf die linke Maustaste zu beschränken. Hier mußt Du ja nur die Events OnStartDrag, OnEndDrag, OnDragDrop und OnDragOver richtig verwenden, damit die Sache läuft. DnD mit der rechten Maustaste wird dagegen von der VCL von Haus aus nicht unterstützt (was nicht heißt, daß sich das nicht programmieren läßt, aber das erfordert einige technische Verrenkungen, deren Beherrschung schon ziemlich gute Kenntnisse der Angelegenheit verlangen).
Gruß
Martin
Wenn die nicht einfach die Onmouseup Prozeduren abschalten würden wäre das überhaupt kein Problem! Muss ich jetzt eine eigene Api-Abfrage machen oder was?
Wenn die nicht einfach die Onmouseup Prozeduren abschalten
würden wäre das überhaupt kein Problem!
Ja ja, wenn das Wörtchen „wenn“ nicht wär…
Es ist, wie Du sagst: Nach dem Starten einer DnD-Operation (egal, ob automatisch, also mit „DragMode=dmAutomatic“, oder von Hand per „BeginDrag“-Aufruf ausgelöst) werden von der VCL keinerlei Mausereignisse mehr an die Komponenten gesendet (was wohl irgendwo auch Sinn macht, oder?). Die entsprechenden an die Applikation gesendeten Windows-Botschaften lösen nur die DnD-Ereignisse, z. B. OnEndDrag aus. Dabei wird nun mal nur die linke Maustaste berücksichtigt (Rechtes-Maustasten-DnD wäre auch nicht mit den Windows-Styleguides zu vereinbaren).
Muss ich jetzt eine eigene Api-Abfrage machen oder was?
Fast. Du müßtest die Windows-Botschaft für das Loslassen der rechten Maustaste (WM_RBUTTONUP) an geeigneter Stelle (Application.OnMessage; eine neue WndProc-Methode tut’s hier nicht, da nicht mal das Formular vom Loslassen der Maustaste benachrichtigt wird) abfangen.
Aber wozu der Aufwand, wo DnD mit der linken Maustaste doch supereinfach ist und außerdem völlig ausreicht (das Problem, das sich wirklich nur mit Rechtem-Maustasten-DnD lösen läßt, möchte ich mal gezeigt bekommen)? Ich würde jedem ernsthaften Entwickler dringend davon abraten, derartige „Späßchen“ in seine Software einzubauen. Der Anwender möchte nicht vorgeführt bekommen, was der Programmierer alles drauf hat. Er will ein Produkt mit möglichst vielen möglichst fehlerfrei arbeitenden Funktionen. Ergo tut man gut daran, den Anwender nicht zu dem Schluß kommen zu lassen, daß der Programmierer seine Energie in irgendwelche überflüssige Gags gesteckt hat, statt in das, was wirklich zählt.
Ich hoffe also, daß Dein Interesse am Rechten-Maustasten-DnD rein akademischer Natur ist .
Mit freundlichem Gruß
Martin
Ich hab’ schon 2 schöne Funktionen für die linke und die rechte Maustaste, deswegen reicht mir die rechte Maustaste nicht einmal es muss auch die rechte Maustaste mit Alt sein um den DnD-Vorgang zu starten.
In diesem Fall muss ich halt alles umschreiben. ;-(
Danke
Mario