![]() |
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; |
Re: Reihenfolge TToolbutton
Doppelte Tags sollten eigentlich kein Problem darstellen, die zugehörigen Buttons wurden bei meinen Versuchen richtig einsortiert und behalten ihre ursprüngliche Reihenfolge.
Die Notwendige Bedingung für eine Endlosschleife ist das Vertauschen mindestens eines Button-Paares in einem Durchlauf. Möglicherweise reicht die Anweisung zum Setzen von btn2.Left in Delphi 3 nicht aus, um die Buttons wirklich zu vertauschen. Beim nächsten Durchlauf würde dann ein neuer Versuch gestartet. Ich konnte nur mit Delphi 6 testen. Versuche einmal folgende Änderung:
Delphi-Quellcode:
Vielleicht kann man damit das Vertauschen eher erzwingen.
// btn2.Left := btn1.Left;
btn2.Left := btn1.Left - 2; Gruß Hawkeye |
Re: Reihenfolge TToolbutton
Liste der Anhänge anzeigen (Anzahl: 1)
@garfield, hab das haupt-problem rausgefunden, denk ich :)
ich hab tb.wrapable auf true (wills eigentlich auch so haben ;) ), mit wrapable:=true funktioniert es wunderbar ttoolbar hat ja keine scrollbars, ich könnte zwar evtl. welche basteln und per scrollby agieren, aber halte ich für zu aufwendig ;) habs auch noch nicht hinbekommen ;( @hawkeye die Änderung bringt leider keine Besserung ;( //edit hab das mit den Scrollbars hinbekommen, aber würde trotzdem lieber das wrapable auf true, vielleicht gibts ja doch irgendeine Möglichkeit die Reihenfolge mit wrapable=true zu ändern wens interessiert, ich hab das test-projekt mal angehängt (hab nicht viel zur scrollbar-steuerung gefunden) Gruß Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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