2009-10-12 21 views
5

Por favor, echar un vistazo a esta pantalla¿Implementando un control de 'panel de etiqueta' en Delphi?

alt text http://www.maclife.com/files/u18/Yep3-big.jpg

Creo que estas son las principales características de un 'panel de etiquetas' como:

1) Cada etiqueta en el panel es un control independiente y puede haga clic en

2) Ajuste de línea automático cuando no hay espacio suficiente para mostrar la siguiente etiqueta en la línea actual.

3) El borde del rectángulo de la esquina redondeada para cada etiqueta es una característica agradable de tener.

Quiero implementar la función similar en Delphi, ¿hay un control existente para hacer esto? Si no, ¿cuál es la mejor manera de implementar dicho control?

Gracias.

+0

Otro ejemplo de un 'panel de etiquetas': http://www.macgenealogy.org/ images/screen/yep-list.jpg Puede consultar la sección de etiquetas a la derecha. –

Respuesta

3

Cada etiqueta que se puede hacer clic no necesariamente tiene que ser su propio control. Simplemente tiene que ser una región en la que puede detectar que se haga clic.

Supongamos que representa cada área como Windows region. Puede averiguar qué tan ancho debe estar cada uno en función de su texto con la función TCanvas.TextExtent. Luego crea una región con una función como CreateRectRgn. Para las esquinas redondeadas, intente con CreateRoundRectRgn. Puede probar los eventos del mouse en cada región con la función PtInRegion. Puede pintar bordes a su alrededor con FrameRgn. El último obstáculo es dibujarlos en la pantalla para que quepan todos. Está creando las regiones y conoce su ancho, así que asigne etiquetas a una fila hasta que se quede sin espacio, y luego inicie la siguiente línea.

+0

gracias por la pista Rob. ¿Tiene algún consejo si quiero que estas etiquetas puedan reposicionarse mediante arrastrar y soltar? Por ejemplo, arrastre la segunda etiqueta en la línea 2 y suelte al comienzo de la línea 1. Gracias. –

+0

Detecta mouse-down y suficientes eventos de movimiento del mouse para diferenciar entre un arrastre y un clic, y luego llama a 'SetCapture' para entrar en el modo" arrastrar ". Maneje los eventos de movimiento del mouse mientras espera un evento de mouse, en cuyo punto puede volver a ordenar las etiquetas. (Toda esta pregunta es una pregunta general. Si tiene preguntas específicas sobre algo, comience una * nueva * pregunta, donde la gente puede responder sin tener que cubrir media docena de problemas diferentes en una sola respuesta.) –

7

Cuando está en una versión reciente de Delphi use un TFlowPanel y algunos controles apropiados para las etiquetas. Un simple TButton o un TLinkLabel deberían hacer eso.

+0

Gracias Uwe, desafortunadamente , Uso D7. La actualización no es actualmente una opción. –

1

Existen dos posibles soluciones para la alineación personalizada en Delphi 7. Puede hacer su propio panel de flujo derivando de TCustomPanel y reemplazar el método AlignControls(), o puede establecer la alineación en alCustom y manejar OnAlignPosition-event.

Supongo que habría elegido la opción TCustomPanel-derivada. TFlowPanel en forma Delphi 2007 usa esa opción; tengo que admitir, sin embargo, que nunca he probado mi yo ...

+0

gracias por la pista, Vegar :) –

Cuestiones relacionadas