2013-05-13 5 views
6

Jak przeprowadzić konwersję? (Klasa C celu -> Delphi XE4)XE4 (Firemonkey + iOS Static Library), konwersja Pascala z klasy Objective C?

oraz jak używać klasy Objective-C w bibliotece statycznej Delphi XE?

Oto moja pierwsza próba. Ale powoduje błąd.

Objective C Źródło

// 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 

Oto źle mój kod konwersji. Jak to naprawić?

Delphi Źródło

// 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; 

Dzięki

Simon, Choi

+0

pojawiasz się do realizacji funkcji zarówno w obj-C i Pascal. Nie chcesz zaimplementować w obj-c i zużyć w paśmie? –

+0

Co więcej, jestem pewien, że kompilator robi więcej niż "popełnia błąd". Kompilator dokłada starań, aby opisać błąd. Dlaczego nie możesz wysilić się, by powiedzieć nam, co mówi? –

Odpowiedz

5

Gdy chcesz zaimportować Objective C Klasa trzeba wykonać następujące czynności:

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; 

Potrzebujesz również dlopen('test.a', RTLD_LAZY) (Dlopen jest zdefiniowana w Posix.Dlfcn)

Następnie można użyć kodu w następujący sposób:

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

end; 
+0

Naprawdę, naprawdę dziękuję, Lars. Jest bardzo pomocny, aby zacząć. – user1497524