【问题标题】:How to port Windows form to console application in Delphi [closed]如何将 Windows 表单移植到 Delphi 中的控制台应用程序 [关闭]
【发布时间】:2013-01-03 13:56:42
【问题描述】:

我在 Windows 窗体中使用 ScktComp 和 Winsock 创建了一个聊天服务器。如何在控制台应用程序中制作相同的东西?

我发现这是starting point,但是里面的链接(帖子作者回答“几乎完美的答案”)已过期。

ServerSocketClientConnect / ClientSocketConnect 和控制台应用程序中的其他方法的等价物是什么?

【问题讨论】:

  • 这个范围很广。有什么特别的方面困扰着您?
  • 该页面上的链接很糟糕,因为该站点的论坛软件在 2002 年 3 月到今天之间的某个时间更改了其 URL 结构。相关帖子仍然存在:Whats wrong with this code? by b-w-d.netthe search page 带有搜索短语 ^gLes TMyEvents(即来自用户 gLes 的关于 TMyEvents 的帖子)。

标签: forms delphi console-application delphi-2010


【解决方案1】:

Delphi 在控制台应用程序中使用相同的类和非可视组件。您不需要更改您使用的类,但您需要学习如何通过手动输入来向单元添加内容,而不是依赖 Delphi IDE 为您生成代码。

您可以使用以下步骤自己创建它们,或者您可以使用在控制台应用程序中使用包含非可视组件的 VCL Win32 GUI 应用程序时已经构建的数据模块。

步骤:

  1. 将包含要使用的类或组件的单元名称添加到 Uses 子句。

  2. 把组件当作一个类来构造:

      var
        aSomething:TSomething;
      begin
        aSomething := TSomething.Create(Parameter1,Parameter2);
      end;
    
  3. 记得在正确的地方释放它。

         aSomething.Free;
    

但是我很难理解为什么要将聊天服务器变成控制台应用程序,而不是作为玩具或实验。在实际使用中,您可能想要一个 Win32 GUI,或者您想要一个完全非可视化的服务(NT 风格的服务),您可以创建它,而无需将 APPTYPE 更改为控制台,但它可以在没有任何 GUI 的情况下运行,尽管如此。

我可以看到编写控制台应用程序的主要实际原因是从命令行编写有用的东西,例如构建帮助实用程序等。制作控制台应用程序本身非常容易。首先创建一个新的空控制台应用程序,向其中添加一个新的空帕斯卡单元,创建一个 main 方法,然后将您想要的单元名称添加到您正在处理的主单元的 uses 子句中。这里的所有都是它的。

您可以继续使用您当前正在使用的服务器套接字和客户端套接字,但我建议您忘记控制台应用程序,除非您真的需要它,因为您所做的只是开发和操作你的程序更难没有真正的目的。您不必更改组件或类以在控制台应用程序中使用它们,但是,我应该说 GUI 或控制台类似,Delphi 中“Internet”选项卡上的 TTcpClient 和 TTcpServer 组件不适合实际使用任何现实世界的应用程序。它们是为了向后兼容而存在的,应该被视为“过时”和“不再以任何严肃的方式使用”。

查看一个真正的 TCP/IP 库,如 Indy、ICS、Synapse 或任何东西,除了来自组件选项板的“Internet”页面的那些组件,它们不适合在任何现实世界中使用“玩具”以外的规模。

【讨论】:

  • 如果您对特定于 Windows 的控制台 TCP/IP 演示感兴趣,几年前 ICS 就有一个不错的集合和框架。请注意,它可能会更复杂,因为您可能需要创建消息泵。 ICS TApplication 衍生产品为您完成了这项工作(单位 conapp 被称为 IIRC)。即使您使用不同的套接字套件也值得一试
  • 感谢您的建议,这是我一直在寻找的起始点子。
【解决方案2】:

一些 VCL 类需要 Windows 消息循环和/或窗口句柄。因此,如果您更改应用程序类型,它们可能会停止工作。

还要检查现有代码是否使用synchronize 在 VCL 主线程中运行代码。在非 VCL 应用程序中使用 synchronize 可以是dangerous

【讨论】:

  • 您知道 INDY 在控制台应用程序中是否正常工作吗?我知道 TTimer 需要消息句柄,但您仍然可以在 CONSOLE 应用程序中拥有 Win32 消息句柄,对吗?你只是不能创建可见的窗口。我很确定这只是因为 AppType 是 CONSOLE,它不会阻止对 CreateWindow 的调用。 :-)
  • @WarrenP 是的,我在控制台应用程序或服务中使用 Indy TCP 客户端。一般来说,只要不使用异步 Winsock API 方法,就不需要窗口句柄。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2014-07-18
  • 2013-12-08
  • 1970-01-01
  • 2013-03-06
相关资源
最近更新 更多