Pregunta

Sé que controles sin ventanas no son mágicas . Un control sin ventana puede tener el foco de entrada (por ejemplo, Internet Explorer). foco de entrada no es más que el dibujo sea:

y cuando el usuario comienza maceración llaves, reaccionar de manera apropiada. Usted sabe las pulsaciones de teclado son para que control de centrado, porque ese es el control tiene el foco.

En el caso de mi ventana (Windows®), que tendría que saber que mi hijo un control sin ventanas (vamos a pretender es un descendiente de TGraphicControl) obtiene el teclado eventos. Así que durante mi forma de OnKeyDown, OnChar, OnKeyUp, que tendría que fingir que van a mi hijo un control sin ventanas.

¿Qué puedo hacer, pero es un dolor.

Pero entonces el usuario es probable que desee utilizar pestaña de navegación , y voy a tener que de alguna forma de intercepción atención de pedidos control de pestañas normales de Delphi, y el gancho en mí mismo para decir que esto es la siguiente (y anterior) en el orden de tabulación.

¿Qué puedo hacer, pero es un dolor.

Y luego está ActiveControl, que no entiende nada, excepto TWinControl de. Así que si alguna vez Delphi trata de averiguar quién tiene el foco, se volvería loco. Así que tendría que tener una implementación alternativa de ActiveControl.

¿Qué puedo hacer, pero es un dolor.

En otras palabras:? es esto demasiado trabajo Estoy luchando eveything que Delphi es, todo lo que puede tener unos controles docena de ventanas accesibles a través de la entrada de teclado? El Delphi no contempla el uso de los diseñadores de controles sin ventanas interactivas, y si lo intento ahora para trabajar en ella, sólo voy a atrapado en el hurtlocker ?

Delphi me dio la oportunidad de ayudar a mi gusto, pero he elegido el camino del dolor.


Algunos explicación más detallada de controles sin ventanas se necesita.

No todo el control que interactúan con tiene que ser un control de Windows. Es muy posible tener foco en, y enviar a la entrada de teclado, un control que no es una ventana de Windows.

Por ejemplo, casi todos los controles que se ve en una ventana del navegador Internet Explorer es un control sin ventanas. En la siguiente captura de pantalla se puede ver un editar de control, que se puede escribir, y un botón que (en esta captura de pantalla) tiene el foco:

alt text

Se puede ver el rectángulo de selección de puntos, y el botón es azulado (que en Windows indica que tiene el foco).

Si volviera a presione barra espaciadora mientras que el botón Google Search tiene el foco, lo haría pulse en el botón. La razón por la que esto funciona es porque Microsoft escribió toda una librería de widgets de los controles. Estos controles se ven y se sienten (casi) exactamente igual que los controles comunes regulares -. Que son clones casi exactas de los controles comunes de Windows, que se aplica abajo a la derecha a los temas

Mozilla Firefox y Google Chrome también utilizan una librería de widgets de los controles. No utilizan de Microsoft incorporado controles de ventana, pero en lugar de utilizar una biblioteca de gráficas, interactivas, sin ventanas los widgets .

Y si usted tiene un entorno de desarrollo adecuado, entonces elwidgets de ventanas funcionan igual que los controles "normales" ventana. GTK + es una librería de widgets, y Glade es un IDE que le permite Disposición controles en esa librería de widgets.

No sé en qué entorno de desarrollo de Firefox, Chrome o Blender fueron creados, pero sus reproductores compatibles con los controles sin ventanas.


Así que ahora a mi pregunta.

Si no me equivoco, me parece que, aunque Delphi es compatible con una TControl base, (que tiene una anchura, altura y puede pintarse), no puede recibir el foco del teclado. Me parece que nunca se Borland Delphi diseñado VCL como una librería de widgets genéricos. La única prueba que tengo que apoyar esto es que ActiveControl de un formulario es una TWinControl:

property ActiveControl: TWinControl;

Eso no significa que Delphi podría ser, o debe ser, limitado a controles de ventana. La biblioteca de VCL Reproductor podría extenderse a apoyar dando foco en los controles sin ventanas.

Pero quizás Delphi ya es compatible con los controles sin ventanas , y simplemente no se dan cuenta? ¿Existe ya un mecanismo establecido en Delphi para apoyar dando un enfoque a TControl de? Pero yo soy un tipo bastante inteligente, y estoy bastante seguro de VCL de Delphi no puede hacer lo que otras bibliotecas de widgets pueden hacer.

que luego lleva a otra pregunta:? la cantidad de trabajo sería estar a formas de subclases y tal para apoyarlo ¿Hay alguien más por ahí, tal vez alguien en TeamB, que es mucho más inteligente que yo, que ya se ha probado, y llegar a la conclusión de que es imposible

lo que estoy pidiendo ahora, desde el principio, si se trata de añadir soporte de control de ventanas es maldito casi imposible (es decir inútil) - de modo que yo no paso semanas en él para nada. Estoy tratando de aprovechar los conocimientos de una comunidad de desarrolladores Delphi.

estoy haciendo una pregunta.

¿Fue útil?

Solución

Es inútil acumulación controles sin ventanas y encajar en el marco VCL de Delphi.

abrir Internet Explorer como un ejemplo. Pero en ese caso, es completamente responsable de todo lo que reside en ella. Tiene su propia noción interna de lo que es el control activo, pero pensar en cómo se ve desde el exterior: Es sólo un mando gigante. Cuando usted le pide al sistema operativo que tiene el foco, el control solo navegador lo tiene, no importa cuál de subcontroles de tu navegador aparece para tener el foco.

Cuando se pulsa Tab, parece que el sistema operativo como si el navegador simplemente ha consumido un carácter de tabulación, al igual que lo hacen los controles de edición. Controles de edición mover el cursor por encima de unos espacios y añadir caracteres de tabulación a sus buffers internos; controles del navegador mover el cursor a otra región de la pantalla.

usted está pensando en hacer todo esto en un Delphi TForm. las formas de Delphi ya tienen un marco para gestionar el control activo y gastos de pulsaciones de teclas, y vas a tener que luchar contra todo. Si desea que los controles sin ventanas, ir a la ruta de Internet Explorer y construir su propio control contenedor para sostenerlos para que pueda seguir a cargo de todo lo que sucede en su interior.

Su recipiente puede ser un control de VCL, pero las cosas que pones en él, probablemente, no puede - que todavía estaré esperando para usar el VCL FOCUS- y las reglas de manejo de teclado. Observe cómo no se puede poner controles ordinarios de Windows en Internet Explorer, tampoco. Cualquier cosa que puso en su lugar tiene que ir a través de interfaces específicas ActiveX. Tal vez usted necesita las interfaces, también, o tal vez lo que puede hacer su propio conjunto de clases de control que descienden de alguna clase ancestro especial se diseña para trabajar con su contenedor. No comenzar con TGraphicControl; que es demasiado arraigada en la VCL para ser utilizable como base para la biblioteca de control de rama.

Será una gran cantidad de trabajo, pero, de nuevo, por lo que era Internet Explorer.

Otros consejos

Sí, es inútil.
Y no es culpa de Delphi, sólo estás luchando contra el propio Windows.
Si necesita un control que se comporta como un control con ventana, con ventanas utilizan un uno.
Y tienes razón, tratando de recrear toda la pila API de controles de ventana desde cero es un dolor.

Sí, prácticamente tienen todo resuelto. El uso de controles de medios sin ventanas que se pierde todo lo que Windows puede hacer para ayudarle. Tener más de una pareja en una sola ventana real es el dolor.

La mayoría de estos programas fueron muy probablemente no desarrollado originalmente usando herramientas de tipo RAD así que no tenía más remedio que volver a inventar la rueda. Una de las mayores ventajas de Delphi es el componente de apoyo del partido profunda VCL y 3 para proporcionar el aspecto deseado.

Una de las técnicas que he utilizado con gran éxito para reducir la cantidad de identificadores de ventana utilizados en un (preparación de impuestos) compleja aplicación basada formar era para dibujar el texto en un lienzo, y se movió un solo decendant TCustomEdit a la posición del usuario fue la edición. Fue trivial para capturar las teclas TAB / arriba / abajo y mover la edición en la posición adecuada. El reto que descubrimos fue en la elaboración de un rectángulo caliente alrededor del ratón se cernió campo. Terminamos con una matriz de rejilla de TObject, donde el elemento de la matriz sería nula (sin campo), un TList (rejilla contiene varios campos) o un una clase que contenía nuestro descriptor de campo. Esto redujo la cantidad de comprobaciones de rango tuvimos que realizar ya que era más probable que la caja sólo contenía un único campo, o en la mayoría de los 4 campos.

fpGUI Toolkit es un ejemplo de lo que quiere. El último código fpGUI en el repositorio de código fuente se basa en un diseño multi-ventana. Eso significa sencilla Todos los artilugios / componente tiene un identificador de ventana, pero Windows o Linux no hace nada con esa ventana, otra que los mensajes de notificación básicos (MouseEnter, mouseexit, etc). fpGUI todavía tiene un control total sobre la que cada componente se va, si son enfocable, cómo se ven etc. Algunos widgets / componentes en fpGUI son componentes sin ventanas también. por ejemplo:. TfpgScrollbar, TfpgMainMenu, el botón en un ComboBox etc

Si desea una verdadera versión sin ventanas, media sólo hay una ventana de nivel superior que tiene un identificador de ventana, todos los otros widgets / componentes dentro de esa ventana en realidad no existe en el sistema operativo (no tienen identificadores de ventana ), entonces fpGUI puede ayudar también. El diseño inicial de fpGUI Toolkit se basó en un diseño de este tipo. Una vez más, busque en el repositorio de código fuente de la rama v0.4 de código. I que diseño, fpGUI tenía que manejar absolutamente todo, creando MouseEnter / eventos MouseLeave, traducir sistemas de coordenadas para los componentes de contenedores, mango (falsos) se centran componente afirma etc ... Si el diseño inicial es un montón de trabajo, pero luego contar con un marco muy portátil que puede ser fácilmente aplicada a otros sistemas operativos también.

Y sí, fpGUI está totalmente implementado en el lenguaje Object Pascal utilizando el compilador Free Pascal que me diera soporte multiplataforma. Actualmente fpGUI se ejecuta en Windows, Linux (32 y 64 bits), Windows Mobile y dispositivos embebidos Linux (ARM).

No tengo ni idea de lo que realmente es su problema, aquí, pero creo que esta pequeña historia puede ser relevante ...

Tenemos una aplicación que llena una docena de formas. El usuario puede rellenar formularios adicionales, y también los valores de cambio rellenados por la aplicación en sí.

Ahora, en nuestra primera aplicación, utilizamos componentes de ventana para cada campo de entrada única, por lo que los campos podrían recibir selecciones y entradas. Que resultó ser un gran problema, porque todo esto ventanas tomó una gran cantidad de recursos.

Ahora tenemos controles sin ventanas para cada campo de entrada. Eso significa que todo lo que terminan con, es un dibujo combinado de la forma y sus campos de entrada. Cuando el usuario hace clic en el interior del dibujo, o utiliza algunos golpes de teclado para mover / enfoque conjunto, creamos un nuevo control con ventana para el campo se ha hecho clic. Cuando el usuario se mueve al siguiente campo de entrada, que destruyen la primera ventana, y crear una nueva. De esta manera sólo tenemos un control con ventana que de nuevo nos dio una buena mejora de velocidad.

Una vez más - no tengo ni idea de lo que realmente desea administrar. TWinControl es un TWinControl por una razón, pero no puede ser una solución a lo que quiere, lo que cada vez que sería ...

fgGUI pueden serle de ayuda.

Wiki primero.

creo que se puede utilizar este marco para su aplicación en Delphi como está escrito totalmente en Pascal. En realidad, se basa en FreePascal;)

HTH

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top