问题标签 [delphi-5]

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 投票
1 回答
2095 浏览

delphi - Delphi 5 - WinXP 和 Win2K 上的 StrToFloat 结果不同

我有一个奇怪的问题,在我的机器和生产服务器上转换字符串会得到不同的结果,例如:

Button1Click 在我的 WinXP 机器上的“1.234”结果不是有效的浮点值,而在 Win2K 机器上这工作得很好。

另一端的 Button2Click 在我的 WinXP 上运行,但确实导致 '1,234' is not a valid floating point value 错误。

两台机器的区域设置都设置为“German(Austria)” - 关于为什么会发生这种情况的任何想法,或者至少为什么区域设置对话框确实显示了与 Delphi“DecimalSeparator”和“GetLocaleChar(GetThreadLocale, LOCALE_SDECIMAL) 不同的小数分隔符字符。 , '.')?

问候,莱因哈德

0 投票
5 回答
1142 浏览

delphi - Delphi-5 单文件存储解决方案?

是否有 Delphi-5 解决方案可以轻松地将单文件存储集成到现有代码中?我想要像 Java *.jar 或 Openoffice 文档文件这样的文件,它们是压缩/压缩的文件和文件夹,但具有自己的文件扩展名。

编辑: 我知道一些支持 ZIP 的组件,但简而言之,我想访问“容器”中的文件并在它们上使用正常的文件处理例程(例如 TStringList.SaveToFile)。任何有关压缩/解压缩的开销都应由组件处理。

0 投票
1 回答
7358 浏览

delphi - Delphi QuickReports:实现detail-child-child-child banding的band order?

我需要在 Delphi 5 中创建一个 QuickReport,其布局如下:

任何人都可以想出标题,详细信息,子,页脚,子详细信息,组标题,组页脚带的组合 - 以及它们之间相关的父,主,报告,查询链接,这样我就可以制作报告我需要看吗?

不要混淆我对术语的使用

  • 头带
  • 细节带
  • 儿童乐队
  • 页脚带

暗示任何乐队都必须是那些实际的类型。我在概念意义上使用这些术语:

  • 整个报告开头的单个带区(报告标题)
  • 由四个乐队组成的重复组
  • 在所有细节之后出现的三个带,前两个是自动拉伸的

同样的问题,只是更长

我可以制作一些模仿我制作的示例的表格:


我失败的实验

我尝试使用以下乐队布局创建 QuackReport:

注意:缩进用于帮助识别父子关系(即带实际上不是缩进 50 像素)

这种设计的问题在于,至少在设计时,摘要带出现在两个搁浅的子带之前:

当报告运行时(在运行时),两个搁浅的子带甚至不打印:

验证码:quackreports

0 投票
3 回答
33483 浏览

delphi - Delphi:什么是Application.Handle?

是什么TApplication.Handle

  • 它从何而来?
  • 它为什么存在?
  • 最重要的是:为什么所有表单都将其作为父窗口句柄?

德尔福帮助说:

TApplication.Handle

提供对应用程序主窗体(窗口)的窗口句柄的访问。

描述

在调用需要父窗口句柄的 Windows API 函数时使用句柄。例如,显示其自己的顶级弹出窗口的 DLL 需要一个父窗口来在应用程序中显示其窗口。使用 Handle 属性使此类窗口成为应用程序的一部分,以便它们与应用程序一起最小化、恢复、启用和禁用。

如果我专注于“应用程序主窗体的窗口句柄”一词,并且我认为它是指应用程序主窗体的窗口句柄,那么我可以比较:

  • “应用程序主窗体的窗口句柄”,带有
  • MainForm的窗口句柄Application

但它们不一样:

那么是什么Application.Handle

  • 它从何而来?
  • 它是什么 Windows® 窗口句柄?
  • 如果Application's的 Windows® 窗口句柄MainForm,那么它们为什么不匹配?
  • 如果不是Application's的窗口句柄MainForm,那是什么?
  • 更重要的是:为什么它是每个表单的最终所有者?
  • 最重要的是:如果我尝试让表单成为无父无主的表单(因此它可以出现在任务栏上),或者尝试使用IProgressDialog之类的东西,为什么一切都会变得混乱?

我真正要问的是:使Application.Handle存在的设计原理是什么?如果我能理解为什么,那么应该如何变得显而易见。


通过二十个问题的游戏更新理解:

在谈到通过设置其所有者使窗口出现在任务栏上的解决方案时null彼得·弗莱德在 2000 年说

这可能会导致从辅助形式显示的模态形式出现一些问题。

如果用户在模态表单打开时从应用程序切换,然后返回显示它的表单,则模态表单可能会隐藏在表单下方。可以通过确保模态表单是父级来解决这个问题[原文如此;他的意思是拥有] 以显示它的形式( params.WndParent如上使用)

Dialogs但这对于来自单元和异常的标准对话框是不可能的,这需要更多的努力才能让它们正常工作(基本上处理Application.OnActivate,寻找以Application via为父级的模态表单GetLastActivePopup 并将它们带到 Z-order via 的顶部SetWindowPos) .

  • 为什么模态表单最终会卡在其他表单后面?
  • 什么机制通常将模态形式带到前面,为什么它在这里不起作用?
  • Windows® 负责显示堆叠的窗口。Windows® 没有显示正确的窗口出了什么问题?

他还谈到了使用新的 Windows 扩展样式,该样式通过添加扩展样式来强制窗口出现在任务栏上(当使其不拥有的正常规则不足、不切实际或不受欢迎时)WS_EX_APPWINDOW

但随后他警告说:

如果您在另一个应用程序处于活动状态时单击辅助表单任务栏按钮,这仍会将所有应用程序表单置于前面。如果你不希望有选项

当表单的所有者静止时,谁将所有表单带到最前面Application.Handle应用程序是这样做的吗?为什么要这样做?与其这样做,应该这样做吗?这样做有什么缺点?我看到了这样做的缺点(系统菜单无法正常工作,任务栏按钮缩略图不准确,Windows® shell 无法最小化窗口。


在另一篇处理 . 的帖子中ApplicationMike Edenfield 说父窗口向其他窗口发送它们的最小化、最大化和恢复消息

这将为您的表单添加任务栏按钮,但还有一些其他小细节需要处理。最明显的是,您的表单仍然会收到发送到父表单(应用程序的主表单)的最小化/最大化。为了避免这种情况,您可以通过添加如下行来为 WM_SYSCOMMAND 安装消息处理程序:

请注意,此处理程序以您希望独立于应用程序其余部分的行为的PARENT形式出现,以避免传递最小化消息。您可以为 SC_MAXIMIZE、SC_RESTORE 等添加类似的 > 代码。

为什么我的 Windows® 窗口的最小化/最大化/恢复消息没有进入我的窗口?这是因为 Windows® 将发往窗口的消息发送给了窗口的所有者吗?在这种情况下,Delphi 应用程序中的所有表单都是“拥有”的Application?这是否意味着使所有者为空:

将删除Application它的窗口句柄干扰我的表单,Windows 应该再次向我发送的最小化/最大化/恢复消息?


也许如果我们现在比较和对比一个“正常”的 Windows 应用程序做事,与 Borland 最初设计 Delphi 应用程序做事的方式 - 关于这个Application对象和它的主循环。

  • 对象解决的是什么解决方案Application
  • 更高版本的 Delphi 进行了哪些更改以使这些相同的问题不存在?
  • Delphi 后期版本中的更改是否没有引入其他问题,最初的应用程序设计如此努力地解决?
  • 那些较新的应用程序如何在没有应用程序干扰的情况下仍然运行?

显然,Borland 意识到了他们最初设计中的缺陷。他们最初的设计是什么,它解决了什么问题,缺陷是什么,重新设计是什么,它是如何解决问题的?

0 投票
4 回答
3381 浏览

delphi - Delphi:减法时如何避免EIntOverflow下溢?

微软已经在 GetTickCount 的文档中说过,你永远不能比较滴答计数来检查是否已经过了一个间隔。例如:

不正确(伪代码):

上面的代码很糟糕,因为它很容易发生刻度计数器的翻转。例如,假设时钟接近其范围的末端:

然后你执行你的检查:

立即满足,因为GetTickCount 大于endTime


解决方案

相反,您应该始终减去两个时间间隔:

看同样的数学:

在 C/C++ 中,这一切都很好,编译器以某种方式运行。

但是德尔福呢?

但是当我在 Delphi 中执行相同的数学运算时,在 ( {Q+}, ) 上进行溢出检查时,两个滴答计数的减法会在TickCount翻转{$OVERFLOWCHECKS ON}时生成 EIntOverflow 异常:

这个问题的预期解决方案是什么?

编辑:我试图暂时关闭OVERFLOWCHECKS

但是减法仍然会引发EIntOverflow异常。

有没有更好的解决方案,涉及强制转换和更大的中间变量类型?


更新

我问的另一个 SO 问题解释了为什么{$OVERFLOWCHECKS}不起作用。它显然只适用于功能级别,而不是级别。因此,虽然以下内容不起作用

以下确实有效:

0 投票
1 回答
3523 浏览

delphi - Delphi:如何使用 $OVERFLOWCHECKS OFF 禁用溢出检查?

我有一些导致下溢的代码:

减法本身确实会产生溢出(下溢),但我不希望 Delphi 抛出EIntOverflow异常。所以我尝试通过禁用溢出检查来禁用溢出检查代码的生成:

然而,即使有这个OVERFLOWCHECKS OFF选项,它仍然会引发异常。并且生成的代码仍然包含检查:

替代文字

关于以下文档的提醒$Q

溢出检查

类型开关
语法{$Q+} 或 {$Q-}
{$OVERFLOWCHECKS ON} 或 {$OVERFLOWCHECKS OFF}
默认{$Q-}
{$OVERFLOWCHECKS OFF}
范围本地

评论

$Q 指令控制溢出检查代码的生成。在 {$Q+} 状态下,检查某些整数算术运算(+、-、*、Abs、Sqr、Succ、Pred、IncDec)是否溢出。每个整数算术运算的代码后面都有附加代码,用于验证结果是否在支持的范围内。如果溢出检查失败,则会引发 EIntOverflow 异常(如果未启用异常处理,则程序终止)。

$Q 开关通常与 $R 开关一起使用,它启用和禁用范围检查代码的生成。启用溢出检查会减慢您的程序并使其变得更大,因此仅使用 {$Q+} 进行调试。

如何使用$OVERFLOWCHECKS OFF禁用溢出检查代码的生成?


梅森的回答奏效了。修改后的代码是:

对于谷歌爬虫,替代问题措辞:如何在 Delphi 中暂时禁用溢出检查?

0 投票
3 回答
2748 浏览

delphi - DUnit:如何运行测试?

如何从 IDE 运行TestCase

我创建了一个新项目,具有一个简单的表单:

现在我将添加一个测试用例来检查 pushButton1是否可以做到:

鉴于我所做的(GUI 项目中的测试代码),我现在如何触发测试运行?如果我推动F9,那么表格就会出现:

替代文字

理想情况下,IDE 中有一个按钮或菜单选项,显示Run DUnit Tests

替代文字

我生活在一个梦幻世界吗?一个幻想的土地,住在棒棒糖巷的橡皮糖房子里?

0 投票
4 回答
1879 浏览

delphi - Delphi:如何在项目组中设置默认项目?

我在一个项目组中有两个项目:

  • 项目A
  • 项目B

每当我在 Delphi 中打开 ProjectGroup.bpg 时,它总是以第二个项目作为活动项目开始:

  • 项目A
  • 项目B

每次我必须将其翻转到“真实”项目:

  • 项目A
  • 项目B

如何使ProjectA成为与项目组一起打开的默认项目?


项目组.bpg

出于实际原因,请参阅DUnit:如何运行单元测试。

0 投票
3 回答
3164 浏览

delphi - Delphi:有任何 StringReplaceW 或 WideStringReplace 函数吗?

那里有任何宽字符串操作实现吗?

0 投票
2 回答
2693 浏览

delphi - Delphi SampleProfiler:这段代码如何调用 ntdll.dll?

我使用Delphi Sampling Profiler分析了我的应用程序的一部分。像大多数人一样,我看到大部分时间都在里面度过ntdll.dll

注意:我打开了忽略 Application.Idle时间的选项,并从System.pas. 所以它不在里面ntdll,因为应用程序是空闲的:

替代文字

经过多次运行,多次,大部分时间似乎都花在了里面ntdll.dll,但奇怪的是调用者是谁:

在此处输入图像描述

调用者来自虚拟树视图:

注意:应用程序不在里面ntdll.dll,因为应用程序是空闲的,因为调用者不是Application.Idle

让我感到困惑的是,这条线本身(即不是PrepareCell内部ntdll的东西)是. 更令人困惑的是:

  • 不仅不是里面的东西 PrepareCell()
  • 它甚至不是调用者的设置PrepareCell例如弹出堆栈变量,设置隐式异常帧等)。这些东西会在分析器中显示为beginPrepareCell 内部的热点。

VirtualTrees.pas:

所以我想弄清楚这条线是怎么回事:

正在打电话ntdll.dll


唯一的其他方式是三个参数:

  • PaintInfo
  • Window.Left
  • NodeBitmap.Width

也许其中之一是一个函数,或者一个属性 getter,它会调用ntdll. 所以我在行上放了一个断点,并在运行时查看CPU窗口:

替代文字

里面有一行可能是罪魁祸首:

但是当我跟随那个跳跃时,它并没有结束ntdll.dll,而是TBitmap.GetWidth

替代文字

如您所见,它不会在任何地方调用;并且肯定不会进入ntdll.dll


那么这条线如何:

呼入ntdll.dll


注意:我很清楚它并没有真正调用 ntdll.dll。因此,任何有效的答案都必须包含“Sampling Profiler 具有误导性;该行没有调用 ntdll.dll”。答案也必须要么说大部分时间没有花在 ntdll.dll 中,要么突出显示的行不是调用者。最后,任何答案都必须解释为什么 Sampling Profiler 是错误的,以及如何修复它。

更新 2

什么是 ntdll.dll?Ntdll 是 Windows NT 的原生 API 集。Win32 API 是一个包装器ntdll.dll看起来就像存在于 Windows 1/2/3/9x 中的 Windows API。为了真正进入 ntdll,你必须调用一个直接或间接使用 ntdll 的函数。

例如,当我的 Delphi 应用程序空闲时,它通过调用 user32.dll 函数等待消息:

当你真正看到它时:

调用 at 指定的函数$7ffe0300是 Windows 转换到 Ring0 的方式,调用 EAX 中指定的 FunctionID。在这种情况下,被调用的系统函数是 0x1226。在我的操作系统 Windows Vista 上,0x1226 对应系统功能NtUserWaitMessage

这就是你进入 ntdll.dll 的方法:你调用它。

当我说出最初的问题时,我拼命地试图避免挥手不回答。通过非常具体,仔细指出我所看到的现实,我试图防止人们忽视事实,并试图使用挥手的论据。


更新三

我转换了两个参数:

进入堆栈变量:

确认瓶颈不是调用

  • Windows.Left, 或者
  • 节点位图宽度

Profiler 仍然指示该行

本身就是瓶颈;PrepareCell没有任何东西。这一定意味着它在调用准备单元的设置中,或者在 PrepareCell 的开头:

没有任何东西调用ntdll。现在 PrepareCell 本身的前导码:

里面什么都没有调用ntdll.dll


问题仍然存在:

  • 为什么将一个变量推入堆栈,而将另外两个变量推入寄存器是瓶颈?
  • 为什么 PrepareCell 内部的任何东西都不是瓶颈?