使用Delphi XE2在MacOS中不显示Webview


73

我已经开始转换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。看起来这与Delphi无关。

如何使WebView OSX Xcode项目在启动时加载URL?

谢谢。


1
我认为这是不可能的,因为Delphi仅使用Cocoa来显示表单,而其他所有内容都使用Quartz来显示。如果不为Cocoa编写完整的vcl,则您应该无法显示Cocoa对象。
亨利·古尔维斯特

1
“ freepascal”可能不是一个合适的标签,因为Free Pascal通过Objective Pascal而不是接口和D2010 rtti(FPC尚不支持)通过Cocoa与Cocoa接口。如果您对此事感兴趣,那么LCL可可后端将是一个粗略的起点。(afaik它具有基本的FORM支持工作)
Marco van de Voort 2012年

1
@HenriGourvest我要做的就是显示一个带有webview控件的基本表单-有没有办法只使用可可粉而不使用石英?
菲利普·鲁

2
我一点都不了解delphi,但是阅读您的帖子听起来似乎与(缺少适当的)图形上下文有关,或者WebView需要Runloop来获取/显示请求。
2012年

1
我不知道太多关于德尔福,但它是如何在正常的编程,你需要手动显示窗口,/小部件等。显示窗口
Amitg2k12

Answers:


7

Getting the NSWindow of a FMX form
将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, 10, 300, 300), nil, nil);
 MyWebView := TWebView.Wrap(PWebView);
 MyWebView.setHostWindow(MyNSWindow);

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

@PhillipRoux:你看到我的回答了吗?
moskito-x 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.