2015-10-22 8 views
11

Я работаю над компонентом, который должен использоваться совместно с Delphi и C++ Builder, поэтому я использую Pascal как lingua franca. Поскольку у меня нет дома Delphi на моем компьютере дома, я сначала создал компонент в Lazarus IDE. Теперь я "портирована" его на Delphi и обнаружил удивительную проблему синтаксиса:Синтаксис назначения заданий в разных диалектах Object Pascal

Это компилирует с FPC (но не Delphi):

FSync.FSyncMethod := @SyncCheckInput; 

Это компилирует с Delphi (но не FPC):

FSync.FSyncMethod := SyncCheckInput; 

Как я могу делиться единицей между Лазарем и Дельфами, несмотря на эту синтаксическую дивергенцию?

+0

«* Отсутствие общего (и портативного) механизма синхронизации *» - FreePascal имитирует многие из основных классов Delphi, включая «TThread» и его метод «Synchronize()»: [FreePascal Wiki | Многопоточный учебник по приложениям | Класс TThread] (http://wiki.freepascal.org/Multithreaded_Application_Tutorial#The_TThread_Class) –

+0

@RemyLebeau Мне нужен механизм блокировки без блокировки, и я получил его с помощью (thread-safe) 'Application.QueueAsyncCall' в Lazarus и' PostMessage' в невидимое окно (через 'AllocateHWnd') в Delphi. Конечно, я использовал класс 'TThread', но' Synchronize' не помог мне в этом случае из-за его функции рандеву. Спасибо в любом случае :) – Wolf

+0

'TThread' также имеет асинхронный метод' Queue() '. –

ответ

15

Вставьте это в начале ваших юнитов:

{$IFDEF FPC}{$MODE DELPHI}{$ENDIF} 

Это будет инструктировать FreePascal использовать диалект Delphi для компиляции блока. Delphi будет игнорировать {$MODE DELPHI} directive, потому что FPC не определен.

Вы можете использовать этот

FSync.FSyncMethod := SyncCheckInput; 

для настройки событий динамически.

+0

Это то решение, на которое я надеялся! – Wolf