AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Reihenfolge TToolbutton

Ein Thema von _frank_ · begonnen am 27. Mai 2007 · letzter Beitrag vom 27. Mai 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#1

Reihenfolge TToolbutton

  Alt 27. Mai 2007, 12:46
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
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#2

Re: Reihenfolge TToolbutton

  Alt 27. Mai 2007, 14:35
Benutze doch Actions und weise den Toolbuttons in der gewünschten Reihenfolge Actions zu.
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#3

Re: Reihenfolge TToolbutton

  Alt 27. Mai 2007, 15:15
kann keine Actions verwenden, da es das unter D3 nicht gibt...

Gruß Frank
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#4

Re: Reihenfolge TToolbutton

  Alt 27. Mai 2007, 15:54
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.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#5

Re: Reihenfolge TToolbutton

  Alt 27. Mai 2007, 16:22
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
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#6

Re: Reihenfolge TToolbutton

  Alt 27. Mai 2007, 17:41
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 von _frank_:
      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.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#7

Re: Reihenfolge TToolbutton

  Alt 27. Mai 2007, 17:54
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
Angehängte Dateien
Dateityp: zip componentpalette_777.zip (134,8 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#8

Re: Reihenfolge TToolbutton

  Alt 27. Mai 2007, 18:35
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;
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Reihenfolge TToolbutton

  Alt 27. Mai 2007, 19:00
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
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#10

Re: Reihenfolge TToolbutton

  Alt 27. Mai 2007, 19:30
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:50 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