Создать среду выполнения TToolbutton

У меня проблема с созданием TToolbuttons во время выполнения и тем, как они отображаются в моем TToolbar.

По сути, у меня уже есть панель инструментов с некоторыми кнопками. Я могу создавать кнопки во время выполнения и устанавливать родителя на панель инструментов. Но они всегда отображаются первыми кнопками на моей панели инструментов.

Как сделать так, чтобы они отображались в конце панели инструментов? Или любое положение, которое я хочу, чтобы они были.


person Rick    schedule 04.11.2010    source источник


Ответы (3)


Вот общая процедура, которая берет панель инструментов и добавляет к ней кнопку с указанным заголовком:

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;

А вот пример использования этой процедуры:

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

Ваш вопрос также касается того, как добавить кнопку в произвольное место на TToolbar. Этот код похож на предыдущий, но он также позволяет вам указать, какой индекс вы хотите, чтобы новая кнопка отображалась после.

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;

А вот пример использования этой исправленной версии:

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;

Удачи!

person JosephStyons    schedule 04.11.2010
comment
Ааа... мы делаем то же самое, за исключением того, что я назначаю Parent перед значением Left. И это портило макет. У вас все наоборот, и теперь я счастлив. Спасибо ! - person Rick; 04.11.2010
comment
@Roderick: рад, что это помогло! Я пересмотрел ответ, включив в него способ добавления произвольной точки на TToolbar. - person JosephStyons; 04.11.2010
comment
@JosephStyons: Спасибо за это. Я хотел добавить TToolButtons во время выполнения, и моя первая попытка не сработала должным образом. Чтобы не тратить время зря, я решил сделать быстрый поиск здесь, и нашел ваш пост. Сэкономил мне время. :) +1 - person Ken White; 01.10.2011
comment
@JosephStyons: Та же история, что и у Кена. Я рад, что это появилось в верхней части поиска Google для добавления кнопки на панель инструментов. Это именно то, что мне нужно. - person Mason Wheeler; 24.08.2012

Вы можете использовать свойство left компонента TToolButton.

проверить этот образец

//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;
person RRUZ    schedule 04.11.2010
comment
что такое ToolBar1.Buttons[-1]? - person nurettin; 05.04.2017

Если он работает как панель прокрутки, вы можете установить свойство .left на 1 больше, чем кнопка, чтобы поместить его слева от этой кнопки. Или установите свойство .left на 1 меньше, чем кнопка, чтобы поместить ее справа от этой кнопки.

person Community    schedule 04.11.2010