我一直在摆弄周围与Allen Bauer的代码的通用多播事件调度程序(见他关于它的博客文章在这里).
他提供了足够的代码让我想要使用它,不幸的是他没有发布完整的源代码.我有一个bash让它工作,但我的汇编技能是不存在的.
我的问题是InternalSetDispatcher方法.天真的方法是使用与其他InternalXXX方法相同的汇编程序:
procedure InternalSetDispatcher;
begin
XCHG EAX,[ESP]
POP EAX
POP EBP
JMP SetEventDispatcher
end;
Run Code Online (Sandbox Code Playgroud)
但这用于具有一个const参数的过程,如下所示:
procedure Add(const AMethod: T); overload;
Run Code Online (Sandbox Code Playgroud)
SetDispatcher有两个参数,一个是var:
procedure SetEventDispatcher(var ADispatcher: T; ATypeData: PTypeData);
Run Code Online (Sandbox Code Playgroud)
所以,我认为堆栈会被破坏.我知道代码在做什么(通过弹出对self的隐藏引用来清理堆栈帧从调用到InternalSetDispatcher,我假设返回地址),但我只是无法弄清楚那个小小的汇编程序来获取整个代码事情进行着.
编辑:只是为了澄清,我正在寻找的是我可以用来使InternalSetDispatcher方法工作的汇编程序,即汇编程序用两个参数清理一个过程的堆栈,一个是var.
编辑2:我已经修改了一下这个问题,感谢梅森到目前为止的答案.我应该提到上面的代码不起作用,并且当SetEventDispatcher返回时,会引发AV.
我试图在TPageControl上使用TLinkLabel,我找不到让它使用它的父级背景的方法.
// Image removed because the website doesn't exist any more
// and I can't find it anywhere... Sorry.
Run Code Online (Sandbox Code Playgroud)
如您所见,父标签页的可爱渐变不会保留在链接文本后面.
我希望在流动的文本块(TLinkLabel提供的功能)中具有多个链接的功能,并且具有显示在文本后面的父级的背景.
TLinkLabel没有ParentBackground属性.我试过创建一个派生类,将csParentBackground添加到控件样式,但无济于事:
TMyLinkLabel = class (TLinkLabel)
public
constructor Create(AOwner: TComponent); override;
end;
...
constructor TMyLinkLabel.Create(AOwner: TComponent);
begin
inherited;
ControlStyle := ControlStyle - [csOpaque] + [csParentBackground]
end;
Run Code Online (Sandbox Code Playgroud)
有人有主意吗?
这必须是Delphi的bug ...
我有一个单位,这是我的持久性框架的基础.在该单元中,我有一个用于所有域对象的基类,一个列表类和一个通用列表类.
就在最近我注意到,当我在调试时进入单元时,执行将跳转到文件中的某个位置,而不是它应该......可能是四行或五行.重新排序文件没有区别.代码也会生成访问冲突,但只有在我调试它时.
我试图找到原因...我想到了几件事情,比如一些代码注入拧紧调试器(例如这个logitec网络摄像头驱动程序错误),或调试信息与我的单位源不同步(例如dcu被从一些旧的来源拉出来).
最后,我用一个干净的Windows + Delphi安装启动了一个虚拟机,只抓住了我需要测试的单元,我创建了一个小的DUnit项目来测试它.同样的问题.
然后我开始一次从设备中取出东西直到它工作.唯一不同的是我删除了通用列表类.
有没有人见过这个问题?有谁知道如何绕过它?
提前致谢,
N - [
更新:将通用添加回单元会使问题回来,因此这不是陈旧DCU的问题.
我有一个持久性框架,我正在尝试使用泛型,所以我不必继续为我希望以类型安全的方式存储的每种类型的对象创建新的列表类.
我有一个方法返回列表类中包含的对象的类(所以我知道要运行哪些查询以及要创建哪个对象.
例如,它看起来像这样:
type
TMyObject = class
end;
TMyObjectClass = class of TMyObject;
TMyObjectList = class
public
function ListClass: TMyObjectClass; virtual; abstract;
end;
TMyObjectList<T: TMyObject, constructor> = class(TMyObjectList)
public
function ListClass: TMyObjectClass; override;
end;
implementation
{ TMyObjectList<T> }
function TMyObjectList<T>.ListClass: TMyObjectClass;
begin
result := T; // <==== this wont compile
end;
end.
Run Code Online (Sandbox Code Playgroud)
在这种情况下,有没有办法返回泛型参数的类?
谢谢
N @(使用Delphi 2009)