Firemonkey实现Mac OS程序中内嵌浏览器的功能(自己动手翻译,调用苹果提供的webkit框架)
XE系列虽然可以跨平台,但是在跨平台的道路上只是走了一小半的路,很多平台下的接口都没实现彻底,所以为了某些功能,还必须自己去摸索。
想实现程序中可以内嵌浏览器的功能,但是Firemonkey还没有对应的控件,
TMS 倒是提供了true native Mac OS-X application development,TMS mCL 以及 JVEsoft的组件包,提供了对应的web浏览器控件,但是都不是免费的,而且试用么TMS的问题还是有很多,为了省银子,卷起袖子自己搞。
思路其实很简单,苹果已经提供了webkit的框架,我的firemonkey只要能调用他的框架,就能使用它的功能了。
这也是XE系列的思路。
现在要做的是如何翻译Mac OS Api了,这还是第一次搞,所以还不知道怎么弄,翻山越岭搜了一下,发现翻译想自己实现webview的只有一个信息http://stackoverflow.com/questions/9731817/webview-not-displaying-in-macos-using-delphi-xe2,他遇到了无法显示出来的一个问题。我跑了他的代码,发现XE2下的代码已经不能在XE4下运行了,稍作修改后,程序可以正常运行了,但是一直没有效果,真的很困惑,问题出在哪里了呢?
在github上有搜到了类似的代码,看代码应该是日本人写的https://gist.github.com/tokibito/6945988/raw/6770e1fd3f8b3c8fd2e0da5498248a7e79f73944/Unit1.pas,还是打不开网页。
于是发帖求助,一个老外给出了实现的方案,真心感谢,也不得不佩服他们。
- unit Unit1;
- interface
- uses
- System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
- System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
- FMX.StdCtrls, Macapi.CocoaTypes, Macapi.Foundation, Macapi.AppKit,
- Macapi.ObjectiveC, FMX.Platform.Mac;
- type
- 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;
- TOCLocalAccess = class(TOCLocal);
- TForm1 = class(TForm)
- procedure FormCreate(Sender: TObject);
- private
- MyWebView: WebView;
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.fmx}
- procedure TForm1.FormCreate(Sender: TObject);
- var
- PWebView: Pointer;
- FwkMod: HMODULE;
- urlStr: NSURL;
- urlreq: NSURLRequest;
- ObjTOC: TOCLocal;
- MyView: NSView;
- const
- WebKitFWK: string = '/System/Library/Frameworks/WebKit.framework/WebKit';
- begin
- FwkMod := System.SysUtils.LoadLibrary(PWideChar(WebKitFWK)); //必须要加
- MyView := WindowHandleToPlatform(Form1.Handle).View;
- PWebView := TWebView.Alloc.initWithFrame(MakeNSRect(10, 10, 200, 200), nil, nil);
- MyWebView := TWebView.Wrap(PWebView);
- MyView.addSubview(MyWebView);
- urlStr := TNSURL.Wrap(TNSURL.Alloc.initWithString(NSSTR('http://www.baidu.com/'))); // never ever call initWith... on an object created with "create". Some of these already fail on Mavericks, some may fail in the future
- urlreq := TNSURLRequest.Create; // fixing this is left as an exercise for the reader :) see previous line
- urlreq.initWithURL(urlstr); // .....
- MyWebView.mainFrame.loadRequest(urlreq);
- urlreq.release; // if you call alloc or create, you also have to call release, otherwise you will leak your object (create rule)
- // same for urlstr, ...
- end;
- end.
- var
- PWebView: Pointer;
- FwkMod: HMODULE;
- urlStr: NSURL;
- urlreq: NSURLRequest;
- ObjTOC: TOCLocal;
- MyNSWindow : NSWindow;
- MyView: NSView;
- const
- WebKitFWK: string = '/System/Library/Frameworks/WebKit.framework/WebKit';
- begin
- FwkMod := System.SysUtils.LoadLibrary(PWideChar(WebKitFWK));
- {//方法一
- ObjTOC := (WindowHandleToPlatform(Form1.Handle).Handle as TOCLocal);
- MyNSWindow := NSWindow(TOCLocalAccess(ObjTOC).Super);}
- //方法二
- MyNSWindow := WindowHandleToPlatform(Form1.Handle).Wnd;
- PWebView := TWebView.Alloc.initWithFrame(MakeNSRect(0, 0, 200, 200), nil, nil);
- MyWebView := TWebView.Wrap(PWebView);
- MyWebView.setHostWindow(MyNSWindow);
- //导致错误的地方
- //urlStr := TNSURL.Create;
- //urlstr.initWithString(NSSTR('http://www.google.com.hk/'));
- urlStr := TNSURL.Wrap(TNSURL.Alloc.initWithString(NSSTR('http://www.google.com.hk/')));
- urlreq := TNSURLRequest.Create;
- urlreq.initWithURL(urlstr);
- MyWebView.mainFrame.loadRequest(urlreq);
- MyNSWindow.setContentView(MyWebView);
- end;
http://blog.csdn.net/qustdong/article/details/17139137
Firemonkey实现Mac OS程序中内嵌浏览器的功能(自己动手翻译,调用苹果提供的webkit框架)的更多相关文章
- [MAC OS] XCode中的Debug View Hierarchy功能
reference to : http://blog.csdn.net/liujinlongxa/article/details/46490949 前言 做iOS开发经常会遇见这种情况,产品汪拿着你做 ...
- android之在view中内嵌浏览器的方法
我要做的一个东西是在一个页面的中间嵌入浏览器,一开始不知道从哪里开始,因为以前用的都是Textveiw或者editVeiw之类的控件,而它们并不能用来显示网页的内容,怎么办呢? 首先想到的是:是不是有 ...
- Unity中内嵌网页插件UniWebView使用总结
目前有三种方式可以实现在Unity工程中实现内嵌网页的功能: 1. UnityWebCore:只支持Windows平台,调用浏览器内核,将网页渲染到mesh,作为gameObject. 2. Un ...
- 在Mac OS X中配置Apache + PHP + MySQL
在Mac OS X中配置Apache + PHP + MySQL Mac OS X 内置Apache 和 PHP,使用起来非常方便.本文以Mac OS X 10.6.3和为例.主要内容包括: 启动Ap ...
- 在Mac OS X中配置Apache + PHP + MySQL 很详细
这是一篇超级详细的配置mac os下面php+mysql+apache的文章.非常详细我的大部分配置就是参考上面的内容的,比如,PHP不能连接数据库,就是改一下默认的php.ini中pdo_mysql ...
- 如何在Mac OS X 中运行Lua (Running Lua on Mac OS X)
参考文章:1) http://www.oschina.net/question/12_769552) http://rudamoura.com/luaonmacosx.html 最近在为iOS开发游戏 ...
- Unity中内嵌网页插件UniWebView
一.常见Unity中内嵌网页实现方式: 1.UnityWebCore只支持windows 2.Unity-Webview支持Android,IOS 3.UniWebView支持mac os,Andro ...
- Mac OS X 中一些常用的命令行技巧
一.网络设置相关 1.网卡的物理地址的动态重置 出于某些需求,例如网络中的 IP 地址或网络帐号与网卡物理地址绑定,使得多个设备无法切换上网,可尝试临时更改物理地址.不过,系统偏好设置是不能修改网卡物 ...
- 在Mac OS X中使用VIM开发STM32(2)
本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重! 在我先前的博文⎣在Mac OS X中使用VIM开发STM32(1)⎤中,我们安装完成了MACVIM,这一 ...
随机推荐
- Groovy&Gradle总结
欢迎大家加入QQ群一起讨论: 489873144(android格调小窝) 我的github地址:https://github.com/jeasonlzy 0x01 Groovy 概述 Groovy ...
- 自己动手编写一个VS插件(七)
作者:朱金灿 来源:http://blog.csdn.net/clever101 继续开发VS插件.今天在添加ATL控件时出现一个"未能返回新代码元素"的错误,如下图: 解决办法是 ...
- WPF 超长文本的来回滚动
原文:WPF 超长文本的来回滚动 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Vblegend_2013/article/details/8362 ...
- uwp - ContentDialog - 自定义仿iphone提示框,提示框美化
原文:uwp - ContentDialog - 自定义仿iphone提示框,提示框美化 为了实现我想要的效果花费了我很长时间,唉,当初英语不好好学,翻官网翻了半天才找到,分享给刚入门的新手. 首先看 ...
- python下载图片(3)
# -*- coding: utf-8 -*-"""some function by metaphy,2007-04-03,copyleftversion 0.2&quo ...
- Excel 2013永久取消超链接
原文:Excel 2013永久取消超链接 在使用Excel的过程中,Excel会自动将网址转换为超链接,操作不当,容易误点,引起不必要的错误, 那么本篇博客就总结下如何在Excel 2013里永久取消 ...
- WPF窗体隐藏鼠标光标的方法
原文:WPF窗体隐藏鼠标光标的方法 要引用 System.Windows.Input; Mouse.OverrideCursor = Cursors.None; 去掉 Override 则使用: ...
- 安德鲁斯Toast它们的定义和防止重复显示器
Toast安卓系统,当用户错误或功能运行完成,提示,要求用户,它不集中,并且将在一定时间内消失.然而,在用户继续误(如登录,password错)当次,将有多个Toast创建.系统会把这些toast放进 ...
- ubuntu 关闭 phpmyadmin
apache 有很多管理服务器的命令.apt-get installl phpmyadmin后突然想暂时关闭phpmyadmin,只需要a2disconf phpmyadmin即可.需要启用的时候再输 ...
- C++ Boost库简介(一些自己的感受)
boost是一个准标准库,相当于STL的延续和扩充,它的设计理念和STL比较接近,都是利用泛型让复用达到最大化.不过对比STL,boost更加实用.STL集中在算法部分,而boost包含了不少工具类, ...