使用 Delphi XE2 在 MacOS 中不显示 Webview

Posted

技术标签:

【中文标题】使用 Delphi XE2 在 MacOS 中不显示 Webview【英文标题】:Webview not displaying in MacOS using Delphi XE2 【发布时间】:2012-04-01 16:11:15 【问题描述】:

我已经开始将 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 无关。

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

谢谢。

【问题讨论】:

我认为这是不可能的,因为 Delphi 只使用 Cocoa 显示表单,其他一切都使用 Quartz 显示。如果不为 Cocoa 编写完整的 vcl,您应该无法显示 Cocoa 对象。 "freepascal" 可能不是一个合适的标签,因为 Free Pascal 通过 Objective Pascal 与 Cocoa 接口,而不是接口和 D2010 rtti(FPC 尚不支持)。如果您对此事感兴趣,LCL Cocoa 后端有一个粗略的开始。 (afaik 它具有基本的 FORM 支持) @HenriGourvest 我想要做的就是显示一个带有 webview 控件的基本表单 - 有没有办法只使用可可而不使用石英? 我根本不知道delphi,但是阅读您的帖子听起来这与(缺乏/适当的)图形上下文有关,或者WebView需要一个runloop才能获取/显示请求。 我对Delphi不太了解,但是在正常编程中它是如何进行的,你需要手动显示窗口,显示窗口/小部件等。 【参考方案1】:

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:你看到我的回答了吗?【参考方案2】:

你考虑过Chromium Embedded port for Delphi吗?

【讨论】:

以上是关于使用 Delphi XE2 在 MacOS 中不显示 Webview的主要内容,如果未能解决你的问题,请参考以下文章

Delphi - 需要 XE2 代码到 Delphi7。使用wininet下载文件

使用 Delphi XE2 的 AnimateWindow

在 Delphi XE2 中使用泛型和前向声明时的编译器错误

如何使用Delphi XE2覆盖WSDL中的服务名称?

Delphi XE2 数据模块只需要数据库组件?

有没有 Delphi XE2 样式库?