2011-05-24 15 views
11

Me gustaría poner algunos botones entre dos paneles redimensionables o directamente en el divisor si es posible. Cómo logro que se moverán junto con el divisor; ¿Cómo los anclaré?¿Cómo crear componentes que contienen divisores?

screenshot

Editar:
Tal vez lo más importante que me olvidé de mencionar. Ese divisor debe ser tan ancho como en la captura de pantalla, y los botones deben colocarse sobre él; entonces esos botones en realidad están "flotando sobre el divisor" ahora.

Muchas gracias

+4

Dado que 'TSplitter' no es un control de ventana, no puede colocar controles sobre él. Yo abandonaría el 'TSplitter' por completo, y usaría un' TPanel' y escribiría alguna lógica que lo haga funcionar como un divisor. Esto es probablemente bastante fácil, pero dado que no tengo ningún compilador Deplhi IDE/RTL/disponible en este momento, no puedo hacer un intento (al menos no ahora). –

+1

@Andreas No es así como lo haces. Necesita usar un divisor y un panel. Así es como funcionan los divisores. –

+1

@Andreas Por otro lado, pareces haber entendido la pregunta y yo no. Lo leí y volví a leer, pero no puedo entender cómo lo hiciste, ¡pero parece que has entendido el significado de la Q! –

Respuesta

6

Yo no puedo hacerlo automáticamente.
Manualmente puede cambiar la propiedad Izquierda de los botones en el evento OnMoved del divisor.
No hay una buena solución (la visualización en el momento del arrastre no es buena), pero puede hacer el resultado que necesita. Puede resolver esto, intente ResizeStyle = rsUpdate; Con esto cuando arrastra el divisor, los botones se mueven también.

procedure TForm1.Splitter1Moved(Sender: TObject); 
begin 
    SpeedButton1.Left := Splitter1.Left + 40; 
    SpeedButton2.Left := Splitter1.Left + 40; 
    SpeedButton3.Left := Splitter1.Left + 40; 
    SpeedButton4.Left := Splitter1.Left + 40; 
end; 

Here you can view el resultado.

Saludos

+0

Eso es lo que estaba pensando en lugar de un intento de escribir mi propio control. Es una solución un poco sucia pero está funcionando; He intentado lo mismo antes de preguntar aquí. Así que +1 (mañana) para leer mi mente :) –

5

Aquí hay una captura de pantalla de mi aplicación:

Esta forma tiene una sola TSplitter situada a la derecha de la vista de árbol en el panel de la izquierda. A la derecha del divisor hay un TPanel que contiene el botón.

aquí está en tiempo de diseño y se puede ver el divisor dibujado con una línea discontinua:

El truco es que el divisor no contiene controles-para que utilice un panel.

Por lo tanto, usando su nombre, necesita reemplazar Splitter1 con un panel para contener los botones y agregar un divisor entre Panel1 y el nuevo panel. Los paneles izquierdo y medio y el divisor están alineados alLeft y el panel de la manija derecha está alineado alClient. Conjunto splitter1.autosnap:= false

+0

El problema es que quiero que los usuarios arrastren todo el panel entre los paneles. Sé que no tiene un comportamiento común, pero eso es lo que el resto del proyecto ya es. Del mismo modo, no me gusta cuando el divisor es demasiado estrecho, así que debes enfocarte para arrastrarlo por un tiempo. Olvidé mencionar esto en mi pregunta; así que lo agregaré allí. +1 cuando obtuve algunos puntos mañana. –

+0

-1 Por ahora, probé esto pero el divisor no se queda entre dos paneles alineados a la izquierda. – Johan

+1

@Johan Gracias por el voto negativo, pero es usted el que ha cometido el error, me temo. –

1

Puede anidar paneles uno dentro del otro.

+--------------+#+------------+ 
|+---------+ p |#| panel3 | 
|| panel1 | a |#|   | 
||   | n |#|   | 
||   | e |#|   | 
||   | l |#|   | 
||   | 2 |#|   | 

donde # es el divisor.

Coloque los botones en el lado derecho del panel2.
O aún mejor poner un panel4 extra en panel2, hacen que

panel4.align:= alRight; 
panel1 align:= alClient; 
panel2.Align:= alClient; 
splitter1.align:= alright or alLeft //experiment here 
panel3.Align:= alRight; 

Esto debe hacer el truco.

+0

¿Por qué necesita anidar aquí? –

+0

@David la alineación de los paneles permitirá que panel1 y panel3 cambien de tamaño con el divisor mientras mantiene el panel2 en un tamaño fijo. Hay otras maneras de hacerlo, pero me gusta anidar paneles. Y funciona en todas las versiones de Delphi, sin requerir código. – Johan

+0

@Johan No necesita anidar paneles para lograr lo que desea sin requerir código. –

1

Hay un aviso importante. Ambos paneles entre Splitter deben tener el mismo parámetro AlignWithMargins. (Ambos son verdaderos o ambos son falsos).De lo contrario, el divisor no funciona. Luché con este problema durante unos días

Cuestiones relacionadas