Thema: Delphi Drag & Drop mit Tabs

Einzelnen Beitrag anzeigen

Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

Drag & Drop mit Tabs

  Alt 22. Okt 2007, 11:17
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).
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat