Beim Probelauf fallen die Schuppen von den Augen:
while j< tb.buttoncount-1 do
ist falsch. Entweder
while j<= tb.buttoncount-1 do
oder
while j< tb.buttoncount do
muss da stehen, weil der letzte Toolbutton sonst nicht einsortiert wird.
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;