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,还是打不开网页。

于是发帖求助,一个老外给出了实现的方案,真心感谢,也不得不佩服他们。

  1. unit Unit1;
  2. interface
  3. uses
  4. System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
  5. System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
  6. FMX.StdCtrls, Macapi.CocoaTypes, Macapi.Foundation, Macapi.AppKit,
  7. Macapi.ObjectiveC, FMX.Platform.Mac;
  8. type
  9. WebFrameClass = interface(NSObjectClass)
  10. ['{7BE750C8-DFEC-4870-851A-12DBCB0B78F6}']
  11. end;
  12. WebFrame = interface(NSObject)
  13. ['{BCFA04BE-41AB-4B78-89C0-3330F12C7695}']
  14. procedure loadRequest(request: NSURLRequest); cdecl;
  15. end;
  16. TWebFrame = class(TOCGenericImport<WebFrameClass, WebFrame>)  end;
  17. WebViewClass = interface(NSViewClass)
  18. ['{0D9F44B7-09FD-4E35-B96E-8DB71B9A2537}']
  19. {class} function canShowMIMEType(MIMEType: NSString): Boolean; cdecl;
  20. end;
  21. WebView = interface(NSView)
  22. ['{C36D8016-2FCB-49F0-BA1C-C9913A37F9AC}']
  23. procedure clos; cdecl;
  24. procedure setHostWindow(hostWindow: NSWindow); cdecl;
  25. function initWithFrame(frame: NSRect; frameName: NSString; groupName: NSString): Pointer; cdecl;
  26. function mainFrame: WebFrame; cdecl;
  27. end;
  28. TWebView = class(TOCGenericImport<WebViewClass, WebView>)  end;
  29. TOCLocalAccess = class(TOCLocal);
  30. TForm1 = class(TForm)
  31. procedure FormCreate(Sender: TObject);
  32. private
  33. MyWebView: WebView;
  34. end;
  35. var
  36. Form1: TForm1;
  37. implementation
  38. {$R *.fmx}
  39. procedure TForm1.FormCreate(Sender: TObject);
  40. var
  41. PWebView: Pointer;
  42. FwkMod: HMODULE;
  43. urlStr: NSURL;
  44. urlreq: NSURLRequest;
  45. ObjTOC: TOCLocal;
  46. MyView: NSView;
  47. const
  48. WebKitFWK: string = '/System/Library/Frameworks/WebKit.framework/WebKit';
  49. begin
  50. FwkMod := System.SysUtils.LoadLibrary(PWideChar(WebKitFWK)); //必须要加
  51. MyView := WindowHandleToPlatform(Form1.Handle).View;
  52. PWebView := TWebView.Alloc.initWithFrame(MakeNSRect(10, 10, 200, 200), nil, nil);
  53. MyWebView := TWebView.Wrap(PWebView);
  54. MyView.addSubview(MyWebView);
  55. 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
  56. urlreq := TNSURLRequest.Create;  // fixing this is left as an exercise for the reader :) see previous line
  57. urlreq.initWithURL(urlstr);      //  .....
  58. MyWebView.mainFrame.loadRequest(urlreq);
  59. urlreq.release; // if you call alloc or create, you also have to call release, otherwise you will leak your object (create rule)
  60. // same for urlstr, ...
  61. end;
  62. end.
    1. var
    2. PWebView: Pointer;
    3. FwkMod: HMODULE;
    4. urlStr: NSURL;
    5. urlreq: NSURLRequest;
    6. ObjTOC: TOCLocal;
    7. MyNSWindow : NSWindow;
    8. MyView: NSView;
    9. const
    10. WebKitFWK: string = '/System/Library/Frameworks/WebKit.framework/WebKit';
    11. begin
    12. FwkMod := System.SysUtils.LoadLibrary(PWideChar(WebKitFWK));
    13. {//方法一
    14. ObjTOC := (WindowHandleToPlatform(Form1.Handle).Handle as TOCLocal);
    15. MyNSWindow := NSWindow(TOCLocalAccess(ObjTOC).Super);}
    16. //方法二
    17. MyNSWindow := WindowHandleToPlatform(Form1.Handle).Wnd;
    18. PWebView := TWebView.Alloc.initWithFrame(MakeNSRect(0, 0, 200, 200), nil, nil);
    19. MyWebView := TWebView.Wrap(PWebView);
    20. MyWebView.setHostWindow(MyNSWindow);
    21. //导致错误的地方
    22. //urlStr := TNSURL.Create;
    23. //urlstr.initWithString(NSSTR('http://www.google.com.hk/'));
    24. urlStr := TNSURL.Wrap(TNSURL.Alloc.initWithString(NSSTR('http://www.google.com.hk/')));
    25. urlreq := TNSURLRequest.Create;
    26. urlreq.initWithURL(urlstr);
    27. MyWebView.mainFrame.loadRequest(urlreq);
    28. MyNSWindow.setContentView(MyWebView);
    29. end;

http://blog.csdn.net/qustdong/article/details/17139137

Firemonkey实现Mac OS程序中内嵌浏览器的功能(自己动手翻译,调用苹果提供的webkit框架)的更多相关文章

  1. [MAC OS] XCode中的Debug View Hierarchy功能

    reference to : http://blog.csdn.net/liujinlongxa/article/details/46490949 前言 做iOS开发经常会遇见这种情况,产品汪拿着你做 ...

  2. android之在view中内嵌浏览器的方法

    我要做的一个东西是在一个页面的中间嵌入浏览器,一开始不知道从哪里开始,因为以前用的都是Textveiw或者editVeiw之类的控件,而它们并不能用来显示网页的内容,怎么办呢? 首先想到的是:是不是有 ...

  3. Unity中内嵌网页插件UniWebView使用总结

    目前有三种方式可以实现在Unity工程中实现内嵌网页的功能: 1.  UnityWebCore:只支持Windows平台,调用浏览器内核,将网页渲染到mesh,作为gameObject. 2.  Un ...

  4. 在Mac OS X中配置Apache + PHP + MySQL

    在Mac OS X中配置Apache + PHP + MySQL Mac OS X 内置Apache 和 PHP,使用起来非常方便.本文以Mac OS X 10.6.3和为例.主要内容包括: 启动Ap ...

  5. 在Mac OS X中配置Apache + PHP + MySQL 很详细

    这是一篇超级详细的配置mac os下面php+mysql+apache的文章.非常详细我的大部分配置就是参考上面的内容的,比如,PHP不能连接数据库,就是改一下默认的php.ini中pdo_mysql ...

  6. 如何在Mac OS X 中运行Lua (Running Lua on Mac OS X)

    参考文章:1) http://www.oschina.net/question/12_769552) http://rudamoura.com/luaonmacosx.html 最近在为iOS开发游戏 ...

  7. Unity中内嵌网页插件UniWebView

    一.常见Unity中内嵌网页实现方式: 1.UnityWebCore只支持windows 2.Unity-Webview支持Android,IOS 3.UniWebView支持mac os,Andro ...

  8. Mac OS X 中一些常用的命令行技巧

    一.网络设置相关 1.网卡的物理地址的动态重置 出于某些需求,例如网络中的 IP 地址或网络帐号与网卡物理地址绑定,使得多个设备无法切换上网,可尝试临时更改物理地址.不过,系统偏好设置是不能修改网卡物 ...

  9. 在Mac OS X中使用VIM开发STM32(2)

    本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重! 在我先前的博文⎣在Mac OS X中使用VIM开发STM32(1)⎤中,我们安装完成了MACVIM,这一 ...

随机推荐

  1. NOIP模拟 Ball - log积化和

    题目描述 Alice 与 Bob 在玩游戏.他们一共玩了 t 轮游戏.游戏中,他们分别获得了 n 个和 m 个小球.每个球上有一个分数.每个人的得分都为他所获得所有小球分数的乘积,分数小者获胜.问每轮 ...

  2. oracle 全部查询和表空间,以及其关系

    select * from dba_users;   查看数据库里面全部用户,前提是你是有dba权限的帐号.如sys,system select * from all_users;     查看你能管 ...

  3. 【BZOJ 1032】 [JSOI2007]祖码Zuma

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1032 [题意] [题解] /* 设f[i][j]表示从第i个珠子开始的j个珠子被消除; ...

  4. Thermal management in a gaming machine

    BACKGROUND OF THE INVENTION 1. Field of the Invention The present invention relates to wager gaming ...

  5. 【21.37%】【codeforces 579D】"Or" Game

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  6. dot net core 使用 usb

    原文:dot net core 使用 usb 本文告诉大家如何在 dot net core 使用 usb 目录 获得通知 读写 串口通信 LGPL 首先需要打开 Nuget 安装 CoreCompat ...

  7. QT之圆形头像(使用PNG的Mask达到的效果)

    废话不多说!直接上代码. 我们在很多UI设计应用中,需要用到自定义形状头像,在这里,我对圆形头像的设计做简单的阐述,其它形状头像可参考本文做相应的更改即可.如下图所示为设计的圆形头像: 上代码: Se ...

  8. phpstudy2018升级MySQL5.5为5.7.24教程(图文)

    原文: phpstudy2018升级MySQL5.5为5.7教程(图文) 一.MySQL官网下载MySQL5.7版本,我这里下载的是MySQL5.7.24. 二.直接到D:phpStudyPHPTut ...

  9. Delphi 快速获取文件大小(使用_lopen和FileSeek,此函数可以快速获取文件大小,即使文件已经被其它程序锁定)

    function GetFileSize(const fName: AnsiString): Int64; var hFile: THandle; begin hFile := _lopen(PAns ...

  10. 正定矩阵(definite matrix)

    1. 基本定义 在线性规划中,一个对称的 n×n 的实值矩阵 M,如果满足对于任意的非零列向量 z,都有 zTMz>0. 更一般地,对于 n×n 的 Hermitian 矩阵(原矩阵=共轭转置, ...