![]() |
Reihenfolge TToolbutton
Moin,
gibt es eine Möglichkeit zur Laufzeit die Reihenfolge der Toolbuttons in einer Toolbar zu ändern? Hab da irgendwie noch nicht wirklich etwas gefunden...die left-eigenschaft funktioniert auch nicht wie gewünscht. hier mein bisheriger Versuch (in toolbutton.tag steht die Position (0,1,2,...)):
Delphi-Quellcode:
Gruß Frank
for i:=0 to pagecontrol1.PageCount-1 do
begin tb:=(Pagecontrol1.Pages[i].Controls[0] as TToolbar); for j:=0 to tb.ButtonCount-1 do begin tbtn:=tb.Buttons[j]; if tbtn.tag<>-1 then tbtn.Left:=tbtn.tag*tb.ButtonWidth; end; end; |
Re: Reihenfolge TToolbutton
Benutze doch Actions und weise den Toolbuttons in der gewünschten Reihenfolge Actions zu.
|
Re: Reihenfolge TToolbutton
kann keine Actions verwenden, da es das unter D3 nicht gibt...
Gruß Frank |
Re: Reihenfolge TToolbutton
Moin, Moin, ich verstehe nicht so richtig, warum Du tbtn und tb verwendest. Aber egal. Die Positionsänderung funktioniert schon. Nachdem was ich eben gesehen habe, solltest Du die Positionierung in der Reihenfolge der Tags vornehmen, weil die Toolbutton ab der angegebenen Position nach rechts verschoben werden. Heißt setzt Du beispielsweise ein Toolbutton von Platz drei auf zwei und dann den von Platz vier auf Platz eins wandert der von Platz zwei wieder auf Platz drei.
|
Re: Reihenfolge TToolbutton
hi,
tb und tbtn nehm ich halt um den pointer auf das aktuelle Objekt zwischenzuspeichern, die variablen hab ich eh schon deklariert, da ich die auch für die erstellung der Buttons/toolbars verwende. Es sieht außerdem schöner aus als tb.Buttons[j].tag und mit "with" will ich nicht hantieren, da man da ganz schnell blöde Fehler reinbekommt... zum eigentlichen Problem: ich denke ich verstehe, wie es gemeint ist, jedoch fällt mir spontan keine lösung ein, um performant dies zu realisieren. so in etwa würde das wohl gehen (genauso leider nicht):
Delphi-Quellcode:
Gruß Frank
for i:=0 to tb.buttoncount -1 do
begin j:=i; while j< tb.buttoncount-1 do begin tbtn:=tb.buttons[j]; if tbtn.tag=i+1 then begin tbtn.left:=tbtn.tag*tb.buttonWidth+1; j:=tb.buttoncount-1; end; inc(j); end; end; |
Re: Reihenfolge TToolbutton
Was hältst Du von:
Delphi-Quellcode:
for i := 0 to tb.ButtonCount - 1
do begin j := 0; while (tb.Buttons[j].Tag <> i) and (j < tb.ButtonCount - 1) do inc (j); if tb.Buttons[j].Tag = i then begin tbtn := tb.Buttons[j]; tbtn.Left := tbtn.Tag * tb.ButtonWidth; end; end; Zitat:
|
Re: Reihenfolge TToolbutton
Liste der Anhänge anzeigen (Anzahl: 1)
hi Garfield,
ich hab das auch schon ohne +1 ausprobiert sowie mit -1, ohne erfolg... hab deinen code auch mal probiert, funktioniert leider auch nicht ;( ich hab das komplette test-projekt mal angehangen... (die toolbar-icons hab ich hier mal gelöscht, aufgrund meiner noch offenen Frage betreffs Lizenzen ;( ) Gruß Frank |
Re: Reihenfolge TToolbutton
Beim Probelauf fallen die Schuppen von den Augen:
Delphi-Quellcode:
ist falsch. Entweder
while j< tb.buttoncount-1 do
Delphi-Quellcode:
oder
while j<= tb.buttoncount-1 do
Delphi-Quellcode:
muss da stehen, weil der letzte Toolbutton sonst nicht einsortiert wird.
while j< tb.buttoncount do
Und "mein" Code konnte nicht funktionieren, weil in Deinem Programm die entsprechende Zählvariable nicht i sondern b ist. Du hattest aber nur in der for-Anweisung das i gegen b ausgetauscht.
Delphi-Quellcode:
for b := 0 to tb.ButtonCount - 1
do begin j := 0; // <== hier wäre j := b; sinnvoller while (tb.Buttons[j].Tag <> i) and (j < tb.ButtonCount - 1) do inc (j); if tb.Buttons[j].Tag = i // <== da muss auch b stehen then begin tbtn := tb.Buttons[j]; tbtn.Left := tbtn.Tag * tb.ButtonWidth; end; end; |
Re: Reihenfolge TToolbutton
Hallo Frank,
hier ist ein anderer Ansatz ("Vertauschen, bis nichts mehr vertauscht werden kann"):
Delphi-Quellcode:
Buttons mit einem negativen Tag-Wert werden in der ursprünglichen Reihenfolge ans Ende der Toolbar gesetzt, alle anderen Buttons werden über ihren Tag-Wert aufsteigend angeordnet.
procedure OrderToolButtons (aToolBar: TToolBar);
var Index : Integer; btn1, btn2 : TToolButton; swapped : Boolean; begin repeat swapped := False; for Index := 0 to aToolBar.ButtonCount - 2 do begin btn1 := aToolBar.Buttons[Index]; btn2 := aToolBar.Buttons[Index + 1]; if (btn2.Tag < 0) then Continue else if ((btn1.Tag < 0) or (btn1.Tag > btn2.Tag)) then begin btn2.Left := btn1.Left; swapped := True; end; end; until (not swapped); end; Gruß Hawkeye |
Re: Reihenfolge TToolbutton
erstmal danke hawkeye
die procedure resultiert bei mir in einer endlosschleife ;( ich bin grade am debuggen, ich vermute mal, es liegt daran, dass das tag (mit meiner konfiguration) aktuell doppelt vorkommen kann (da ich die ID nehme)... //edit hab das tag-setzen mal bisschen verändert (trotzdem endlosschleife):
Delphi-Quellcode:
Gruß Frank
tbtn.tag:=ini.ReadInteger(sl.strings[i],'menu_pos',-1);
if tbtn.tag=-1 then begin if (idx>-1) and (idx<>99) then //99 ist mein "nicht vorhanden"-Imageindex,wird noch geändert ;) tbtn.tag:=idx else tbtn.tag:=tb.buttoncount; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 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