Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - MouseDown -> BeginDrag ->Mouseup abhängigkeit??
ALF - So 18.10.09 17:41
Titel: MouseDown -> BeginDrag ->Mouseup abhängigkeit??
Hi
Das MouseEvent MouseDown benutzte ich für die DragDrop aktion BeginDrag(False)
Das MouseEvent MouseUp benutze ich für andere Aufgaben
Problem:
Wenn ich in dem MouseDown event mit der linken MouseTaste drücke, die MousTaste aber nicht loslasse,
wird das MouseUp event trotzdem ausgeführt.
Deaktiviere ich die aktion BeginDrag(False) funct MouseUp richtig.
Sehe also eine Abhängikeit darin!
Frage: Was muss ich ändern oder berücksichtigen das beides unabhäng funktioniert???
Hinweis: die GaugeKomponenten zeigen mit den Ereignissen MouseUp/MouseDown auch auf diese proceduren
ist kein guter Still kann man aber machen 8)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| procedure TForm1.ScrollBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin
if (Button = mbLeft) then begin dragindex := (Sender as TGaugeCaption).ComponentIndex; (Sender as TGaugeCaption).BeginDrag(False); end;
end;
procedure TForm1.ScrollBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var gaugeindex: Integer; names: String; begin
GetCursorPos(pos); names := Copy(FindDragTarget(pos, False).Name, 0, 10); index := ScrollBoxNames.IndexOf(names); if Button = mbLeft then begin gaugeindex := (Sender as TGaugeCaption).ComponentIndex; SetBkColor(index, gaugeindex); end; end; |
gruss Alf
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am So 18.10.2009 um 23:32
ALF - Mi 21.10.09 15:09
Hi, alle Miteinander
Ich weiss, es ist nicht erwünscht einen thread noch oben zuschieben. :oops:
Habe aber nun einiges versucht, mit anderen Routienen die Botschaften abzufangen, um zu verhindern das MousUp ausgeführt wird solange die Mousetaste gedrückt ist, wie gesagt kein Erfolg!
Habe nun keine Ideen mehr..... :x
Vielleicht habt ihr noch ideen oder infos darüber :idea:
Gruss Alf
Xion - Mi 21.10.09 21:33
ich kenn mich mit dem BeginDrag nicht so genau aus, was du aber machen kannst nach dem Motto
ALF hat folgendes geschrieben : |
ist kein guter Still kann man aber machen 8) |
ist, dass du bei BeginDrag eine Variable auf True setzt (z.B: "Dragging:=True") und beim MouseUp ist die erste Abfrage
Delphi-Quelltext
1: 2: 3: 4:
| if Dragging=False then begin [...] end; |
Nach dem Draggen die Variable einfach wieder auf False setzen. Das funktioniert auf jeden Fall ;)
Xion - Mi 21.10.09 21:34
Anmerkung: Durch das "pushen" deines Topics hätte ich es normalerweise übersehen, denn ich gucke mir immer die "Unbeantworteten Beiträge" an, wenn ich wenig Zeit habe :D
ALF - Do 22.10.09 17:27
hi, Thx für ne Möglichkeit, bringt aber leider nix, jedenfalls bei mir, habe ja schon vieles versucht incl abfragen von TMouse und zusätzlichen Variablen, wurde nur noch chaotischer :nut:
Delphi-Quelltext
1: 2: 3:
| .... (Sender as TGaugeCaption).BeginDrag(False); .... |
führt ja noch keine dragaktion aus, sondern erst wenn die mouse bewegt wird mit linken mousebutton!
Wie gesagt:
obwhol ich nichts bewege, lediglich die linke mousetaste gedrückt halte wird schon mouseup durchgeführt!
Ne zusätzlich Abfrage einer Variablen bedeuted ja nix anderes als, hast du die Mausetaste losgelassen oder bewegt oder oder oder. So könnte man ja auch sagen benutze doch einfach die rechte MouseTaste dafür usw.
Dafür sollten ja eigentlich die events da sein, nur gibt es da für mich keine Erklärung warum die Procedure MousUp ausgeführt wird!!
Wahrscheinlich bin ich blind und seh den Fehler nicht :eyes:
Andere werden doch auch DragDrop, Abfragen der Mousetasten usw..... drin haben und die Standarts Events benutzen!?
Gruss Alf
Xion - Do 22.10.09 17:47
Was auch immer du da genau machst (TGaugeCaption :?: ) ich habs jetzt mal in Delphi mit nem Button nachgebastelt...gleicher Fehler...
Was mir sofort auffällt, mit OnEndDrag gehts ;)
Jetzt hab ich mir einfach mal den Source von BeginDrag anzeigen lassen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure TControl.BeginDrag(Immediate: Boolean; Threshold: Integer); var P: TPoint; begin if (Self is TCustomForm) and (FDragKind <> dkDock) then raise EInvalidOperation.CreateRes(@SCannotDragForm); CalcDockSizes; if (DragControl = nil) or (DragControl = Pointer($FFFFFFFF)) then begin DragControl := nil; if csLButtonDown in ControlState then begin GetCursorPos(P); P := ScreenToClient(P); Perform(WM_LBUTTONUP, 0, Longint(PointToSmallPoint(P))); end; if Threshold < 0 then Threshold := Mouse.DragThreshold; if DragControl <> Pointer($FFFFFFFF) then DragInitControl(Self, Immediate, Threshold); end; end; |
Interessanterweise ist es Definition der Procedure BeginDrag, dass sie auf das Objekt ein WM_LBUTTONUP macht...warum auch immer.
So gesehen hast du 5 Möglichkeiten (die mir da so einfallen):
1) Du kommentierst einfach die Zeile da oben aus (man sollte aber nicht in den Units rumpfuschen wenn man nicht ganz genau weiß, warum das wie ist.
2) Du machst einfach ne neue Klasse (abgeleitet von deiner TGaugeCaption) und überschreibst die procedure (das ist allerdings vergleichsweise aufwändig)
3) oder du verwendest OnEndDrag (wenn möglich)
4) Du könntest natürlich auch vor BeginDrag das Event OnMouseUp einfach aus der TGaugeCaption rausnhemen und danach wieder reinsetzen
5) oder aber wie ich vorgeschlagen habe:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| procedure TForm1.ScrollBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin
if (Button = mbLeft) then begin dragindex := (Sender as TGaugeCaption).ComponentIndex; StatusBeginDrag:=True; (Sender as TGaugeCaption).BeginDrag(False); StatusBeginDrag:=False;
end;
end;
procedure TForm1.ScrollBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); var gaugeindex: Integer; names: String; begin if StatusBeginDrag=False then begin GetCursorPos(pos); names := Copy(FindDragTarget(pos, False).Name, 0, 10); index := ScrollBoxNames.IndexOf(names); if Button = mbLeft then begin gaugeindex := (Sender as TGaugeCaption).ComponentIndex; SetBkColor(index, gaugeindex); end; end; end; |
Anmerkung:
Ich vermute mal, das BeginDrag dragged einfach nur das Objekt (und nicht das mit der Maus gedrückte Objekt). Der eine Vorgang ist also praktisch MouseDown/MouseUp (anklicken). Draggen ist aber ein davon getrennter Vorgang, bevor er jetzt also den Drag-Vorgang beginnt, beendet er erstmal den Anklick-Vorgang.
ALF - Do 22.10.09 18:13
sorry habe meinen Antwort zulange editiert, und jetzt erst gesehen was du geschrieben hast,
wie gesagt hab es umgesetzt und mouseup funct gleich gar nicht mehr!!
du hast aber recht begindrag löst mouseup aus und kehrt nicht in das event mousedown zurück!!
siehe statusbegindrag=False!!!!!!!
bleibt auf true. :nixweiss:
bleibt also nix anderes übrig mouseup garnicht zu benutzen
Gruss Alf
Xion - Do 22.10.09 18:52
StatusbeginDrag:=False wird nicht ausgeführt? hmm...naja, du kannst natürlich im OnMouseUp schreiben:
Delphi-Quelltext
1: 2: 3: 4:
| if StatusBeginDrag=False then [...] else StatusBeginDrag:=False; |
Das ist aber nicht so toll...also doch OnEndDrag
ALF - Do 22.10.09 19:09
nice :lol:
war natürlich nix, weil mousedown ja immer der Auslöser ist!
und onendrag kommt nur wenn dragging und das ist beim normalen klick ebend nicht!
Finde es aber trotzdem interessant das noch niemand so ein Problem hatte!!! :?:
also in Kombination
MouseDown -> BeginDrag
und
MouseUp
Egal, habe aber wieder was gelernt :les:
Wie gesagt muss das ebend anders coden ohne event MouseUp!!
grosses THX für die Mühe
Gruss Alf
Ich lass den thread offen, vielleicht schauen noch andere rein !!
ALF - So 25.10.09 00:48
Hi, Ihr Leute,
Habe mich jetzt mit diesem Problem 2Tage lang beschäftigt :les:
Debugt ohne Ende, und komme zum Schluss auf ein mhhh... evtl Fehler bei den Coder von Delphi :?:
Fakt ist, das eigentliche dragging ist unabhängig mit welcher Maustaste man es durchführt!!!!
Die Procedure BeginDrag weist an den makierten Stellen eine mhhh.. keine Logik auf!!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure TControl.BeginDrag(Immediate: Boolean; Threshold: Integer); var P: TPoint; begin if (Self is TCustomForm) and (FDragKind <> dkDock) then raise EInvalidOperation.CreateRes(@SCannotDragForm); CalcDockSizes; if (DragControl = nil) or (DragControl = Pointer($FFFFFFFF)) then begin DragControl := nil; if csLButtonDown in ControlState then begin GetCursorPos(P); P := ScreenToClient(P); Perform(WM_LBUTTONUP, 0, Longint(PointToSmallPoint(P))); end; if Threshold < 0 then Threshold := Mouse.DragThreshold; if DragControl <> Pointer($FFFFFFFF) then DragInitControl(Self, Immediate, Threshold); end; end; |
Benutzte ich eine andere Moustaste für das dragging kommt es hier,
bezogen auf das DragObjekt , zu keinem Mouesupevent :!: , da es nur auf die linke Maustaste ausgelegt ist!
Wenn, wie ich es gemacht habe die
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| if csLButtonDown in ControlState then begin GetCursorPos(P); P := ScreenToClient(P); Perform(WM_LBUTTONUP, 0, Longint(PointToSmallPoint(P))); end; |
ausdokumentiere, passiert im Prinzip auch nichts, ausser das es für die linke Taste kein Mouseupevent mehr gibt!(gibt es ja bei den anderen Tasten auch nicht) :wink:
Würde ich nun als Linkshänder die Mouse in Windows umstellen und die rechte Maustaste als Standart festlegen, würde im Prinzip nichts sonderliches passieren, aber wie gezeigt ... mhh.
Leider habe ich beim debugen festgestellt, das es einige Stellen gibt, wo von vornherein nur die linke MouseTaste definiert wurde, das bringt zwar das Programm nicht zum Absturz, aber, um z.B. das jeweilige HNDL wieder frei zugeben, müssen ebend zusätzlich Routinen durchlaufen werden. So auch in diesem Beispiel :?
Warum und weshalb man dieses so fixiert hatt mhhh.... :?!?: einen Sinn sehe ich darin nicht!!
Konkret heisst dies: wer mit BeginDrag arbeitet, kann das Mouseupevent des DragOpjekt nicht für spezielle Aufgaben verwenden, was natürlich nicht im Sinne des Programmieren ist!
Das gleiche ist auch bei AutoDrag. Es ruft die selbe Procedure BeginDrag auf.
Der unterschied, es wird sofort das DragDropevent ausgeführt!(Für Games Coder gut geeignet)
Leider habe ich auch nirgend ein Hinweis gelesen oder gefunden warum dies so definiert ist, zumal ja auch andere Mousbutton verwendet werden können!
Nun könnte man sagen, Frage doch bei Delphi nach.
ja ja würde ich gerne machen, leider ist mein Engl. toooooo Bad :oops:
Fazit: 2Tage was gesehen und gelernt, mir aber hilft es in diesem Sinne gar nicht :(
Ich hoffe das meine Erkenntnis richtig ist!!
gruss Alf
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!