问题标签 [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.
delphi - Delphi:所有常数都是常数,但有些常数比其他常数?
考虑:
以及有效的替代措辞:
解释。
然后考虑:
并修复。
编辑:const
在声明前添加关键字;有人不相信他们是常量。
delphi - 复制 Delphi 配置文件
我的电脑最近崩溃了。我们有一个需要大量工作才能运行的 Delphi 应用程序。
我的一位同事仍然安装了它。有没有办法复制存储在调色板中的东西?和图书馆路径?
我正在使用 Delphi 5(我知道它非常非常古老)
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
?
delphi - 读取控制台应用程序的 unicode 输出
我有控制台应用程序。用 Delphi 2010 编写。它的输出支持 Unicode。(我为此使用了 UTF8Encode 和 SetConsoleOutputCP(CP_UTF8))。当我从命令提示符运行程序时,它工作正常。
现在我想读取在Delphi 5中创建的另一个程序的输出。我使用这种方法。但是我遇到了 unicode 字符的问题。
有没有人推荐阅读控制台应用程序的 unicode 输出。从德尔福5?
delphi - Delphi:快速(更)宽字符串连接
我有一个功能是将 ADORecordset
转换为 html:
该函数的核心涉及大量宽字符串连接:
对于几千个结果,该函数所花费的时间,任何用户都会感觉到,运行时间太长了。Delphi Sampling Profiler显示99.3%的时间用于宽字符串连接 (@WStrCatN
和@WstrCat
)。
任何人都可以想出一种改进宽字符串连接的方法吗?我认为 Delphi 5 没有任何类型的字符串生成器。并且Format
不支持Unicode。
并确保没有人试图偷懒:假装你正在实现接口:
更新一
我想过使用IXMLDOMDocument
, 将 HTML 构建为 xml。但后来我意识到最终的 HTML 将是xhtml
而不是html
- 一个微妙但重要的区别。
更新二
Microsoft 知识库文章:如何提高字符串连接性能
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
,是两个地址!
sql-server-2005 - Delphi - BOF 或 EOF 为 True,或当前记录已被删除
当我尝试在 MS SQL Server 2005 中的空表上进行选择时出现此错误:“BOF 或 EOF 为 True,或者当前记录已被删除”。我在 Delphi 5 中使用了 TADOConnection 和 TADODataSet 来连接和检索数据库中的数据。
有没有办法检查数据库表是否为空而不会产生此类错误?
delphi - Delphi:如何将接口实现委托给子对象?
我有一个对象,它将一个特别复杂的接口的实现委托给一个子对象。这正是我认为的工作TAggregatedObject
。“子”对象维护对其“控制器”的弱引用,所有QueryInterface
请求都传回父对象。这维护了IUnknown
始终是同一个对象的规则。
所以,我的父(即“控制器”)对象声明它实现了IStream
接口:
注意:这是一个假设的例子。我选择这个词
Robot
是因为它听起来很复杂,而且这个词只有 5 个字母长——它很短。我也选择了IStream
它,因为它很短。我打算使用IPersistFile
orIPersistFileInit
,但它们更长,并且使示例代码更难实现。换句话说:这是一个假设的例子。
现在我有我的子对象将实现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 投射TRobotStream
到IStream
.
当我在末尾询问TRobotStream
它时:IStream
它转身向其控制器询问IStream
接口,这会触发对以下内容的调用:
它转身并调用:
繁荣! 堆栈溢出。
盲目地,我尝试删除最终转换为IStream
,让 Delphi 尝试将对象隐式转换为接口(我刚刚在上面看到它不能正常工作):
现在没有崩溃;我不太明白这一点。我已经构建了一个对象,一个支持多个接口的对象。现在 Delphi 知道如何转换接口?它是否执行正确的引用计数?我在上面看到它没有。是否有一个微妙的错误等待客户崩溃?
所以我有四种可能的方式来拨打我的一条线。其中哪一个是有效的?
Result := TRobotStream.Create(Self);
Result := TRobotStream.Create(Self as IUnknown);
Result := TRobotStream.Create(Self) as IStream;
Result := TRobotStream.Create(Self as IUnknown) as IStream;
真正的问题
我遇到了很多微妙的错误,并且难以理解编译器的复杂性。这让我相信我所做的一切都是完全错误的。如果需要,请忽略我所说的一切,并帮助我回答问题:
将接口实现委托给子对象的正确方法是什么?
也许我应该使用TContainedObject
而不是TAggregatedObject
. 也许两者协同工作,父母应该在哪里,TAggregatedObject
孩子在哪里TContainedObject
。也许情况正好相反。也许在这种情况下都不适用。
注意:我帖子主要部分的所有内容都可以忽略。这只是为了表明我已经考虑过了。有些人会争辩说,通过包含我尝试过的内容,我已经毒化了可能的答案;人们可能会关注我失败的问题,而不是回答我的问题。
真正的目标是将接口实现委托给子对象。这个问题包含我在解决问题的详细尝试
TAggregatedObject
。您甚至看不到我的其他两种解决方案模式。其中之一受到循环引用计数的影响,并且违反了IUnknown
等价规则。Rob Kennedy 可能还记得;并要求我提出一个问题,要求解决问题,而不是在我的一个解决方案中解决问题。
编辑:语法化
编辑2:没有机器人控制器之类的东西。嗯,有 - 我一直在使用 Funuc RJ2 控制器。但不是在这个例子中!
编辑 3*
这里的问题是“父”TRobot
对象在调用期间被破坏:
delphi - 是否有可以处理 .png 文件的 Delphi 5 组件
是否有可以处理 .png 文件的 Delphi 5 组件?
delphi - Delphi 中具有自定义值的枚举
可以像这样在 Delphi 5 中声明具有自定义值的枚举吗?:
谢谢!