【问题标题】:Debugging Delphi Firemonkey Indy TCP Server调试 Delphi Firemonkey Indy TCP 服务器
【发布时间】:2016-07-02 23:41:34
【问题描述】:

我有一个实现 TCP 服务器的 Delphi Firemonkey 应用程序。服务器未按预期打开端口。我可以看到表单打开,但 netstat 显示端口未打开。我现在正试图通过尝试放置日志消息来调试此问题。

问题是我以前从未使用过 Firemonkey。我不确定在哪里可以看到日志消息。

我已经声明了一个日志服务。

LoggingService: IFMXLoggingService;

然后我初始化它

LoggingService := FMX.Platform.TPlatformServices.Current.GetPlatformService(IFMXLoggingService) as IFMXLoggingService;

然后我在函数Tserver.Execute 中调用它以确保它被执行。

if Assigned(LoggingService) then
  LoggingService.Log('TserverExecute !',[]);

我不确定输出结果在哪里。我检查了各种调试终端,似乎在任何地方都找不到输出字符串。如果有人能指出我做错了什么,那就太好了?

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Platform,
  IdCustomTCPServer, IdTCPServer, IdBaseComponent, IdComponent, IdUDPBase, IdContext,
  IdSocketHandle, IdUDPServer, FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    TCPServer: TIdTCPServer;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure TserverExecute(AContext: TIdContext);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  LoggingService: IFMXLoggingService;

implementation

{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
var
  Binding : TIdSocketHandle;
begin
  LoggingService := FMX.Platform.TPlatformServices.Current.GetPlatformService(IFMXLoggingService) as IFMXLoggingService;
  TCPServer.DefaultPort := 16000;
  TCPServer.Bindings.Clear;
  Binding := TCPServer.Bindings.Add;
  Binding.IP := '0.0.0.0';
  Binding.Port := 16000;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
 TCPServer.Active := True;
end;

procedure TForm1.TserverExecute(AContext: TIdContext);
var
  C : String;
begin
  C := AContext.Connection.Socket.ReadLn();
  if Assigned(LoggingService) then
    LoggingService.Log('TserverExecute !',[]);
 if C = 'TESTSTRING' then
 begin
   AContext.Connection.Socket.Writeln('SENT');
 end;
end;

end.

【问题讨论】:

  • 您为什么要将此作为新问题发布?您删除了关于同一主题的 previous question,而不是针对发布在其上的 cmets。您应该已经回答了上面的问题,以便重新打开它。
  • @RemyLebeau - 我已经输入了调试代码。我之前没有调试过代码。现在我认为我最关心的是如何能够使用 printf 进行调试,以便我可以更好地理解它并取得一些进展。
  • 这仍然不是删除previous question的借口。仅仅因为它被搁置并不会使它无效。您被要求提供有关它的更多信息,但您没有这样做。 那个问题是关于端口问题的。 这个 问题是关于日志记录的。两个独立的问题,彼此无关,即使它们指的是相同的代码。

标签: delphi debugging tcp firemonkey indy


【解决方案1】:

我不确定输出结果在哪里。

IFMXLoggingService.Log() 的文档说:

Event Log 中显示一条消息。

Event Log 是 IDE 内部的一个窗口(查看 > 调试窗口 > 事件日志)。它显示应用程序在调试会话期间生成的日志消息。因此,您需要在调试器中运行 Firemonkey 应用才能查看来自 IFMXLoggingService 的日志消息。

【讨论】:

  • 我试过这个。在调试模式下的事件日志中,我收到Thread startProcess Start 和一系列Module Load 消息。就这些。找不到我的调试消息
  • 您的应用在哪个平台上运行?我上面所说的适用于 Windows(请参阅stackoverflow.com/questions/32631001)。
  • 在那个解释中我知道你必须注册你的自定义日志服务。但我不明白TMyLoggingService.Create 是什么?如MyLoggingService := TMyLoggingService.Create;
  • 不,你不能。 Writeln 写入控制台。 在开始编程之前,您需要对编程工具和要编程的平台有基本的了解。您将通过阅读两者的文档来了解这一点。
  • WriteLn() 输出到调用进程的控制台(如果有的话)。它不会输出到 IDE 的事件日志(我已经告诉过你如何做到这一点 - OutputDebugString())。另外,需要使用SysUtils.Format()函数来计算Params参数,不要单独记录Format参数。
猜你喜欢
  • 2021-11-22
  • 2017-02-15
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2017-07-08
  • 2012-11-14
  • 1970-01-01
相关资源
最近更新 更多