2013-05-13 12 views
6

Come convertire? (Classe Objective C -> Delphi XE4)XE4 (Firewallkey + libreria statica iOS), conversione Pascal dalla classe Objective C?

e Come utilizzare la classe Objective-C nella libreria statica di Delphi XE?

Di seguito è la mia prima prova. Ma fa errore.

Objective C Fonte

// objective C : test.h ---------------------------------------- 
@interface objc_test : NSObject { 
    BOOL busy; 
} 
- (int) test :(int) value; 
@end 

// objective C : test.m ---------------------------------------- 
@implementation objc_test 
- (int) test :(int) value { 
    busy = true; 
    return(value + 1); 
} 
@end 

Qui è sbagliato il mio codice di conversione. Come risolvere il problema?

Delphi Fonte

// Delphi XE4/iOS ------------------------------------------- 
{$L test.a} // ObjC Static Library 

type 
objc_test = interface (NSObject) 
function test(value : integer) : integer; cdecl; 
end; 

Tobjc_test = class(TOCLocal) 
    Public 
    function GetObjectiveCClass : PTypeInfo; override; 
    function test(value : integer): integer; cdecl; 
end; 

implmentation 

function Tobjc_test.GetObjectiveCClass : PTypeInfo; 
begin 
    Result := TypeInfo(objc_test); 
end; 

function Tobjc_test.test(value : integer): integer; 
begin 
    // ???????? 
    // 
end; 

Grazie

Simon, Choi

+0

in cui sembra essere implementare la funzione sia in obj-c e Pascal. Non vuoi implementare in obj-c e consumare in pascal? –

+0

Inoltre, sono sicuro che il compilatore fa più di "errore". Il compilatore si sforza di descrivere l'errore. Perché non puoi fare lo sforzo di dirci cosa dice? –

risposta

5

Quando si desidera importare una classe C Obiettivo è necessario effettuare le seguenti operazioni:

type 
    //here you define the class with it's non static Methods 
    objc_test = interface (NSObject) 
    [InterfaceGUID] 
    function test(value : integer) : integer; cdecl;  
    end; 

type 
    //here you define static class Methods 
    objc_testClass = interface(NSObjectClass) 
    [InterfaceGUID] 
    end; 

type 
    //the TOCGenericImport maps objC Classes to Delphi Interfaces when you call Create of TObjc_TestClass 
    TObjc_TestClass = class(TOCGenericImport<objc_testClass, objc_Test>) end; 

Inoltre è necessario un dlopen('test.a', RTLD_LAZY) (Dlopen è definito in Posix.Dlfcn)

quindi è possibile utilizzare il codice come segue:

procedure Test; 
var 
    testClass: objc_test; 
begin 
    testClass := TObjc_TestClass.Create; 
    testClass.test(3); 

end; 
+0

Davvero davvero grazie, Lars. È molto utile colla per iniziare. – user1497524