问题标签 [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 投票
7 回答
6982 浏览

delphi - Delphi:所有常数都是常数,但有些常数比其他常数?

考虑:

以及有效的替代措辞:

解释。


然后考虑:

并修复。

编辑:const在声明前添加关键字;有人不相信他们是常量。

0 投票
4 回答
2539 浏览

delphi - 复制 Delphi 配置文件

我的电脑最近崩溃了。我们有一个需要大量工作才能运行的 Delphi 应用程序。

我的一位同事仍然安装了它。有没有办法复制存储在调色板中的东西?和图书馆路径?

我正在使用 Delphi 5(我知道它非常非常古老)

0 投票
3 回答
2873 浏览

windows - Delphi:如何响应 WM_SettingChange/WM_WinIniChange?

我需要知道我的应用程序何时收到一条WM_SETTINGCHANGE消息(以前称为WM_WININICHANGE)。

问题是TApplication中的消息泵在我有机会看到它之前将其发送到黑洞(默认处理程序):

该过程CheckIniChange()不会引发我可以处理的任何事件,Mouse.SettingChanged().

一旦代码路径到达Default,它就会被发送到DefWindowProc排水孔,再也不会被看到(因为 WndProc 所做的第一件事就是将 设置Message.Result为零。

我希望将处理程序分配给 TApplicationEvents.OnMessage 事件:

但是 OnMessage 事件仅针对通过消息泵来的消息引发。由于WM_SETTINGCHANGE消息已“处理”,因此它永远不会看到

系统。

我如何响应 windows 广播WM_SETTINGCHANGE

0 投票
3 回答
1971 浏览

delphi - 读取控制台应用程序的 unicode 输出

我有控制台应用程序。用 Delphi 2010 编写。它的输出支持 Unicode。(我为此使用了 UTF8Encode 和 SetConsoleOutputCP(CP_UTF8))。当我从命令提示符运行程序时,它工作正常。
现在我想读取在Delphi 5中创建的另一个程序的输出。我使用这种方法。但是我遇到了 unicode 字符的问题。
有没有人推荐阅读控制台应用程序的 unicode 输出。从德尔福5?

0 投票
5 回答
3529 浏览

delphi - Delphi:快速(更)宽字符串连接

我有一个功能是将 ADORecordset转换为 html:

该函数的核心涉及大量宽字符串连接:

对于几千个结果,该函数所花费的时间,任何用户都会感觉到,运行时间太长了。Delphi Sampling Profiler显示99.3%的时间用于宽字符串连接 (@WStrCatN@WstrCat)。

任何人都可以想出一种改进宽字符串连接的方法吗?我认为 Delphi 5 没有任何类型的字符串生成器。并且Format不支持Unicode。


并确保没有人试图偷懒:假装你正在实现接口:


更新一

我想过使用IXMLDOMDocument, 将 HTML 构建为 xml。但后来我意识到最终的 HTML 将是xhtml而不是html- 一个微妙但重要的区别。

更新二

Microsoft 知识库文章:如何提高字符串连接性能

0 投票
5 回答
2990 浏览

delphi - Delphi:如何获取事件变量的地址?

如何获取保存事件处理程序的变量的地址?

例如

我想要私有成员、事件处理程序、变量的地址。FOnChange


为什么?

我试图找出谁在FOnChange用垃圾覆盖我的处理程序变量。

我正在逐步执行代码:

没有分配任何事件处理程序,并且有一段时间FOnChange变量nil位于观察窗口中:

但后来FOnChange变量变成了垃圾:

所以我想FOnChange在 CPU 窗口的数据窗格中观察变量,以便我可以从以下位置观察它:

除了我不知道的地址FOnChange; 我刚编的$410018

如何找到事件变量的地址?


我尝试过的事情

观察名单

Alt+F5

  • 改变: OnChange: TNotifyEvent $253B588
  • FOnChange:检查“FOnChange”时出错:表达式错误
  • Self.FOnChange:检查“Self.FOnChange”时出错:表达式错误
  • @OnChange@OnChange: Pointer $253B588
  • @@OnChange:检查“@@OnChange”时出错:表达式错误
  • @FOnChange@FOnChange: Pointer $253B588
  • @@FOnChange@@FOnChange: ^Untyped (no address) 数据: @@FOnChange $253B588`

共识似乎正在解决0x253B588

然而,当我运行一些示例代码时:

这变成:

难怪我找不到地址FOnChange,是两个地址!

0 投票
4 回答
4413 浏览

sql-server-2005 - Delphi - BOF 或 EOF 为 True,或当前记录已被删除

当我尝试在 MS SQL Server 2005 中的空表上进行选择时出现此错误:“BOF 或 EOF 为 True,或者当前记录已被删除”。我在 Delphi 5 中使用了 TADOConnection 和 TADODataSet 来连接和检索数据库中的数据。

有没有办法检查数据库表是否为空而不会产生此类错误?

0 投票
2 回答
8083 浏览

delphi - Delphi:如何将接口实现委托给子对象?

我有一个对象,它将一个特别复杂的接口的实现委托给一个子对象。这正是我认为的工作TAggregatedObject。“”对象维护对其“控制器”的弱引用,所有QueryInterface请求都传回父对象。这维护了IUnknown 始终是同一个对象的规则。

所以,我的父(即“控制器”)对象声明它实现了IStream接口:

注意:这是一个假设的例子。我选择这个词Robot 是因为它听起来很复杂,而且这个词只有 5 个字母长——它很短。我也选择了IStream它,因为它很短。我打算使用 IPersistFileor IPersistFileInit,但它们更长,并且使示例代码更难实现。换句话说:这是一个假设的例子。

现在我有我的子对象将实现IStream

剩下的一切,这就是我的问题开始的地方:在RobotStream被要求时创建:

此代码无法编译,并出现错误Operator not applicable to this operand type.

这是因为 delphi 试图as IStream在一个没有实现的对象上执行IUnknown

IUnknown方法可能存在,但该对象并未宣传它支持IUnknown. 没有IUnknown接口,Delphi 不能调用QueryInterface来执行转换。

所以我改变了我的TRobotStream类来宣传它实现了缺失的接口(它确实做到了;它从它的祖先那里继承了它):

现在它可以编译了,但是在运行时就崩溃了:

现在我可以看到发生了什么,但我无法解释为什么。DelphiIntfClear在我的父Robot对象上调用子对象的构造函数。

我不知道防止这种情况的正确方法。我可以尝试强制演员:

并希望保持参考。事实证明,它确实保留了引用 - 在构造函数中没有崩溃。

注意:这让我很困惑。因为我正在传递一个需要接口的对象。我会假设编译器正在隐式执行类型转换,即:

Result := TRobotStream.Create(Self 作为我未知);

为了满足调用。语法检查器没有抱怨的事实让我假设一切都是正确的。


但崩溃还没有结束。我已将行更改为:

并且代码确实从构造函数返回而TRobotStream不会破坏我的父对象,但是现在我得到了堆栈溢出。

原因是将所有(即类型转换)TAggregatedObject推迟到父对象。QueryInterface就我而言,我正在将 a 投射TRobotStreamIStream.

当我在末尾询问TRobotStream它时:IStream

它转身向其控制器询问IStream接口,这会触发对以下内容的调用:

它转身并调用:

繁荣! 堆栈溢出。


盲目地,我尝试删除最终转换为IStream,让 Delphi 尝试将对象隐式转换为接口(我刚刚在上面看到它不能正常工作):

现在没有崩溃;我不太明白这一点。我已经构建了一个对象,一个支持多个接口的对象。现在 Delphi 知道如何转换接口?它是否执行正确的引用计数?我在上面看到它没有。是否有一个微妙的错误等待客户崩溃?

所以我有四种可能的方式来拨打我的一条线。其中哪一个是有效的?

  1. Result := TRobotStream.Create(Self);
  2. Result := TRobotStream.Create(Self as IUnknown);
  3. Result := TRobotStream.Create(Self) as IStream;
  4. Result := TRobotStream.Create(Self as IUnknown) as IStream;

真正的问题

我遇到了很多微妙的错误,并且难以理解编译器的复杂性。这让我相信我所做的一切都是完全错误的。如果需要,请忽略我所说的一切,并帮助我回答问题:

将接口实现委托给子对象的正确方法是什么?

也许我应该使用TContainedObject而不是TAggregatedObject. 也许两者协同工作,父母应该在哪里,TAggregatedObject孩子在哪里TContainedObject。也许情况正好相反。也许在这种情况下都不适用。

注意:我帖子主要部分的所有内容都可以忽略。这只是为了表明我已经考虑过了。有些人会争辩说,通过包含我尝试过的内容,我已经毒化了可能的答案;人们可能会关注我失败的问题,而不是回答我的问题。

真正的目标是将接口实现委托给子对象。这个问题包含我在解决问题的详细尝试 TAggregatedObject。您甚至看不到我的其他两种解决方案模式。其中之一受到循环引用计数的影响,并且违反了 IUnknown等价规则。

Rob Kennedy 可能还记得;并要求我提出一个问题,要求解决问题,而不是在我的一个解决方案中解决问题。

编辑:语法化

编辑2:没有机器人控制器之类的东西。嗯,有 - 我一直在使用 Funuc RJ2 控制器。但不是在这个例子中!

编辑 3*

这里的问题是“父”TRobot对象在调用期间被破坏:

0 投票
4 回答
1790 浏览

delphi - 是否有可以处理 .png 文件的 Delphi 5 组件

是否有可以处理 .png 文件的 Delphi 5 组件?

0 投票
4 回答
2442 浏览

delphi - Delphi 中具有自定义值的枚举

可以像这样在 Delphi 5 中声明具有自定义值的枚举吗?:

谢谢!