2012-03-16 17 views
73

Ho iniziato a convertire le interfacce Webview da utilizzare in Delphi. Sono riuscito a caricare la libreria del webkit e i metodi di interfaccia chiamati sembrano funzionare correttamente, tuttavia, non riesco a visualizzare la Webview nel modulo principale.Visualizzazione Web non visibile in MacOS utilizzando Delphi XE2

Sotto è il mio interfacce che viene dichiarato

WebFrameClass = interface(NSObjectClass) 
    ['{7BE750C8-DFEC-4870-851A-12DBCB0B78F6}'] 
    end; 

    WebFrame = interface(NSObject) 
    ['{BCFA04BE-41AB-4B78-89C0-3330F12C7695}'] 
    procedure loadRequest(request: NSURLRequest); cdecl; 
    end; 
    TWebFrame = class(TOCGenericImport<WebFrameClass, WebFrame>) end; 

    WebViewClass = interface(NSViewClass) 
    ['{0D9F44B7-09FD-4E35-B96E-8DB71B9A2537}'] 
    {class} function canShowMIMEType(MIMEType: NSString): Boolean; cdecl; 
    end; 

    WebView = interface(NSView) 
    ['{C36D8016-2FCB-49F0-BA1C-C9913A37F9AC}'] 
    procedure clos; cdecl; 
    procedure setHostWindow(hostWindow: NSWindow); cdecl; 
    function initWithFrame(frame: NSRect; frameName: NSString; groupName: NSString): Pointer; cdecl; 
    function mainFrame: WebFrame; cdecl; 
    end; 
    TWebView = class(TOCGenericImport<WebViewClass, WebView>) end; 

E qui di seguito per il codice per costruire una WebView:

procedure TForm2.Button1Click(Sender: TObject); 
var 
    PWebView: Pointer; 
    FwkMod: HMODULE; 
    MyWebView: WebView; 
    urlStr: NSURL; 
    urlreq: NSURLRequest; 
const 
    WebKitFWK: string = '/System/Library/Frameworks/WebKit.framework/WebKit'; 
begin 
    FwkMod := System.SysUtils.LoadLibrary(PWideChar(WebKitFWK)); 
    PWebView := TWebView.Alloc.initWithFrame(MakeNSRect(10, 10, 300, 300), nil, nil); 
    MyWebView := TWebView.Wrap(PWebView); 

    urlStr := TNSURL.Create; 
    urlstr.initWithString(NSSTR('http://google.com.au/')); 
    urlreq := TNSURLRequest.Create; 
    urlreq.initWithURL(urlstr); 
    MyWebView.mainFrame.loadRequest(urlreq); 
end; 

Il codice viene eseguito senza sollevare alcuna eccezione, ma proprio non vuole comparire . Cosa deve essere fatto in modo diverso in Delphi? Gli esempi che ho trovato per l'obiettivo C sembrano essere piuttosto semplici:

Alcuni esempi di obiettivi C che ho visto menzionare IBOutlets. Non sembra che questo sia rilevante per Delphi.

How to make WebView OSX Xcode project load a URL on launch?

Grazie.

+1

Penso che non sia possibile poiché Delphi usa solo Cocoa per visualizzare un modulo, tutto il resto viene visualizzato utilizzando Quarzo. Yous non dovrebbe essere in grado di visualizzare oggetti Cocoa senza scrivere un vcl completo per Cocoa. –

+1

"freepascal" potrebbe non essere un tag appropriato, poiché Free Pascal si interfaccia a Cocoa su Objective Pascal, non su interfacce e D2010 rtti (che FPC non supporta ancora). Se sei interessato alla questione, c'è un inizio approssimativo di un backend LCL Cocoa. (afarik ha il supporto di base per FORM funzionante) –

+1

@HenriGourvest Tutto quello che voglio fare è visualizzare un modulo di base con il controllo webview su di esso - C'è un modo per usare solo il cacao senza quarzo? –

risposta

7

Getting the NSWindow of a FMX form
convertire un riferimento a un TForm NSWindow
Finestra set Host.
MyWebView.setHostWindow(MyNSWindow)

procedure TForm2.Button1Click(Sender: TObject); 
var 
[...] 
ObjTOC: TOCLocal; 
MyNSWindow : NSWindow; 
[...] 
ObjTOC := (FmxHandleToObjC(Form2.Handle) as TOCLocal); 
MyNSWindow := NSWindow(TOCLocalAccess(ObjTOC).Super); 

PWebView := TWebView.Alloc.initWithFrame(MakeNSRect(10, 10, 300, 300), nil, nil); 
MyWebView := TWebView.Wrap(PWebView); 
MyWebView.setHostWindow(MyNSWindow); 

[...] 
MyWebView.mainFrame.loadRequest(urlreq); 
end; 
+0

@PhillipRoux: hai visto la mia risposta? –

Problemi correlati