Hea*_*are 24 delphi console user-interface
是否有可能(如果是这样,我如何)使用Delphi 2007将单个程序作为控制台应用程序和GUI版本工作?
我所追求的是,如果程序使用适当的命令行选项运行,它应该用作控制台程序,使用WRITELN将输出打印到控制台,但如果没有给出命令行参数,它应该作为普通Delphi运行GUI应用程序?
问题是当作为控制台应用程序运行时,命令行解释程序在允许您输入新命令之前等待应用程序终止,而从命令行启动的GUI应用程序会立即返回到命令行和GUI应用程序在分离的过程中启动.我希望保留这种行为.
我不介意这样的事情:
如果GUI那么StartApplicationAsGUI(ParamStr(0))
即.我不介意我必须使用某种形式的EXECUTE调用重新启动应用程序,以便在GUI模式下启动它(如果需要),只要命令行界面在GUI版本启动时返回到命令行输入即可.
我更喜欢一个解决方案/建议:
<Parse Comnand Line>
IF ConsoleMode THEN
RunConsole(参数)
ELSE BEGIN
Application.Initialize;
Application.CreateForm(...)
Application.Run;
结束
(反之亦然,即如果GUI模式以特殊方式做事)
这样我在制作GUI界面时仍然可以使用Delphi的IDE和VCL ......
Joe*_*oey 13
在Windows上这有点棘手.实际上,控制台应用程序和GUI之间的区别是PE标头中的单个标志.你可以轻松编写创建窗口的控制台应用程序,但这样你总是有控制台窗口(你可以隐藏它,但是当人们运行你的程序时这不会很好cmd).
但是,您可以使用以下AllocConsole函数编写一个GUI应用程序,以便在需要时创建控制台:
进程只能与一个控制台关联,因此如果调用进程已有控制台,则AllocConsole函数将失败.进程可以使用FreeConsole函数将其自身与其当前控制台分离,然后它可以调用AllocConsole来创建新控制台或AttachConsole以附加到另一个控制台.
如果调用进程创建子进程,则子进程将继承新控制台.
AllocConsole初始化新控制台的标准输入,标准输出和标准错误句柄.标准输入句柄是控制台输入缓冲区的句柄,标准输出和标准错误句柄是控制台屏幕缓冲区的句柄.要检索这些句柄,请使用GetStdHandle函数.
此功能主要由图形用户界面(GUI)应用程序用于创建控制台窗口.无需控制台即可初始化GUI应用程序.控制台应用程序使用控制台初始化,除非它们是作为分离的进程创建的(通过使用DETACHED_PROCESS标志调用CreateProcess函数).
但是,从此处运行cmd时可能会导致出现另一个控制台窗口,而不是重新使用现有控制台窗口.我不知道那里是否存在一个好的解决方案.
Jos*_*ons 12
IMO,这里最好的方法是拥有实际完成程序工作的非可视化类.然后你可以从GUI程序调用它,你也可以从一个单独的命令行程序调用它.这两个程序都只是围绕你的类功能的包装.
这也迫使设计变得干净 - 您的类必须与应用程序的GUI层分开.
glo*_*lob 11
http://blogs.msdn.com/oldnewthing/archive/2009/01/01/9259142.aspx
| 归档时间: |
|
| 查看次数: |
6796 次 |
| 最近记录: |