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 TTabControl - Drag and Drop? (https://www.delphipraxis.net/86798-ttabcontrol-drag-drop.html)

glkgereon 19. Feb 2007 21:23


TTabControl - Drag and Drop?
 
Hi,

Ich versuche gerade einem TTabControl beizubringen die Tabs via Drag&Drop zu vertauschen.
Da die bereits vorhandenen Drag&Drop-Methoden anscheinend nur für das gesamte Control funktionieren, muss ich mir da wohl was eigenes basteln, oder?

Hat irgendwer eine Idee oder eine fertige Komponente wie das gehen könnte?
(Am besten natürlich mit so nem Vorschaumodus dass der User direkt sieht wo es eingefügt werden würde wenn er jetzt losließe usw...)

marabu 19. Feb 2007 21:31

Re: TTabControl - Drag and Drop?
 
Hi Gereon,

vielleicht kannst du darauf aufbauen: klick

Gute Nacht

glkgereon 19. Feb 2007 22:03

Re: TTabControl - Drag and Drop?
 
Also so wie da geht es leider nicht :-/

Zum einen kennt das TabControl "CancelDrag" erst gar nicht und zum anderen kommt sofort so ein "Stop-Cursor", also mag er das wohl nicht :-(

glkgereon 19. Feb 2007 22:31

Re: TTabControl - Drag and Drop?
 
Also nach etwas nachdenken und rumprobieren habe ich das ganze (erstmal) so gelöst:

Delphi-Quellcode:
procedure TForm1.ParentMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  TC.Tag:=TC.IndexOfTabAt(X,Y); //Tab was wir verschieben wollen
  TC.Cursor:=crDrag;
end;

procedure TForm1.ParentMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var Von,Nach,Akt: Integer;
    Temp: TRoom;
begin
  Von:=TC.Tag; //Ursprungsposition
  Nach:=TC.IndexOfTabAt(X,Y); //Dahin
  if (Von<>Nach) and (Von<>-1) and (Nach<>-1) then //Andere Position und beide Positionen gültig
  begin //Move Tab Von Nach
    Temp:=Data[Von]; //Daten hinter dem Formular schieben
    for Akt:=Von to Nach-1 do
      Data[Akt]:=Data[Akt+1];
    Data[Nach]:=Temp;
    TC.Tabs.Move(Von,Nach); //Tab-Beschriftung schieben
  end;
  TC.Cursor:=crDefault;
end;
Das ganze sieht dann zwar nicht sooo spektakulär aus, aber es funktioniert ;-)

marabu 20. Feb 2007 06:22

Re: TTabControl - Drag and Drop?
 
Guten Morgen,

hier noch die von mir angepasste Version zum Vergleichen:

Delphi-Quellcode:
procedure TDemoForm.TabControlDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  with Sender as TTabControl do
    Accept := (IndexOfTabAt(X, Y) <> TabIndex);
end;

procedure TDemoForm.TabControlDragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  index: Integer;
begin
  if Sender = Source then
    with Sender as TTAbControl do
    begin
      index := IndexOfTabAt(X, Y);
      Tabs.Exchange(TabIndex, index);
      TabIndex := index;
    end;
end;

procedure TDemoForm.TabControlMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  p: TPoint;
begin
  with Sender as TTabControl, p do
  begin
    p := ScreenToClient(Mouse.CursorPos);
    if IndexOfTabAt(X, Y) > -1 then
      BeginDrag(False);
  end;
end;
Freundliche Grüße

glkgereon 20. Feb 2007 10:05

Re: TTabControl - Drag and Drop?
 
Bei dem Code vertauschst du aber die beiden Tabs, oder?

Das versuch ich gleich auch nochmal mit deinen Methoden...


Ich hab wieder diesen Fehler dass der Cursor so ein Stopschild ist (naja, zumindest so ähnlich)...
Auf was müssen denn DragMode und DragKind und so stehen?

marabu 20. Feb 2007 10:36

Re: TTabControl - Drag and Drop?
 
Hallo Gereon,

nimm statt Exchange() besser Move() - und die Einstellungen müssen die Default-Werte sein.

Viel Spaß

glkgereon 20. Feb 2007 10:45

Re: TTabControl - Drag and Drop?
 
Aua -.-

Ich habe aus Versehen OnDockOver statt OnDragOver genommen :wall:

Naja, wie genau ich jetzt vertausche oder verschiebe kann ich mir ja nun überlegen.
Vielen danke jedenfalls.

stahli 13. Mär 2012 23:57

AW: TTabControl - Drag and Drop?
 
Falls jemand nochmal so etwas sucht, ich habe mich jetzt hieran orientiert: http://www.delphigroups.info/2/5b/310157.html

Den DragMode habe ich auf dmManual und dafür:
Delphi-Quellcode:
procedure TFormPlan.MyTabControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  (Sender as TTabControl).BeginDrag(False, 3);
end;
Ein dynamisches Verschieben (sofort während dem ziehen) habe ich nicht zufriedenstellend hin bekommen.

Das ist so noch nicht perfekt, aber auf jeden Fall ausreichend funktionsfähig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz