2010-11-04 21 views
10

Tengo un problema al crear TToolbuttons en tiempo de ejecución y cómo aparecen en mi TToolbar.Create TToolbutton runtime

Básicamente ya tengo una barra de herramientas con algunos botones. Puedo crear botones en tiempo de ejecución y configurar el elemento primario en la barra de herramientas. Pero siempre se muestran como los primeros botones en mi barra de herramientas.

¿Cómo puedo hacer que aparezcan al final de mi barra de herramientas? O cualquier posición que quiero que sean.

Respuesta

15

Aquí es un procedimiento genérico que tiene una barra de herramientas, y añade un botón para que, con un título especificado:

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; 

Y aquí es ejemplo de uso de este procedimiento:

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

Su pregunta también le pregunta cómo agregar un botón a un lugar arbitrario en el TToolbar. Este código es similar al anterior, pero también le permite especificar en qué índice desea que aparezca el nuevo botón después de.

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; 

Y aquí es ejemplo de uso de esta versión revisada:

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; 

Buena suerte!

+5

Aargh .... estamos haciendo lo mismo, excepto que asigno el valor Parent antes del Left. Y estaba arruinando el diseño. Tu es inverso y ahora estoy feliz. Gracias ! – Rick

+0

@Roderick: ¡me alegro de que haya ayudado! Revisé la respuesta para incluir una forma de agregar a un punto arbitrario en TToolbar, también. – JosephStyons

+2

@JosephStyons: Gracias por esto. Estaba buscando agregar TToolButtons en tiempo de ejecución, y mi primer intento no funcionó correctamente. En lugar de perder el tiempo, decidí hacer una búsqueda rápida aquí y encontrar su publicación. Me salvó un poco de tiempo :) +1 –

0

Si funciona como el Panel de desplazamiento, puede configurar la propiedad .left para que sea 1 más que un botón para colocarlo a la izquierda de ese botón. O establezca que la propiedad .left sea 1 menos que el botón para colocarla a la derecha de ese botón.

2

Usted puede utilizar la propiedad left del componente TToolButton

cheque esta muestra

//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

¿Qué es 'ToolBar1.Buttons [-1]'? – nurettin