Delphi-PRAXiS

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

Hawkeye219 27. Mai 2007 18:50

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:
// btn2.Left := btn1.Left;
btn2.Left := btn1.Left - 2;
Vielleicht kann man damit das Vertauschen eher erzwingen.

Gruß Hawkeye

_frank_ 27. Mai 2007 19:18

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 11:10 Uhr.

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