我有一个所有者绘制的组合框,在列中显示字符串.如果我可以以某种方式将列规范传递给OnDrawItem事件,则可以跨组合共享绘图例程.这样做的一种自然方法是传递ComboBox.Tag属性中的列宽数组,然后将其强制转换回数组.
当我将列数组定义为:
const arrWidth :array[1..4] of integer = (100,100,100,70);
Run Code Online (Sandbox Code Playgroud)
并将Tag属性设置为:
ComboBox.Tag := integer(@arrWidth);
Run Code Online (Sandbox Code Playgroud)
然后在OnDrawItem事件中,将其强制转换为数组:
Widths :array of integer;
Widths := pointer(ComboBox.Tag);
Run Code Online (Sandbox Code Playgroud)
我可以看到数组元素很好,但数组不知道它的长度.各种随机值似乎要长得多.
我尝试过使用动态数组,但后来我甚至没有得到正确的列值.
我有一个复杂的应用程序,在正常编译时按预期工作,但是在使用FastMM 4.97(最新版本)编译时关闭表单会产生访问冲突.当消息调度尝试处理已经被销毁的表单上的按钮的消息时,会发生AV.我还为项目启用了Eurekalog 6.1.0.1(最新版本).在禁用FastMM的FullDebug模式的情况下执行相同的代码时,它不会捕获任何运行时异常.
在某些情况下,FastMM是否可能会改变EXE的行为,从而导致或错误地报告访问冲突?
这是FastMM错误报告:
--------------------------------2011/3/21 13:30:17--------------------------------
FastMM has detected an attempt to call a virtual method on a freed object. An access violation will now be raised in order to abort the current operation.
Freed object class: TftGenericButton80
Virtual method: Offset +80
Virtual method address: 4A1FF0
The allocation number was: 5628628
The object was allocated by thread 0xE80, and the stack trace (return addresses) at the time was:
403110 [System][@GetMem]
404F03 [System][TObject.NewInstance]
42E85D [FastMM4][CreateComponent]
42EAD9 [FastMM4][TReader.ReadComponent]
42FEE1 [Classes][TReader.ReadValue]
42ED86 …Run Code Online (Sandbox Code Playgroud) 当TServiceApplication尝试向ServiceManager注册服务时,我收到EOSError代码5-访问被拒绝。
我正在使用XE2 Win7 64位。32位和64位目标均会发生错误。
我有一个使用ADO连接到数据库和Web服务服务器代码的数据模块。所有代码都在可以正常工作的WinUI项目中使用。我也有一个基于相同核心代码的未经测试的ISAPI DLL。
这是我第一次尝试将Web服务服务器合并到NT服务中。
我已经在Vcl.SvcMgr的第1027行中跟踪了产生错误的VCL代码,但是我不知道为什么我会收到“访问被拒绝”错误。我已经编写了其他通过ADO连接到数据库的NT服务,并且没有遇到过这样的错误(尽管使用XE编写)。
任何指针将不胜感激。