Autor |
Beitrag |
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 18.10.09 17:41
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
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
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Zuletzt bearbeitet von ALF am So 25.10.09 00:12, insgesamt 1-mal bearbeitet
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 21.10.09 15:09
Hi, alle Miteinander
Ich weiss, es ist nicht erwünscht einen thread noch oben zuschieben.
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.....
Vielleicht habt ihr noch ideen oder infos darüber
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mi 21.10.09 21:33
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: 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 
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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
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
Andere werden doch auch DragDrop, Abfragen der Mousetasten usw..... drin haben und die Standarts Events benutzen!?
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Zuletzt bearbeitet von ALF am Do 22.10.09 17:58, insgesamt 1-mal bearbeitet
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: 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:
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.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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.
bleibt also nix anderes übrig mouseup garnicht zu benutzen
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: 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
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Do 22.10.09 19:09
nice
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
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 !!
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 25.10.09 00:48
Hi, Ihr Leute,
Habe mich jetzt mit diesem Problem 2Tage lang beschäftigt
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)
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
Fazit: 2Tage was gesehen und gelernt, mir aber hilft es in diesem Sinne gar nicht
Ich hoffe das meine Erkenntnis richtig ist!!
gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
|