Einzelnen Beitrag anzeigen

Benutzerbild von xZise
xZise

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

Re: PageControl - Drag and Drop ist problematisch

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