2010-11-04 3 views
10

Mam problem z tworzeniem TToolbuttons w środowisku wykonawczym i sposobie ich wyświetlania w moim TToolbar.Utwórz środowisko wykonawcze TToolbutton

Zasadniczo mam już pasek narzędzi z kilkoma przyciskami. Mogę tworzyć przyciski w środowisku wykonawczym i ustawić obiekt nadrzędny na pasku narzędzi. Są one jednak zawsze wyświetlane jako pierwsze przyciski na pasku narzędzi.

Jak mogę je wyświetlić na końcu mojego paska narzędzi? Lub dowolne stanowisko, jakie chcę, aby były.

Odpowiedz

15

Oto procedura generic że bierze pasek i dodaje przycisk do niej, z określonym podpisie left:

procedure AddButtonToToolbar(var bar: TToolBar; caption: string); 
var 
    newbtn: TToolButton; 
    lastbtnidx: integer; 
begin 
    newbtn := TToolButton.Create(bar); 
    newbtn.Caption := caption; 
    lastbtnidx := bar.ButtonCount - 1; 
    if lastbtnidx > -1 then 
    newbtn.Left := bar.Buttons[lastbtnidx].Left + bar.Buttons[lastbtnidx].Width 
    else 
    newbtn.Left := 0; 
    newbtn.Parent := bar; 
end; 

A oto przykład wykorzystania tej procedury:

procedure Button1Click(Sender: TObject); 
begin 
    ToolBar1.ShowCaptions := True; //by default, this is False 
    AddButtonToToolbar(ToolBar1,IntToStr(ToolBar1.ButtonCount)); 
end; 

Twoje pytanie również pyta, jak dodać przycisk do dowolnego miejsca na pasku TToolbar. Ten kod jest podobny do wcześniejszego, ale pozwala także określić, który indeks ma zostać wyświetlony jako nowy po.

procedure AddButtonToToolbar(var bar: TToolBar; caption: string; 
    addafteridx: integer = -1); 
var 
    newbtn: TToolButton; 
    prevBtnIdx: integer; 
begin 
    newbtn := TToolButton.Create(bar); 
    newbtn.Caption := caption; 

    //if they asked us to add it after a specific location, then do so 
    //otherwise, just add it to the end (after the last existing button) 
    if addafteridx = -1 then begin 
    prevBtnIdx := bar.ButtonCount - 1; 
    end 
    else begin 
    if bar.ButtonCount <= addafteridx then begin 
     //if the index they want to be *after* does not exist, 
     //just add to the end 
     prevBtnIdx := bar.ButtonCount - 1; 
    end 
    else begin 
     prevBtnIdx := addafteridx; 
    end; 
    end; 

    if prevBtnIdx > -1 then 
    newbtn.Left := bar.Buttons[prevBtnIdx].Left + bar.Buttons[prevBtnIdx].Width 
    else 
    newbtn.Left := 0; 

    newbtn.Parent := bar; 
end; 

A oto przykład użycia tej poprawionej wersji:

procedure Button1Click(Sender: TObject); 
begin 
    //by default, "ShowCaptions" is false 
    ToolBar1.ShowCaptions := True; 

    //in this example, always add our new button immediately after the 0th button 
    AddButtonToToolbar(ToolBar1,IntToStr(ToolBar1.ButtonCount),0); 
end; 

Powodzenia!

+5

Aargh ... robimy to samo, poza tym, że przypisuję Parent przed wartością Left. I zepsuł układ. Twoja jest odwrotna, a teraz jestem szczęśliwy. Dzięki ! – Rick

+0

@Roderick: cieszę się, że pomogło! Poprawiłem odpowiedź, dodając możliwość dodania do dowolnego punktu na pasku TToolbar. – JosephStyons

+2

@JosephStyons: Dzięki za to. Próbowałem dodać TToolButtons w czasie wykonywania, a moja pierwsza próba nie działała poprawnie. Zamiast marnować czas, postanowiłem szybko wyszukać tutaj i znaleźć Twój wpis. Zaoszczędził mi trochę czasu. :) +1 –

0

Jeśli działa podobnie do panelu przewijania, można ustawić właściwość .left na 1 o więcej niż jeden przycisk, aby umieścić go po lewej stronie tego przycisku. Lub ustaw właściwość .left na 1 mniejszą niż przycisk, aby umieścić ją na prawo od tego przycisku.

2

Można użyć właściwości komponentu TToolButton

check ta próbka

//adding buttons to the end of the ToolBar. 
procedure TForm1.Button1Click(Sender: TObject); 
var 
Toolbutton : TToolButton; 
begin 
    Toolbutton :=TToolButton.Create(ToolBar1); 
    Toolbutton.Parent := ToolBar1; 
    Toolbutton.Caption := IntToStr(ToolBar1.ButtonCount); 
    Toolbutton.Left := ToolBar1.Buttons[ToolBar1.ButtonCount-1].Left + ToolBar1.ButtonWidth; 
end; 
+0

co to jest "ToolBar1.Buttons [-1]"? – nurettin