问题标签 [bold-delphi]

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 投票
10 回答
18556 浏览

delphi - 德尔福win32的ORM

有谁知道德尔福 Win32 的 ORM 或类似的东西。

0 投票
10 回答
2704 浏览

delphi - 在 Delphi 中检测 VMT 或堆损坏的正确工具是什么?

我是一个将 Delphi 2007 用于大型应用程序的团队的成员,我们怀疑堆损坏,因为有时会出现没有其他解释的奇怪错误。我相信编译器的 Rangechecking 选项仅适用于数组。我想要一个工具,当在应用程序未分配的内存地址上写入时,它会给出异常或日志。

问候

编辑:错误类型:

错误:模块“BoatLogisticsAMCAttracsServer.exe”中地址 00404E78 的访问冲突。读取地址 FFFFFFDD

EDIT2:感谢所有建议。不幸的是,我认为解决方案比这更深。由于我们拥有源代码,因此我们为 Delphi 使用了 Bold 的补丁版本。可能在 Bold 框架中引入了一些错误。是的,我们有一个日志,其中包含由 JCL 处理的调用堆栈以及跟踪消息。所以带有异常的调用栈可以像这样锁定:

内部异常部分是重新引发异常时的调用堆栈。

EDIT3:现在的理论是虚拟内存表(VMT)以某种方式损坏。当这种情况发生时,没有任何迹象。只有在调用方法时才会引发异常(始终在地址 FFFFFFDD,-35 十进制),但为时已晚。您不知道错误的真正原因。任何关于如何捕获这样的错误的提示都非常感谢!!!我们尝试过使用 SafeMM,但问题是即使使用 3 GB 标志,内存消耗也太高。所以现在我试着给 SO 社区一个赏金:)

EDIT4:一个提示是,根据日志,在此之前经常(甚至总是)另一个异常。例如,它可以是数据库中的乐观锁定。我们试图强制引发异常,但在测试环境中它工作正常。

EDIT5:故事还在继续……我现在对过去 30 天的日志进行了搜索。结果:

  • “读取地址 FFFFFFDB” 0
  • “读取地址 FFFFFFDC” 24
  • “读取地址 FFFFFFDD” 270
  • “读取地址 FFFFFFDE” 22
  • “读取地址 FFFFFFDF” 7
  • “读取地址 FFFFFFE0” 20
  • “读取地址 FFFFFFE1” 0

所以目前的理论是一个枚举(有很多粗体)覆盖一个指针。我在上面得到了 5 个不同地址的点击。这可能意味着枚举包含 5 个值,其中第二个是最常用的。如果出现异常,则应为数据库进行回滚,并且应销毁 Boldobjects。也许不是所有东西都被破坏了,枚举仍然可以写入地址位置。如果这是真的,也许可以通过正则表达式搜索代码以查找具有 5 个值的枚举?

EDIT6:总而言之,还没有解决问题的方法。我意识到我可能会用调用堆栈误导你。是的,其中有一个计时器,但还有其他没有计时器的调用堆栈。对此感到抱歉。但有两个共同因素。

  • 读取地址 FFFFFFxx 的异常。
  • 调用堆栈的顶部是 System.TObject.InheritsFrom (sys\system.pas:9237)

这让我相信VilleK最能描述这个问题。我也确信问题出在 Bold 框架的某个地方。但最大的问题是,如何解决这样的问题?仅仅有一个像VilleK这样的断言是不够的,因为损坏已经发生并且调用堆栈在那一刻已经消失了。因此,描述我对可能导致错误的原因的看法:

  1. 某个地方的指针被分配了一个错误的值 1,但它也可以是 0、2、3 等。
  2. 一个对象被分配给该指针。
  3. 对象基类中有方法调用。这会导致方法 TObject.InheritsForm 被调用,并且地址 FFFFFFDD 上出现异常。

这 3 个事件可以在代码中一起使用,但也可以在以后使用。我认为这对于最后一个方法调用是正确的。

EDIT7:我们与 Bold Jan Norden 的作者密切合作,他最近在 Bold 框架中的 OCL 评估器中发现了一个错误。修复此问题后,这些异常减少了很多,但它们仍然偶尔会出现。但这是一个很大的安慰,这几乎解决了。

0 投票
3 回答
695 浏览

sql - 将 SQL 转换为 OCL?

我有一段要翻译成 OCL 的 SQL。我不擅长 SQL,所以我想通过这个来提高可维护性。我们正在使用带有 Bold 和模型驱动开发的 Interbase 2009、Delphi 2007。现在我希望这里有人会说好的 SQL 和 OCL :-) 原始 SQL:

稍作简化后:

注意:MessageType 有 2 种情况,“IFTMBP”和“IFTMBF”。

所以要列出的表是 ScaniaEdiSolMessage。它具有以下属性:

  • 消息类型:字符串
  • 底盘编号:字符串
  • ShipFromFinland:布尔值
  • 无效:布尔值

它还有一个指向名为 ReceivingOwner 的表 Parcel 的链接,其中 BoldId 作为键。

所以它似乎列出了 ScaniaEdiSolMessage 的所有行,然后有一个子查询也列出了 ScaniaEdiSolMessage 的所有行并将其命名为 EdiSolMsg。然后它几乎排除了所有行。事实上,上面的查询从 28000 条记录中获得了一次命中。

在 OCL 中很容易列出所有实例:

也很容易通过选择过滤行,例如:

但我不明白我应该如何制作一个 OCL 来匹配上面的 SQL。

0 投票
5 回答
1510 浏览

delphi - Delphi 是否有任何框架/库接近 Bold/Eco 提供的功能?

不确定在 Borland/Codegear/Embarcadero 过渡期间 Bold/Eco 发生了什么,但我肯定会在较新版本的 Delphi 中错过它。有人知道接近的框架吗?

如果没有,也许您可​​以建议组合使用接近的库和组件。

0 投票
3 回答
794 浏览

unit-testing - 使用 Bold for Delphi 框架进行编码时提高可测试性

背景 我在一个由 7 名开发人员和 2 名测试人员组成的团队中工作,负责物流系统。我们使用 Delphi 2007 和模型驱动开发,使用Bold for Delphi作为框架。该系统已经投入生产大约 7 年,拥有大约 170 万行代码。我们在 4-5 周后发布到生产环境,几乎每次发布后,我们都必须为我们没有发现的错误做一些补丁。这对我们和客户来说当然是令人恼火的。

当前测试 解决方案当然是更自动化的测试。目前我们有手动测试。以空数据库开始并从建模方法添加数据的 Testdbgenerator。我们还有Testcomplete,它运行一些非常基本的脚本来测试 GUI。时间不足使我们无法添加更多测试,但脚本对应用程序的更改也很敏感。几年前,我真的尝试过使用 DUnit 进行单元测试,但几天后我放弃了。这些单元的连接太强了。

单元测试先决条件 我想我知道单元测试的一些先决条件:

  • 编写做一件事的小方法,但要把它做好。
  • 不要重复自己。
  • 首先编写失败的测试,然后编写代码使测试通过。
  • 单元之间的连接应该是松散的。他们应该不太了解对方。
  • 使用依赖注入。

使用框架 我们可能会升级到 Delphi XE2,主要是因为 64 位编译器。我对Spring进行了一些研究,但这需要从 D2007 进行更新,而且现在不会发生。或许明年。

问题 大多数代码仍未自动测试。那么提高旧代码的可测试性的最佳途径是什么?或者最好只为新方法编写测试?我不确定增加自动测试的最佳方法是什么,欢迎对此发表评论。我们可以时不时使用 D2007 + DUnit,然后稍后轻松更改为 Delphi XE2 + Spring 吗?

编辑:关于手动测试的当前测试方法,正如克里斯所说的那样,只是“重击并尝试打破它”。

0 投票
1 回答
2032 浏览

delphi - Delphi VCL 拖放中的错误?

我用 Delphi 2007 编译的应用程序在网格之间具有拖放功能,并且大部分时间都可以正常工作。但有时我会随机遇到访问冲突。我将它调试到 VCL 中的 Controls.pas 方法 DragTo 。

它是这样开始的:

异常发生在最后一行,因为 DragControl 为 nil。DragControl 是 TControl 类型的全局变量。我尝试使用assigncheck 修补此方法并在DragControl = nil 时调用CancelDrag,但这也失败了,因为DragObject 也是nil。

为了找出 DragControl 为零的原因,我检查了 DragInitControl。如果 DragControl 为 nil,则有 2 行将退出。

可能是原因......所以我的问题。

  1. 有没有人遇到过类似的拖放问题?
  2. 如果我检测到 DragControl = nil 如何取消当前的拖放?

编辑: 目前我对此没有解决方案,但我可以添加更多关于它的信息。这些网格称为超网格。这是我们为满足我们的需求而开发的内部组件。它从 Devexpress 继承 TcxGrid。我认为(但不确定)当用户在网格重新加载数据的同时拖动网格行时会出现此问题。不知何故,对当前行的引用变成了 nil。从长远来看,我们计划用同样继承自 TcxGrid 的 Bold 感知网格(因为我们在 Delphi 中使用 Bold)替换这个超级网格。然后,一旦数据更改(用户或代码中没有刷新),网格就会更新,并希望这可以解决问题。

0 投票
1 回答
450 浏览

unit-testing - 如何打破依赖以启用单元测试

我花了很多时间思考单元测试。我至少已经购买了有效地使用旧代码作为电子书。其中大部分是有道理的,这似乎是一本关于对旧代码进行单元测试的好书。但我仍然认为我需要一个起点,因为我们的项目 Attracs 很大。另请参阅我关于单元测试的一般问题

该应用程序有一个 UML 模型来定义类、属性和关系,并为 Delphi 使用 Bold。在模型中的每次更改之后,我们都会进行一次往返。这会自动为文件 businessclasses.pas 和 BusinessClasses_Interface.inc 中的方法生成声明。如果更改需要更改数据库,也会生成一个 SQL 脚本。这多年来一直运作良好,但我们从未使用过任何单元测试。

所以我添加了一个新的testproject,然后依赖关系引起了麻烦。我有

[DCC 错误] Attracs_Interface_Uses.inc(10):F1026 找不到文件:“MsxSupport.dcu”

所以总结一下错误

AttracsTest.dpr 使用
BusinessClasses.pas 使用
BusinessClasses_Interface.inc 使用
Attracs_Interface_Uses.inc

那么我怎样才能打破依赖链呢?

请注意,实际上文件要大得多。模型中有 300 多个类,businessClasses.pas 有超过 53000 行代码...作为测试用例,我只有 TPerson 类和 AddResponsibility 方法。但是你应该明白其中的原理。

这是我的文件:

吸引测试.dpr

TestBusinessClasses.pas

Attracs_Interface_Uses

BusinessClasses_Interface.inc

商务舱.pas

个人公司

0 投票
2 回答
110 浏览

delphi - 修剪 BOLD_CLOCKLOG 表

我正在对使用 Bold for Delphi 对象持久性框架的应用程序的数据库进行一些维护。该数据库已经投入生产多年,其中一些表已经变得非常大。其中之一是BOLD_CLOCKLOG与 Bold 的事务管理有关。

我想修剪这张表(它最大为 1.2GB,条目来自 2006 年 1 月)。

谁能确认系统不需要这些旧信息?

0 投票
1 回答
230 浏览

ocl - 跟随 OCL 中的链表

我将 Bold 用于具有OCL实现的 Delphi 。OCL 擅长过滤列表等。但是我还没有找到一个好的、通用的遍历链表的方法。

假设我有一堂课PlanMission。它包含一个PlanMission.previous指向自身的链接。它还有一个布尔属性isDummy

我想遍历一个列表,PlanMissions直到我有一个isDummy.

我可以

我真正想要的是这样的:

traverseList不存在,但它应该有 2 个参数。

  • previous: 要关注的链接
  • isDummy: 一个布尔条件,所以我知道什么时候停止

如何实现?

编辑说明 我不想要任何 Delphi 代码。我想要OCL中的代码。那些使用Bold的人知道我的意思。OCL 是一种具有查询对象、属性等的查询语言。它没有副作用,所以它是只读的。可以在此处找到 OCL 简介。

0 投票
1 回答
273 浏览

uml - 持久对象中瞬态属性的初始值?

即使我使用了一个特定的 ORM 框架,Bold for Delphi,我对这个问题的与框架无关的理论观点更感兴趣。

所以问题是关于拥有一个持久对象和一个带有初始值标签的瞬态属性。

初始标签指定创建拥有对象的实例时将获得的值属性。

但是,当随后从持久性加载此对象时,瞬态属性的值应该是什么?

是否应该再次应用初始值标签?从逻辑上讲,它应该,否则它将被保留为未分配(null)。

我在任何文档中都找不到有关此特定案例的任何规范。