Webview wird in MacOS mit Delphi XE2 nicht angezeigt

73

Ich habe begonnen, die in Delphi zu verwendenden Webview-Schnittstellen zu konvertieren. Ich habe es geschafft, die Webkit-Bibliothek zum Laden zu bringen, und die aufgerufenen Schnittstellenmethoden scheinen korrekt zu funktionieren. Ich kann die Webansicht jedoch nicht im Hauptformular anzeigen.

Unten sind meine Schnittstellen, die deklariert sind

  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;

Und hier folgt der Code zum Erstellen einer 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;

Der Code wird ohne Ausnahmen ausgeführt, möchte jedoch nicht angezeigt werden. Was muss in Delphi anders gemacht werden? Die Beispiele, die ich für Ziel C gefunden habe, scheinen recht einfach zu sein:

Einige objektive C-Beispiele, die ich gesehen habe, erwähnen IBOutlets. Es sieht nicht so aus, als wäre dies für Delphi relevant.

Wie kann das WebView OSX Xcode-Projekt beim Start eine URL laden?

Vielen Dank.

Phillip Roux
quelle
1
Ich denke, es ist nicht möglich, da Delphi nur Kakao verwendet, um ein Formular anzuzeigen, alles andere wird mit Quarz angezeigt. Sie sollten nicht in der Lage sein, Cocoa-Objekte anzuzeigen, ohne eine vollständige vcl für Cocoa zu schreiben.
Henri Gourvest
1
"freepascal" ist möglicherweise kein geeignetes Tag, da Free Pascal über Objective Pascal, nicht über Schnittstellen und D2010 rtti (die FPC noch nicht unterstützt) mit Cocoa verbunden ist. Wenn Sie an der Sache interessiert sind, gibt es einen schwierigen Start eines LCL Cocoa-Backends. (afaik es hat grundlegende FORM-Unterstützung funktioniert)
Marco van de Voort
1
@HenriGourvest Ich möchte nur ein Grundformular mit dem Webview-Steuerelement anzeigen. Gibt es eine Möglichkeit, nur Kakao ohne Quarz zu verwenden?
Phillip Roux
2
Ich kenne Delphi überhaupt nicht, aber das Lesen Ihres Beitrags scheint entweder mit dem (Fehlen eines / richtigen) Grafikkontexts oder mit WebView zu tun zu haben, das einen Runloop benötigt, um die Anfrage abzurufen / anzuzeigen.
Arri
1
Ich weiß nicht viel über Delphi, aber wie es in der normalen Programmierung geht, ist, müssen Sie Fenster manuell anzeigen, um das Fenster / Widget usw. anzuzeigen.
Amitg2k12

Antworten:

7

Getting the NSWindow of a FMX form
Konvertieren einer TForm-Referenz in ein NSWindow-
Set- Hostfenster .
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;
moskito-x
quelle
@PhillipRoux: Hast du meine Antwort gesehen?
moskito-x