Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Reihenfolge TToolbutton (https://www.delphipraxis.net/92845-reihenfolge-ttoolbutton.html)

_frank_ 27. Mai 2007 11:46


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:
  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;
Gruß Frank

bttb930 27. Mai 2007 13:35

Re: Reihenfolge TToolbutton
 
Benutze doch Actions und weise den Toolbuttons in der gewünschten Reihenfolge Actions zu.

_frank_ 27. Mai 2007 14:15

Re: Reihenfolge TToolbutton
 
kann keine Actions verwenden, da es das unter D3 nicht gibt...

Gruß Frank

Garfield 27. Mai 2007 14:54

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.

_frank_ 27. Mai 2007 15:22

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:
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;
Gruß Frank

Garfield 27. Mai 2007 16:41

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:

Zitat von _frank_
Delphi-Quellcode:
      tbtn.left:=tbtn.tag*tb.buttonWidth+1;

Die Anweisung wird nie ausgeführt, weil Left ein Vielfaches von ButtonWidth sein muss. Erster ToolButton hat Left = 0. Nach der Formel wäre Left = 1.

_frank_ 27. Mai 2007 16:54

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

Garfield 27. Mai 2007 17:35

Re: Reihenfolge TToolbutton
 
Beim Probelauf fallen die Schuppen von den Augen:

Delphi-Quellcode:
      while j< tb.buttoncount-1 do
ist falsch. Entweder

Delphi-Quellcode:
      while j<= tb.buttoncount-1 do
oder
Delphi-Quellcode:
      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;

Hawkeye219 27. Mai 2007 18:00

Re: Reihenfolge TToolbutton
 
Hallo Frank,

hier ist ein anderer Ansatz ("Vertauschen, bis nichts mehr vertauscht werden kann"):

Delphi-Quellcode:
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;
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.

Gruß Hawkeye

_frank_ 27. Mai 2007 18:30

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:
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;
Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:47 Uhr.
Seite 1 von 2  1 2      

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