2015-10-22 16 views
11

Ich arbeite an einer Komponente, die zwischen Delphi und C++ Builder freigegeben werden soll, also verwende ich Pascal als lingua franca. Weil ich zu Hause Delphi nicht auf meinem Computer habe, habe ich zuerst die Komponente in der Lazarus IDE erstellt. Jetzt habe ich "portiert" es nach Delphi und fand eine erstaunliche Syntax Problem:Ereigniszuweisungssyntax in verschiedenen Object Pascal-Dialekten

Dies kompiliert mit FPC (aber nicht Delphi):

FSync.FSyncMethod := @SyncCheckInput; 

Dies kompiliert mit Delphi (aber nicht FPC):

FSync.FSyncMethod := SyncCheckInput; 

Wie kann ich trotz dieser syntaktischen Divergenz eine Einheit zwischen Lazarus und Delphi teilen?

+0

"* Fehlen eines gemeinsamen (und portablen) Synchronisationsmechanismus *" - FreePascal ahmt viele der Delphi-Kernklassen nach, einschließlich 'TThread' und seine' Synchronize() 'Methode: [FreePascal Wiki | Multithreaded Application Tutorial | Die TThread-Klasse] (http://wiki.freepascal.org/Multithreaded_Application_Tutorial#The_Thread_Class) –

+0

@RemyLebeau Ich brauchte einen nicht-blockierenden Synchronisationsmechanismus und ich habe es mit (dem thread-sicheren) 'Application.QueueAsyncCall' in Lazarus und' PostMessage 'zu einem unsichtbaren Fenster (über' AllocateHWnd') in Delphi. Natürlich habe ich die "TThread" -Klasse verwendet, aber "Synchronize" war in meinem Fall wegen seiner Rendezvous-Funktion nicht hilfreich. Danke trotzdem :) – Wolf

+0

'TThread' hat auch eine asynchrone' Queue() 'Methode. –

Antwort

15

Legen Sie diese am Anfang Ihrer Einheiten:

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

Dies wird Freepascal anweisen, den Delphi-Dialekt zu verwenden, um das Gerät zu kompilieren. Delphi ignoriert die {$MODE DELPHI} directive, weil FPC nicht definiert ist.

Sie können dann mit diesen

FSync.FSyncMethod := SyncCheckInput; 

für Ereignisse dynamisch einstellen.

+0

Das ist die Art von Lösung, auf die ich gehofft hatte! – Wolf