不同 Object Pascal 方言中的事件分配语法

11

我正在开发一个应该在Delphi和C++Builder之间共享的组件,因此我使用Pascal作为通用语言。由于我家里没有Delphi,所以我首先在Lazarus IDE中创建了这个组件。现在我将其“移植”到Delphi,并发现了一个令人惊讶的语法问题:

这在FPC上可以编译(但在Delphi上不能):

FSync.FSyncMethod := @SyncCheckInput;

这个可以使用Delphi编译(但不能使用FPC):

FSync.FSyncMethod := SyncCheckInput;

尽管Lazarus和Delphi语法不同,我该如何分享一个单元?


“缺乏通用(且可移植)的同步机制” - FreePascal 模仿了 Delphi 的许多核心类,包括 TThread 及其 Synchronize() 方法:FreePascal Wiki | 多线程应用教程 | TThread 类 - Remy Lebeau
@RemyLebeau 我需要一种非阻塞同步机制,我在Lazarus中使用了(线程安全的)Application.QueueAsyncCall和在Delphi中通过AllocateHWnd向一个不可见的窗口发送PostMessage来实现。当然,我也使用了TThread类,但是由于其约会特性,Synchronize在我的情况下并没有帮助。无论如何,还是谢谢 :) - Wolf
TThread还具有异步的Queue()方法。 - Remy Lebeau
@RemyLebeau,恐怕Delphi 4中没有Queue方法可供使用(我不确定,现在手头没有D4或其文档)。因此,我最好从问题中删除旁注,或者更具体地说明我正在使用的版本? - Wolf
你没有说明你正在使用哪个 Delphi/FreePascal 版本。不,在 D4 中不存在 Queue() 函数。FreePascal 模仿 D7。 - Remy Lebeau
我删除了有关同步机制的注释。顺便说一下,TThread.Queue目前在LCL中不存在。 - Wolf
1个回答

15
将此代码插入到您的单元开始处:
{$IFDEF FPC}{$MODE DELPHI}{$ENDIF}

这将指示FreePascal使用Delphi方言来编译单元。由于未定义FPC,Delphi将忽略{$MODE DELPHI}指令
然后您可以使用此
FSync.FSyncMethod := SyncCheckInput;

用于动态设置事件。


这就是我所期望的解决方案! - Wolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接