Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Drag & Drop mit Tabs (https://www.delphipraxis.net/102017-drag-drop-mit-tabs.html)

xZise 22. Okt 2007 11:17


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:
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).

EarlyBird 18. Mai 2013 11:15

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