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:
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;
Also, wenn man auf den Tab klickt, dann soll er Drag bereit machen und aktivieren, wenn er mehr als 3 Pixel sich bewegt.
Soweit alles wunderbar
Aber muss ich ja das wieder beenden, wenn die Maus hochgeht
Also flugs MouseUp eingebaut:
Delphi-Quellcode:
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;
Wunderbar
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:
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;
Aber dann hat er alle Drags gecancelt (oder beendet), sobald man draufklickt, weil "BeginDrag" scheint "MouseUp" aufzufrufen
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:
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;
Weil StartDrag komischerweise auf dann aufgerufen wird, wenn gar nicht der Drag begonnen werden sollte. (Also diese 3 Pixel Tolleranz)
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).