2013-05-13 7 views
6

Wie wird konvertiert? (Objective C-Klasse -> Delphi XE4)XE4 (Firemonkey + iOS Static Library), Pascal-Konvertierung von Objective C-Klasse?

und Wie Objective-C-Klasse in der statischen Bibliothek von Delphi XE zu verwenden?

Folgendes ist der erste Versuch. Aber es macht Fehler.

Objective C Quelle

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

hier falsch ist meine Conversion-Code. Wie behebt man das?

Delphi Quelle

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

Dank

Simon, Choi

+0

Sie erscheinen sowohl die Funktion in obj-c zu implementieren und pascal. Willst du nicht in Obj-c implementieren und konsumieren in Pascal? –

+0

Ich bin mir sicher, dass der Compiler mehr als "Fehler machen" macht. Der Compiler bemüht sich, den Fehler zu beschreiben. Warum können Sie sich nicht die Mühe machen, uns zu sagen, was es sagt? –

Antwort

5

Wenn Sie eine Objective-C-Klasse importieren Sie Folgendes tun:

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; 

Sie benötigen auch eine dlopen('test.a', RTLD_LAZY) (Dlopen wird in Posix.Dlfcn definiert)

Dann können Sie den Code wie folgt verwenden:

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

end; 
+0

Wirklich wirklich Danke, Lars. Es ist sehr hilfreich, Klebstoff zu starten. – user1497524

Verwandte Themen