![]() |
Drag & Drop mit Tabs
Hi DP :)
Ich möchte zwei Tabs verschieben, allerdings nicht jedesmal, wenn man draufklickt. Also ist DragMode := dmManual. Soweit ist das alles wunderbar :) Allerdings versuche ich gerade dem Benutzter anzuzeigen, wohin er gerade dragt (ich zeichne einen hübschen Pfeil :) ). Also habe ich folgendes:
Delphi-Quellcode:
Also, wenn man auf den Tab klickt, dann soll er Drag bereit machen und aktivieren, wenn er mehr als 3 Pixel sich bewegt.
procedure TfrmEnterpriseFile.pcTabsMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Shift = [ssLeft]) and (Button = mbLeft) then begin moveTab.mode := mmBeforeDrag; moveTab.start := Point(X, Y); pcTabs.BeginDrag(false, 3); end; end; Soweit alles wunderbar :) Aber muss ich ja das wieder beenden, wenn die Maus hochgeht :) Also flugs MouseUp eingebaut:
Delphi-Quellcode:
Wunderbar :)
procedure TfrmEnterpriseFile.pcTabsMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {...} if moveTab.mode <> mmBeforeDrag then begin pcTabs.EndDrag(false); moveTab.mode := mmNone; pcTabs.Repaint; end else begin moveTab.mode := mmClicked; end; end; Jedenfalls sollte man das meinen. Nun zur Erklärung: Vorher, als mir das Problem nicht auffiel, habe ich nicht mit "BeforeDrag" gearbeitet. Also ungefähr so:
Delphi-Quellcode:
Aber dann hat er alle Drags gecancelt (oder beendet), sobald man draufklickt, weil "BeginDrag" scheint "MouseUp" aufzufrufen :(
procedure TfrmEnterpriseFile.pcTabsMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {...} if moveTab.mode <> mmNone then begin pcTabs.EndDrag(false); moveTab.mode := mmNone; pcTabs.Repaint; end; end; Nun stehe ich vor dem Problem, dass ich gerade überhaupt nicht weiß, wie ich "Drags" von "Tab anklicken" unterschieden soll :( Zuerst dachte ich, eigentlich müsste MouseUp zweimal aufgerufen werden. (Weil beim normalen Anklicken/Beenden des Drags, sowieso nocheinmal die Maustaste hochgeht) Aber das tut es nicht (deshalb auch der Umweg mit "mmBeforeDrag"). So schlimm wäre das ja nicht, würde ich nicht zeichnen:
Delphi-Quellcode:
Weil StartDrag komischerweise auf dann aufgerufen wird, wenn gar nicht der Drag begonnen werden sollte. (Also diese 3 Pixel Tolleranz)
procedure TfrmEnterpriseFile.pcTabsStartDrag(Sender: TObject;
var DragObject: TDragObject); var tab : TTabSheet; begin if moveTab.mode = mmClicked then begin {...} DrawTabPosition(moveTab.index); // <!--- hier wird ein Pfeil gezeichnet end; end; Nun, wer noch nicht die Frage erkannt hat: Wie kann ich erkennen, ob jemand draggen möchte oder einfach nur der Tab angeklickt werden soll. MfG xZise PS: Seltsamerweise, wird MouseUp im komplierenzustand zweimal aufgerufen?! Aber wenn ich pro MouseUp ein Beep ausgebe, dann Peept er nur einmal (ich habe ein Sleep von 100 ms eingebaut sicherheitshalber). |
AW: Drag & Drop mit Tabs
Hi,
ich habe dieses alte Thema noch mal ausgegraben. Ich stehe zur Zeit vor dem selben Problem. "onStartDrag" wird immer ausgelöst wenn DragMod auf dmManual steht. auch wenn man Immediate = False und Threshold = 10 sind "BeginDrag(False, 10)" Wie löst ihr dieses Problem (DelphiXE) THX |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz