如何使delphi VCL应用程序从命令行运行

Posted

技术标签:

【中文标题】如何使delphi VCL应用程序从命令行运行【英文标题】:How to make delphi VCL application run from the command line 【发布时间】:2021-04-08 19:53:24 【问题描述】:

我在 Delphi 10.2 中有一个 VCL 应用程序。 用户应该选择一些设置,然后按“运行”按钮。

现在我希望这个应用程序每天自动运行一次(使用 Windows 中的任务计划程序),并使用用户已经在应用程序中设置的设置。所以我需要一个解决方案来从命令行运行“运行”按钮例程。

我怎样才能让这个应用程序不打开主窗体,而是在后台运行,使用选择的设置?

据我了解,我应该制作另一个单元,该单元将从主 VCL 应用程序运行一些脚本,获取设置并将它们作为参数传递给将调用“运行”按钮例程的函数. 但是在这里我无法弄清楚当任务计划程序运行应用程序而不是用户时如何运行这个单元而不是主窗体。

或者也许有不同的解决方案?

有人可以帮忙吗?

【问题讨论】:

将程序拆分为 2 个程序,一个用于更改设置的 GUI 程序,以及一个使用这些设置(存储在 ini/json/xml/registry/whatever 中的设置)的命令行程序。然后可以在任务调度程序中使用命令行版本 反过来做:专注于您的控制台应用程序,然后添加一个仅运行控制台版本的 GUI 版本。可以在一个程序中同时处理这两种情况,但不适合初学者。 【参考方案1】:

您可以为 exe 使用命令行参数并相应地运行应用程序。

读取命令行参数使用函数ParamStr(当你只使用一个命令行参数时,你可以使用ParamStr(1)读取第一个也是唯一的参数)。 当您需要更多的命令行参数时,请使用ParamCount 遍历所有可用参数。

根据您想要运行“运行”代码并显示配置表单的方式,您可以编辑项目.dpr 文件以在您以“配置”模式运行应用程序时显示/创建主表单,并且在另一种情况下,执行“运行”代码。

program MyProgram;

uses
  Vcl.Forms,
  ConfigFormUnit in 'ConfigFormUnit.pas' ConfigForm,
  RunCodeUnit in 'RunCodeUnit.pas';

$R *.res

begin
  Application.Initialize;

  if ParamStr(1) = 'run' then
    ExecuteRunCode
  else begin
    Application.MainFormOnTaskbar := True;
    Application.CreateForm(TConfigForm, ConfigForm);
  end;

  Application.Run;
end.

例程ExecuteRunCode 是其中一个单元中的公共例程,其中包含您要在“运行”模式下运行的代码。 (在示例中为单位RunCodeUnit.pas)。

unit RunCodeUnit;

interface

  procedure ExecuteRunCode;

implementation

procedure ExecuteRunCode;
begin
  // Code to run
end;

end.

当然,您可以创建两个单独的程序,每个程序都有自己的特定代码,但这样您可以根据需要/需要使用单个应用程序。

【讨论】:

我猜这是一匹马的课程。如前所述,OP 从不希望用户在调度程序之外运行操作程序,将其拆分为 2 是答案,但更常见的是,恕我直言,操作部分将需要按计划或临时运行,在这种情况下单一程序是更好的答案。 您能解释一下为什么两者都需要Application. 吗? @Dsm 是的,通常我也会将代码拆分为两个程序并使用共享单元来访问配置。但根据这个问题,似乎需要一个应用程序。 @R.Hoek 我会颠倒参数检查逻辑,这样如果参数为空,则显示应用程序 GUI,如果第一个参数是 -s(s 表示静默),应用程序将在最后保存时静默执行设置。这样,双击应用程序可执行文件将始终显示应用程序 GUI,从而允许用户更改其设置。在您的示例中,用户需要将“config”作为参数传递才能打开不直观的应用程序 GUI。但是设置一个将附加参数传递给应用程序的任务是。 @SilverWarior 这可能是一个更好的选择,因为用户会得到一些反馈。然后我会使用run 之类的东西作为参数,但这是一个口味问题?【参考方案2】:

您可能想要创建应用程序的仅命令行版本。这在 Delphi 术语中称为“console mode”应用程序(文件/新建/控制台应用程序)。

您可以使用ParamStrParamCount 访问命令行参数。

如果您需要命令行和 GUI 应用程序,请将所有非 GUI 代码放在一个单元中,将其封装在一个类中或作为标准函数。您可以从 GUI 应用程序和控制台模式应用程序中使用该单元。

顺便说一句,始终将用户界面与业务代码分开是一个很好的设计。您在这里有一个很好的例子:您可以使用来自 GUI 应用程序或命令行应用程序的代码,也可以在服务应用程序或 DLL 中使用它。

【讨论】:

以上是关于如何使delphi VCL应用程序从命令行运行的主要内容,如果未能解决你的问题,请参考以下文章

Delphi中正常窗口的实现

10分钟10行代码开发APP(delphi 应用案例)

如何使用 VCL Themes 制作透明备忘录?

delphi VCL显示问题 分线程与主线程的同步

Delphi XE 的 SOAP 服务器和客户端应用程序 VCL+indy 演示?

delphi 如何通过单击一个窗体的按钮给一个frame的控件赋值