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 PageControl - Drag and Drop ist problematisch (https://www.delphipraxis.net/100855-pagecontrol-drag-drop-ist-problematisch.html)

xZise 4. Okt 2007 17:54


PageControl - Drag and Drop ist problematisch
 
Hi DP,
ich habe ein kleines Problem mit dem TPageControl.
Auf diesen sind mehrere Tabsheets.
Nun kann man in einen TabSheet ein Objekt aufnehmen, und man soll dann auf die Leite oben gehen.
Und dann sollte er normalerweise auf das aktuell selektierte Tab gehen.
Also schnell eine DragOver Prozedur geschrieben.
Anfangs hat er noch nicht den Tab gewechselt.
Also flugs Dragmode in "dmAutomatic" umgestellt und tada es funktioniert.
Leider habe ich das verboten (absicht) und musste nochmal ansetzen und dann der Schock: :shock:
Jedes mal wenn ich den Tab ändere ändert sich das Mausicon ...
Abgesehen davon, dass die OnChange Methode nicht aufgerufen wird.
Dabei habe ich noch nicht "StartDrag" eingebaut!

Nun ist meine Frage, wie man das umsetzt ohne DragMode wieder auf dmNormal (oder so) zu stellen, weil dann ja wieder nichts mehr mit draggen ist xD

MfG
xZise

xZise 6. Okt 2007 12:38

Re: PageControl - Drag and Drop ist problematisch
 
Hi,
gibt es keine Lösung für das Problem? Immerhin müsste jeder Programierer mit einer Tabverschiebenfunktion dieses Problem haben!

MfG
xZise

xZise 30. Okt 2007 16:42

Re: PageControl - Drag and Drop ist problematisch
 
Hallo ich bin es nochmal.

Dieses Problem besteht weiterhin, und ich weiß nicht, wie man es Lösen kann!

Weil irgendwie verhält sich dass seltsam.
Gibt es den KEINE Möglichkeit herauszufinden, ob er Draggt?
Weil Dragging setzt er schon auf true sobald StartDrag(false) ausführt, was ja "etwas" zu früh ist!

MfG
xZise

TonyR 30. Okt 2007 17:00

Re: PageControl - Drag and Drop ist problematisch
 
Du stellst Fragen ...

Kannst du das "Problem" nicht einfach umgehen?
z.B. indem du zwei Buttons auf dein Form wirfst, die das nach rechts bzw. links Verschieben der Pages machen?
Oder versteh ich dich jetzt falsch? (Ich habs so verstanden, dass du die einzelnen Pages per D&D "umordnen" möchtest)

xZise 30. Okt 2007 21:41

Re: PageControl - Drag and Drop ist problematisch
 
Zitat:

Zitat von TonyR
Du stellst Fragen ...

Kannst du das "Problem" nicht einfach umgehen?
z.B. indem du zwei Buttons auf dein Form wirfst, die das nach rechts bzw. links Verschieben der Pages machen?
Oder versteh ich dich jetzt falsch? (Ich habs so verstanden, dass du die einzelnen Pages per D&D "umordnen" möchtest)

Richtig verstanden.
Nur frage ich mich, warum Delphi "Dragging" auf True setzt, wenn das Dragsymbol gar nicht erscheint.

Ich versuche gerade das gesamte Zeug selber zu programmieren.

Also bei MouseDown Start des Draggingtests.
Bei MouseMove Test ob Dragging einschalten.
Bei MouseUp Test ob man nicht draggen will.

Allerdings scheint er da ein bisschen verrückt zu spinnen :(

Ich finde es nur ungeschickt folgendes zu Sagen:
Zitat:

Zitat von Die Hilfe
Hat Immediate den Wert false, wird die Form des Mauszeigers nicht geändert und das Ziehen erst begonnen, wenn der Benutzer den Mauszeiger um die in Threshold angegebene Pixelanzahl verschiebt. Ist Threshold kleiner als 0, wird der Wert aus der Eigenschaft DragThreshold der globalen Variable Mouse gelesen.

Allerdings setzt er alles sofort auf Dragging, selbst wenn man es mit "false" aufruft:
Delphi-Quellcode:
<Pagecontrol>.BeginDrag(false);
Also dort ruft er sofort "OnStartDrag" auf, führt "OnMouseUp" aus und setzt "Dragging" auf "true", selbst wenn die Maus nicht weit genug entfernt wurde.

MfG
xZise

[edit]Jetzt habe ich endlich eine Idioten sichere Lösung ;)
Hoffe ich jedenfalls:
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);
  end;
end;

procedure TfrmEnterpriseFile.pcTabsMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  if ((Abs(moveTab.start.X - X) >= 3) or (Abs(moveTab.start.Y - Y) >= 3)) and (moveTab.mode = mmBeforeDrag) then
  begin
    moveTab.mode := mmClicked;
    pcTabs.BeginDrag(true);  
  end;
end;

procedure TfrmEnterpriseFile.pcTabsMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ((Abs(moveTab.start.X - X) < 3) and (Abs(moveTab.start.Y - Y) < 3)) then
  begin
    pcTabs.EndDrag(false);
    moveTab.mode := mmNone;
    pcTabs.Repaint;
  end;
end;
Das Repaint ist deshalb, weil ich die Tabs nicht sofort verschiebe (ansonsten entstehen u.U. so Flackereffekte), sondern einen Pfeil zeichne.

oki 30. Okt 2007 22:09

Re: PageControl - Drag and Drop ist problematisch
 
Hallo XZise,

wenn ich dich richtig verstanden habe, geht es dir um das Verschieben von Tabs im Control per Drag&Drop. Ich hab das so gelöst. Funzt anstandslos.

Delphi-Quellcode:

// Member der Klasse
private
    DragPage : TTabSheet;                 // zu verschiebenden Tabscheets (Drag&Drop)
.......

procedure TForm2.PageControl2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var i: integer;
begin
  // Drag & Drop
  i:=PageControl2.IndexOfTabAt(x,y);
  If (Button=mbLeft) then begin
   DragPage:=Pagecontrol2.Pages[i];
   PageControl2.BeginDrag(false);
  end;
end;

procedure TForm2.PageControl2DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  If (Source is TTabSheet) then
    Accept:=true;
end;

procedure TForm2.PageControl2DragDrop(Sender, Source: TObject; X, Y: Integer);
var i:integer;
begin
  i:=PageControl2.IndexOfTabAt(x,y);
  DragPage.PageControl:=PageControl2;
  DragPage.PageIndex:=i;
end;
DragMode ist dmManual.

Das hab ich dann auch noch für ein weiters PageControl. Das Verschieben von Tabs zwischen beiden Controls ist ebenso ohne Probleme möglich.

Gruß oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:37 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-2025 by Thomas Breitkreuz