delphi user-interface console

delphi - Programa ambos como consola y GUI



user-interface console (5)

AttachConsole () se puede usar para mantener la consola de los padres. Por ejemplo, si la aplicación se inicia desde un shell de línea de cm, se puede evitar AllocConsole ():

if not AttachConsole(ATTACH_PARENT_PROCESS) then AllocConsole;

Más información aquí: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681952(v=vs.85).aspx

Esta pregunta ya tiene una respuesta aquí:

¿Es posible (y si es así, cómo hago) hacer que un solo programa funcione como una aplicación de consola y una versión de GUI usando Delphi 2007?

Lo que busco es que si el programa se ejecuta con las opciones de línea de comando adecuadas, debería funcionar como un programa de consola, imprimiendo la salida a la consola usando WRITELN, pero si no se dan argumentos de línea de comando debería ejecutarse como un Delphi normal. Aplicación GUI?

El inconveniente es que cuando se ejecuta como una aplicación de consola, el intérprete de línea de comandos espera a que la aplicación finalice antes de permitirte ingresar un nuevo comando, mientras que una aplicación GUI iniciada desde la línea de comando te devuelve inmediatamente a la línea de comando y la aplicación GUI se inicia en un proceso separado. Quiero este comportamiento retenido.

No me importa algo como esto:

SI GUI ENTONCES StartApplicationAsGUI (ParamStr (0))

es decir. No me importa que deba reiniciar la aplicación usando alguna forma de llamada EXECUTE para iniciarla en modo GUI si es necesario, siempre que la línea de comando vuelva a la entrada de la línea de comando cuando se inicie la versión de la GUI.

Preferiría una solución / sugerencia que esté en la línea de:

<Parse Comnand Line>
IF ConsoleMode ENTONCES
RunConsole (Parámetros)
ELSE BEGIN
Aplicación.Inicializar;
Application.CreateForm (...)
Aplicación.Ejecutar;
FIN

(o viceversa, es decir, hacer las cosas de una manera especial si el modo GUI)

para poder seguir usando el IDE y el VCL de Delphi al hacer la interfaz GUI ...


OMI, el mejor enfoque aquí es tener clases no visuales que realmente hagan el trabajo del programa. Luego puede llamarlo desde un programa GUI, y también puede llamarlo desde un programa de línea de comando separado. Ambos programas son solo envoltorios alrededor de la funcionalidad de su (s) clase (s).

Esto obliga al diseño a estar limpio también: sus clases están necesariamente separadas de la capa de GUI de su aplicación.


Windows tiene diferentes valores en el encabezado del ejecutable para la consola y la aplicación de interfaz de usuario (ver más detalles here ). Por lo tanto, parece imposible hacer funcionar el mismo ejecutable en ambos modos.

Como alternativa, puede abrir una consola en su aplicación de interfaz de usuario, pero será una nueva consola, no la que ha iniciado la aplicación.



En Windows esto es un poco complicado. En realidad, la distinción entre una aplicación de consola y una GUI es una sola bandera en el encabezado PE. Puede escribir fácilmente aplicaciones de consola que creen ventanas, pero de esa manera siempre tendrá la ventana de la consola (aunque podría ocultarla, pero eso no sería bueno cuando las personas ejecuten su programa desde cmd ).

Sin embargo , puede escribir una aplicación GUI que crea una consola si es necesario, utilizando la función AllocConsole :

Un proceso puede asociarse con una sola consola, por lo que la función AllocConsole falla si el proceso de llamada ya tiene una consola. Un proceso puede usar la función FreeConsole para separarse de su consola actual, luego puede llamar a AllocConsole para crear una nueva consola o AttachConsole para conectarse a otra consola.

Si el proceso de llamada crea un proceso secundario, el elemento secundario hereda la nueva consola.

AllocConsole inicializa la entrada estándar, la salida estándar y los identificadores de error estándar para la nueva consola. El identificador de entrada estándar es un identificador para el búfer de entrada de la consola, y los controles estándar de salida y error estándar se manejan en el búfer de pantalla de la consola. Para recuperar estos identificadores, use la función GetStdHandle .

Esta función es utilizada principalmente por la aplicación de interfaz gráfica de usuario (GUI) para crear una ventana de consola. Las aplicaciones GUI se inicializan sin una consola. Las aplicaciones de consola se inicializan con una consola, a menos que se creen como procesos separados (llamando a la función CreateProcess con el indicador DETACHED_PROCESS).

Sin embargo, cuando se ejecuta desde cmd es probable que aparezca otra ventana de consola en lugar de volver a utilizar la existente. No sé si existe una buena solución allí.