问题标签 [delphi-run-time-library]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
118 浏览

delphi - win64\debug\dsnap.dcp 似乎已过时

使用 Rad studio Tokyo 10.2.3 编译我的运行时库时,如果包或 exe 实际上依赖于它,我会收到“需要重新编译包 dsnap”错误。

我发现这是由于我的$(BDSLIB)\win64\debug文件夹中的 dsnap.dcp 造成的。解决方法是将 dsnap.dcp 从相应的发布文件夹复制到调试文件夹。我确实复制了原始文件。

问题 Delphi 10.2.3 的任何人都可以验证此文件与他们的匹配吗?Embarcadero 的反应有点慢……

  • dsnap.dcp
  • 日期为 2017 年 12 月 8 日
  • 大小 1.128.136 字节
  • 原始位置C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\win64\debug\dsnap.dcp

为什么这个问题?如果不匹配,我的升级安装显然出了点问题)。也报告为RSP-20723,您可以在其中获取实际文件。(不幸的是我还不知道如何在这里做一个文件附件)

0 投票
0 回答
162 浏览

delphi - 使用 THTTPClient 长时间运行的 Rest API 调用

要监听来自 Rest 服务器的事件,我需要一个长时间运行的 HTTP 请求。

我们如何用 Delphi 做到这一点?

我当前的解决方案有效,但调用方的请求停止没有得到正确解决。我必须使用 Thread.Terminate 来停止线程。此线程终止会导致不必要的内存泄漏。这就是为什么我正在寻找另一种解决方案。

在没有从服务器接收到新数据的情况下,调用者也必须可以中断请求。我尝试使用 BeginExecute/BeginGet 进行异步调用,但我看到了同样的问题,即如果没有来自服务器的数据,请求就无法随时停止。

这是我的代码,它最终可以在不同的平台(Win/OSX/Android)上工作:

0 投票
2 回答
967 浏览

delphi - Delphi FreeAndNil:寻找替代实现

注意:请耐心等待,由于此处和此处的一些讨论以及在此处此处报告的一些问题,我感到有点“火上浇油”

一些背景

Ye olde(10.4 之前)FreeAndNil看起来像这样:

新的和新鲜的FreeAndNil样子是这样的:

IMO 都有其缺点:

  • 旧的不做任何类型检查,所以调用FreeAndNil指针、记录和接口编译得很好,但在运行时会产生有趣但通常不需要的效果。(完全发疯,或者如果幸运的话,它会因 EAccessViolation、EInvalidOperation 等而停止。)
  • 新的接受一个 const 参数,因此接受任何对象。但是随后提供的对象指针实际上是使用一些hacky-wacky 代码更改的。
  • 你现在可以FreeAndNil像这样调用 new:FreeAndNil(TObject.Create)它会编译甚至运行得很好。我喜欢在FreeAndNil我出错时警告我并提供例如属性而不是字段的旧版本。FreeAndNil如果您为此实现提供对象类型属性,不确定会发生什么。没试过。

如果我们将签名更改为FreeAndNil(var SomeObject:TObject)then 它将不允许我们传递任何其他变量类型,然后正是该TObject类型。这也是有道理的,就好像它不是一样,人们可以轻松地更改例程中FreeAndNil作为类型提供的变量,将 var 变量更改为完全不同类型的对象,例如. 当然不会做这样的事情,因为它总是将 var 参数更改为 nil。TComponentTCollectionFreeAndNil

所以这是FreeAndNil一个特殊情况。 也许甚至足以说服delphi添加编译器魔术 FreeAndNil实现?投票给任何人?

潜在的解决方法

我想出了下面的代码作为替代方案(这里作为辅助方法,但也可以作为实现的一部分TObject),它结合了两个世界。这Assert将有助于在运行时查找无效调用。

用法将是这样的:

我已经实际测试过这个例程,它甚至比 10.4 的FreeAndNil实现要快一些。我猜是因为我先做作业检查,然后Destroy直接打电话。我不太喜欢的是:

  • 类型检查在运行时进行,并且仅在断言为 ON 时进行。
  • 感觉就像必须两次传递相同的变量。这不一定是正确的/必需的。它必须是同一个对象,并且参数必须是变量。

另一项调查

但是如果一个人可以在没有参数的情况下调用,那不是很好吗

所以我弄乱了self指针,并设法将其设置为nil使用 10.4 在其FreeAndNil. 嗯......这在方法内部有效,self指向nil. 但是在FreeAndNil这样调用之后,MyObj 变量不是 nil,而是一个过时的指针。(这是我所期望的。)此外,MyObj可以是属性或(的结果)例程、构造函数等。

所以这里也不行……

最后是问题:

您能想出一个更清洁/更好的解决方案或技巧吗:

  • FreeAndNil(var aObject:TObject) 具有不那么严格的类型检查编译时间(可能是编译器指令?),因此它允许编译和调用任何对象类型的变量。
  • 当传递的东西不是某个对象类型的变量/字段时,抱怨编译时间
  • 帮助描述RSP-29716中的最佳解决方案/要求是什么
0 投票
2 回答
126 浏览

delphi - 如何在德尔福获得昨天的日期

我知道您可以使用该功能获取当前日期和时间Now(),但是您如何获取昨天的日期?