![]() |
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...) |
Re: TTabControl - Drag and Drop?
|
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 :-( |
Re: TTabControl - Drag and Drop?
Also nach etwas nachdenken und rumprobieren habe ich das ganze (erstmal) so gelöst:
Delphi-Quellcode:
Das ganze sieht dann zwar nicht sooo spektakulär aus, aber es funktioniert ;-)
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; |
Re: TTabControl - Drag and Drop?
Guten Morgen,
hier noch die von mir angepasste Version zum Vergleichen:
Delphi-Quellcode:
Freundliche Grüße
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; |
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? |
Re: TTabControl - Drag and Drop?
Hallo Gereon,
nimm statt Exchange() besser Move() - und die Einstellungen müssen die Default-Werte sein. Viel Spaß |
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. |
AW: TTabControl - Drag and Drop?
Falls jemand nochmal so etwas sucht, ich habe mich jetzt hieran orientiert:
![]() Den DragMode habe ich auf dmManual und dafür:
Delphi-Quellcode:
Ein dynamisches Verschieben (sofort während dem ziehen) habe ich nicht zufriedenstellend hin bekommen.
procedure TFormPlan.MyTabControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin (Sender as TTabControl).BeginDrag(False, 3); end; Das ist so noch nicht perfekt, aber auf jeden Fall ausreichend funktionsfähig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 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