osx – Webview不显示在MacOS使用Delphi XE2

我已经开始转换Webview接口在Delphi中消费。我已经设法让webkit库加载,并且所调用的接口方法似乎工作正常,但是,我似乎不能在主窗体上显示Webview。

下面是我声明的接口

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;

下面是代码构造一个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;

代码执行时不会引发任何异常,但只是不想出现。在Delphi中需要做什么不同?我发现目标C的例子看起来很简单:

一些客观的C例子我已经看到提及IBOutlets。它看起来不像这是相关的德尔福。

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

谢谢。

解决方法

获取FM窗体的NSWindow
将TForm引用转换为NSWindow
设置主机窗口。
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,nil);
 MyWebView := TWebView.Wrap(PWebView);
 MyWebView.setHostwindow(MyNSWindow);

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

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...