精华内容
下载资源
问答
  • Delphi FMX功能插件-源码
  • 使用delphi FMX 在android设备上获得该设备的网络状态
  • 使用delphi FMX 在android设备上获得外网IP地址的方法,
  • Delphi FMX 获取安卓WIFI本机的IP信息 手机通过UDP与终端通信,实现发送数据(按协议发送,可以达到控制硬件产品的目的)
  • Delphi FMX 实现 鼠标 移动窗口 procedure Tufrm_min.rctngl1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin FMouseDown := True; end; procedure Tufrm_min....

     

    Delphi FMX 实现  鼠标 移动窗口


    procedure Tufrm_min.rctngl1MouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Single);
    begin
      FMouseDown := True;
    end;

    procedure Tufrm_min.rctngl1MouseMove(Sender: TObject; Shift: TShiftState;
    X, Y: Single);
    begin
      if FMouseDown then
      begin
        ReleaseCapture;
        SendMessage(FmxHandleToHWND(Handle), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
      end;
    end;

    procedure Tufrm_min.rctngl1MouseUp(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Single);
    begin
      FMouseDown := False;
    end;

    展开全文
  • delphi FMX.WebBrowser与H5交互JavaScript

    千次阅读 2021-01-10 20:28:04
    delphi FMX.WebBrowser与H5交互JavaScript 一、原理 1.1、前提条件(主要是针对MSWindows下对D10.4以下的TWebBrowser的支持,不过D10.4已解决了这个前提) 你所选用的JS库或JS代码本身是很好的兼容IE10及其以上 ...

    目录

    delphi FMX.WebBrowser与H5交互JavaScript

    本文讨论在FMX下,delphi webbrowser与js交互:

    一、原理

    1.1、前提条件(主要是针对MSWindows下对D10.4以下的TWebBrowser的支持,不过D10.4已解决了这个前提)

    1.2、Delphi FMX.WebBrowser.pas

    1.2.1、直接放个TWebBrowser可视化控件来交互FMX界面

    1.2.2、动态产生客制化的TCustomWebBrowser非可视化控件来交互FMX界面

    1.2.3、以FMX服务的方式IFMXWBService来交互FMX界面

    1.3、综上所述:

    二、应用

    2.1、腾讯开源H5图形图形处理库AlloyImage

    2.2、......(2021-01-12)写累了,明儿继续......


     

    delphi FMX.WebBrowser与H5交互JavaScript

    本文讨论在FMX下,delphi webbrowser与js交互:

    一、原理

    1.1、前提条件(主要是针对MSWindows下对D10.4以下的TWebBrowser的支持,不过D10.4已解决了这个前提)

            你所选用的JS库或JS代码本身是很好的兼容IE10及其以上

            国内大厂和国外优质站点,一般在写Web代码时,都考虑了IE的兼容性问题。国内小厂,大多数的做得不好只考虑省事、少写了很多代码,引以为戒,你在发布自己的API时,一定要考虑浏览器内核的兼容性,不要学习国内这些小厂。

    1.2、Delphi FMX.WebBrowser.pas

    以下三种方式,一个目的,都是为了拿到接口ICustomBrowser :

    1.2.1、直接放个TWebBrowser可视化控件来交互FMX界面

            LWebBrowser :TWebBrowser;

    1.2.2、动态产生客制化的TCustomWebBrowser非可视化控件来交互FMX界面

            LWebBrowser :TCustomWebBrowser;

            LWebBrowser.Create(AOwner: TComponent); 

    1.2.3、以FMX服务的方式IFMXWBService来交互FMX界面

    1.2.3.1、这是FMX.WebBrowser.Android、FMX.WebBrowser.Cocoa及FMX.WebBrowser.Win分别为Android、IOS、MSWINDOWS下完美拿到TWebBrowser接口ICustomBrowser最好的方法

    1.2.3.2、然后ICustomBrowser执行JS

            ICustomBrowser. EvaluateJavaScript(const JavaScript: string);   //:执行JS,但不回调执行的结果

    1.2.3.4、ICustomBrowser执行JS并回调:

    1.2.3.4.1、Android

    在Android 4.4之后,WebView提供了一个新的2个执行JS的接口:

    $(BDS)\source\rtl\android\
    
    unit Androidapi.JNI.Webkit;
    
      [JavaSignature('android/webkit/WebView')]
      JWebView = interface(JAbsoluteLayout)
        ['{0001776D-86A0-43B3-A64C-C6FEA095AD91}']
        procedure addJavascriptInterface(object_: JObject; name: JString); cdecl;
        procedure evaluateJavascript(script: JString; resultCallback: JValueCallback); cdecl;
    //...................以下为delphi FMX通过TAndroidWebBrowserService调用ICustomBrowser.EvaluateJavaScript(const JavaScript: string)的Android实现的内部方法:
        //procedure loadUrl(url: JString; additionalHttpHeaders: JMap); cdecl; overload;
        procedure loadUrl(url: JString); cdecl; overload;
    //...................
    
    

    《=========拿到JValueCallback :

    $(BDS)\source\rtl\android\
    
    unit Androidapi.JNI.Webkit;
    
      JValueCallbackClass = interface(IJavaClass)
        ['{5CE4D0B0-6C4F-43BD-B57F-A06401A5FB2F}']
      end;
    
      [JavaSignature('android/webkit/ValueCallback')]
      JValueCallback = interface(IJavaInstance)
        ['{3B24779A-3678-4AD8-B421-A8A9C6F3E742}']
        procedure onReceiveValue(value: JObject); cdecl;
      end;
      TJValueCallback = class(TJavaGenericImport<JValueCallbackClass, JValueCallback>) end;
    
    

    《=========拿到JWebView :

    $(BDS)\source\rtl\android\
    
    unit Androidapi.JNI.Webkit;
    
      JWebViewClass = interface(JAbsoluteLayoutClass)
        ['{57C30F7F-F8C7-4C19-859E-073DC4DA4250}']
        {class} function _GetRENDERER_PRIORITY_BOUND: Integer; cdecl;
        {class} function _GetRENDERER_PRIORITY_IMPORTANT: Integer; cdecl;
        {class} function _GetRENDERER_PRIORITY_WAIVED: Integer; cdecl;
        {class} function _GetSCHEME_GEO: JString; cdecl;
        {class} function _GetSCHEME_MAILTO: JString; cdecl;
        {class} function _GetSCHEME_TEL: JString; cdecl;
        {class} function init(context: JContext): JWebView; cdecl; overload;
    //.............
    

     

    $(BDS)\source\rtl\android\
    
    unit Androidapi.JNI.Embarcadero;
    
      JWebBrowserClass = interface(JWebViewClass)
        ['{C9D39057-C2B7-4264-8E58-52DE4CA5AE56}']
        {class} function init(context: JContext): JWebBrowser; cdecl;
      end;
    
      [JavaSignature('com/embarcadero/firemonkey/webbrowser/WebBrowser')]
      JWebBrowser = interface(JWebView)
        ['{21876269-EEA5-4130-BE15-F23BEB8ECA69}']
        procedure SetWebViewListener(listener: JOnWebViewListener); cdecl;
      end;
      TJWebBrowser = class(TJavaGenericImport<JWebBrowserClass, JWebBrowser>) end;
    
      JWebClientClass = interface(JWebViewClientClass)
        ['{424BCB34-24B0-4A4B-830B-D396C3667344}']
        {class} function init: JWebClient; cdecl;
      end;
    
    

    最新的D10.4对应的Android SDK,Delphi为我们实现的API接口的基础知识:

    delphi的类及其接口 和JAVA的类及其接口

    delphi导入java类的方法:

    方法一、原生方法导入:

    //这是1个用于较易声明Java的泛型对象工厂的通用类。在这个模型中,我们划分为两个接口:类方法接口(第1个参数)和实例方法接口(第2个参数)。这个类将此2个接口融合到该工厂类中,可以产生Java的实例对象,或提供代表单线程实例的Java类的参照:

    $(BDS)\source\rtl\android\
    
    unit Androidapi.JNIBridge;
    
      ///  A generic class that we use to make the declaration of Java
      ///  object factories easier. In our model, we split the class methods
      ///  and instance methods into two interfaces.  This class blends the
      ///  two interfaces into one factory that can produce instances of Java
      ///  objects, or provide a reference to a singleton instance representing
      ///  the Java class.
    //这是1个用于较易声明Java的泛型对象工厂的通用类。在它的模型中,我们将参数划分为两个接口:类方法接口(第1个参数)和实例方法接口(第2个参数)。这个类将此2个接口融合到该工厂类中,可以产生Java的实例对象,或提供代表单线程实例的Java类的参照:
    
      TJavaGenericImport<C: IJavaClass; T: IJavaInstance> = class
    
    

    方法二、用EMB的代理接口导入DefaultProxyInterfaceName = 'com/embarcadero/rtl/ProxyInterface';  :

    $(BDS)\source\rtl\android\
    
    unit Androidapi.JNIBridge;
    
      TJInterfacedObject = class(TInterfacedObject)
        procedure AfterConstruction; override;
        procedure BeforeDestruction; override;
      end;
    
      TJavaLocal = class abstract (TJInterfacedObject, ILocalObject, IJava)
      const
        DefaultProxyInterfaceName = 'com/embarcadero/rtl/ProxyInterface';
    
    

    ----------->通过以上原理和方法,Delphi第三方生态ScriptGate(是一个实现Delphi和JavaScript相互调用的库,10.4以下使用,D10.4.1请不要再使用有问题)已经为我们做好了封装,可直接拿来用(https://bitbucket.org/freeonterminate/scriptgate/src/master/)。

        //............................现在使用 ScriptGate 可轻易解决这个问题,ScriptGate  支持 Windows, macOS, Android, iOS,非常好用,强烈推荐

        //............................(详述:略),自己下载后看。SGWebClient.jar:Android下高勇老师直接引用了这个封装。调用方法示例:http://bbs.2ccc.com/topic.asp?topicid=544553

    ----------->通过以上原理和方法,(修改:爱吃猪头肉 & Flying Wang 2015-07-21)已经为我们修改好了补丁单元Delphi10.4Update0_FixedDelphiPas\FMX.WebBrowser.pas,

    (1)、新增 跨平台属性 GetRealWebBrowserObject 获取各个平台下 原生的 浏览器对象:

        // 下面是 GetRealWebBrowserObject 在安卓下的 例子
        // (WebBrowser1.GetRealWebBrowserObject as JWebBrowser).getSettings.setUserAgentString(StringToJString('你的UserAgent'));

        :注意:《WebView在使用setUserAgentString时的坑https://blog.csdn.net/mahongy/article/details/103856643

        :您若尝试确认正确后,请这样使用:

    uses Androidapi.JNI.Webkit;

    var LJWebSettings :JWebSettings ;    L_UA :JString;

    begin

        LJWebSettings := (WebBrowser1.GetRealWebBrowserObject as JWebBrowser).getSettings ;

        L_UA:= LJWebSettings.getUserAgentString;

        LJWebSettings.setUserAgentString (L_UA) ;

        //       //LJWebSettings.setUserAgentString( StringToJString( L_UA+' ; 你追加的UserAgent的自定义部分的字符串' ) );

    end;

    user-agent,可以用getUserAgentString()方法获取,在手机上打印出来的结果是:

    Mozilla/5.0 (Linux; Android 8.1.0; NX606J Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36

     

    (2)、新增 重定向 Redirection 功能:

        // 重定向 Redirection 功能 完全来自 [重庆]新手(371889755)
        // IOS MAC 安卓的 重定向 全靠 [龟山]阿卍(1467948783) 帮忙测试:

        // 请设置好 RedirectionKey,千万不要用 URL 上的一些关键字,也不要用特殊字符:

        // 用 wwwwww 做关键字,比较好。
        // 测试用 wwwwww.xxx.com
        // 你发送的 url 中,千万也不要有 http: ftp: file: 等在 mac osx 系统上,带有这些,会导致打开网页。

        可直接拿来用:

    (* ****************************************************** *)
    (*                            *)
    (*    修改:爱吃猪头肉 & Flying Wang 2015-07-21    *)
    (*        上面的版权声明请不要移除。       *)
    (*                            *)
    (*            禁止发布到城通网盘。         *)
    (*                            *)
    (* 仅支持 RAD10.4.0(10.4 Release 0),其他版本请自行修改 *)
    (*                            *)
    (* ****************************************************** *)
    { IFMXWebBrowserService }
    
      ICustomBrowser = interface(IInterface)
      ['{A5BB2E8C-6D53-4FF3-BC38-2299285F07BD}']
    //    ...........................
    //    procedure EvaluateJavaScript(const JavaScript: string);
        //Fix By Flying Wang and 爱吃猪头肉:
        procedure EvaluateJavaScript(const JavaScript: string;
          DidEvaluateJavaScript: TWebBrowserDidEvaluateJavaScript = nil);
        //Fix or Add By 爱吃猪头肉:
        function GetRealWebBrowserObject: IUnknown;
        //Fix 重定向关键字,如果包含这个关键字 页面不刷新:
        //解析 重定向字符串:
        function GetRedirectionKey: string;
        procedure SetRedirectionKey(const Value:string);
        property RedirectionKey: string read GetRedirectionKey write  SetRedirectionKey;
    //    ...........................
        procedure LoadFromStrings(const Content: string; const BaseUrl: string);
    //    ...........................
    

     

    1.2.3.4.2、、IOS

    ----------->通过以上原理和方法,(修改:爱吃猪头肉 & Flying Wang 2015-07-21)已经为我们修改好了补丁单元:Delphi10.4Update0_FixedDelphiPas\FMX.WebBrowser.pas,

    FMX.WebBrowser.Cocoa.pas

    ===========》TCommonWebBrowserService===========》继承后将protected的可见性发布出来使用,即可:

    (* ****************************************************** *)
    (*                            *)
    (*    修改:爱吃猪头肉 & Flying Wang 2015-07-21    *)
    (*        上面的版权声明请不要移除。       *)
    (*                            *)
    (*            禁止发布到城通网盘。         *)
    (*                            *)
    (* 仅支持 RAD10.4.0(10.4 Release 0),其他版本请自行修改 *)
    (*                            *)
    (* ****************************************************** *)
    { TCommonWebBrowserService }
    
      TCommonWebBrowserService = class(TInterfacedObject, ICustomBrowser)
      //Fix 重定向关键字
      private
        FRedirectionKey: string;
      private
    //...................................
      protected
    //...................................
        procedure LoadFromStrings(const Content: string; const BaseUrl: string);
    //    procedure EvaluateJavaScript(const JavaScript: string);
        //Fix By Flying Wang and 爱吃猪头肉
        procedure EvaluateJavaScript(const JavaScript: string;
          DidEvaluateJavaScript: TWebBrowserDidEvaluateJavaScript = nil);
        //Fix or Add By 爱吃猪头肉
        function GetRealWebBrowserObject: IUnknown;
        //Fix 重定向关键字,如果包含这个关键字 页面不刷新
        //解析 重定向字符串
        function GetRedirectionKey: string;
        procedure SetRedirectionKey(const Value:string);
    //...................................
    
    
    
    
    

     

    1.2.3.4.3、Linux

     

    ----------->通过以上原理和方法,(修改:爱吃猪头肉 & Flying Wang 2015-07-21)已经为我们修改好了补丁单元Delphi10.4Update0_FixedDelphiPas\FMX.WebBrowser.pas,

    (1)、新增 跨平台属性 GetRealWebBrowserObject 获取各个平台下 原生的 浏览器对象:

        // 下面是 GetRealWebBrowserObject 在安卓下的 例子
        // (WebBrowser1.GetRealWebBrowserObject as JWebBrowser).getSettings.setUserAgentString(StringToJString('你的UserAgent'));

    (2)、新增 重定向 Redirection 功能:

        // 重定向 Redirection 功能 完全来自 [重庆]新手(371889755)
        // IOS MAC 安卓的 重定向 全靠 [龟山]阿卍(1467948783) 帮忙测试:

        // 请设置好 RedirectionKey,千万不要用 URL 上的一些关键字,也不要用特殊字符:

        // 用 wwwwww 做关键字,比较好。
        // 测试用 wwwwww.xxx.com
        // 你发送的 url 中,千万也不要有 http: ftp: file: 等在 mac osx 系统上,带有这些,会导致打开网页。

        可直接拿来用:

    { TLinuxWebBrowserService }
    
      TLinuxWebBrowserService = class(TInterfacedObject, ICustomBrowser)
      //Fix 重定向关键字
      private
        FRedirectionKey: string;
    //...............................
    
    //    procedure EvaluateJavaScript(const JavaScript: string);
        //Fix By Flying Wang and 爱吃猪头肉
        procedure EvaluateJavaScript(const JavaScript: string;
          DidEvaluateJavaScript: TWebBrowserDidEvaluateJavaScript = nil);
        //Fix or Add By 爱吃猪头肉
        function GetRealWebBrowserObject: IUnknown;
        //Fix 重定向关键字,如果包含这个关键字 页面不刷新
        //解析 重定向字符串
        function GetRedirectionKey: string;
        procedure SetRedirectionKey(const Value:string);
        procedure LoadFromStrings(const Content: string; const BaseUrl: string);
        //procedure EvaluateJavaScript(const JavaScript: string);
    //...............................
    
    

    1.2.3.4.4、MSWindows

    ----------->通过以上原理和方法,(修改:爱吃猪头肉 & Flying Wang 2015-07-21)已经为我们修改好了补丁单元:Delphi10.4Update0_FixedDelphiPas\FMX.WebBrowser.pas,

    FMX.WebBrowser.Win.pas===========》TWindowsWebBrowserService ===========》直接使用public方法,即可:

    (* ****************************************************** *)
    (*                            *)
    (*    修改:爱吃猪头肉 & Flying Wang 2015-07-21    *)
    (*        上面的版权声明请不要移除。       *)
    (*                            *)
    (*            禁止发布到城通网盘。         *)
    (*                            *)
    (* 仅支持 RAD10.4.0(10.4 Release 0),其他版本请自行修改 *)
    (*                            *)
    (* ****************************************************** *)
    
    
      TWindowsWebBrowserService = class;
    
      TWinWBMediator = class(TInterfacedObject, ICustomBrowser)
      private
        FBrowser: TWindowsWebBrowserService;
      public
        constructor Create;
        destructor Destroy; override;
        function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
        property WB: TWindowsWebBrowserService read FBrowser implements ICustomBrowser;
      end;
    
      TWindowsWebBrowserService = class(TOLEFrameworkDelegate, ICustomBrowser)
      //Fix 重定向 关键字
      private
        FRedirectionKey: string;
      private
    //....................................
      public
    //....................................
    //    procedure EvaluateJavaScript(const JavaScript: string);
        //Fix By Flying Wang and 爱吃猪头肉
        procedure EvaluateJavaScript(const JavaScript: string;
          DidEvaluateJavaScript: TWebBrowserDidEvaluateJavaScript = nil);
        //Fix or Add By 爱吃猪头肉
        function GetRealWebBrowserObject: IUnknown;
        //Fix 重定向关键字,如果包含这个关键字 页面不刷新
        //解析 重定向字符串
        function GetRedirectionKey: string;
        procedure SetRedirectionKey(const Value:string);
    
    //....................................
    
    
    
    

     

    1.2.3.4、事件中处理页面内容的回调

    在这些事件中处理页面内容的回调:

        property OnDidStartLoad: TWebBrowserDidStartLoad read GetOnDidStartLoad write SetOnDidStartLoad;
        property OnDidFinishLoad: TWebBrowserDidFinishLoad read GetOnDidFinishLoad write SetOnDidFinishLoad;
        property OnShouldStartLoadWithRequest: TWebBrowserShouldStartLoadWithRequest read GetOnShouldStartLoadWithRequest
          write SetOnShouldStartLoadWithRequest;
        property OnDidFailLoadWithError: TWebBrowserDidFailLoadWithError read GetOnDidFailLoadWithError
          write SetOnDidFailLoadWithError;

    页面回调BaseUrl,拿到回调结果字符串Content

    接口ICustomBrowser :

          procedure LoadFromStrings(const Content: string; const BaseUrl: string);

    扩展的接口:

          ICustomBrowserEx = interface(IInterface)
          ['{5F61E8E6-54B5-4305-88DD-C7F8086352FF}']
               procedure LoadFromStrings(const Content: string; const ContentEncoding: TEncoding; const BaseUrl: string);
          end;

    1.2.3.5、D10.4对TEdgeBrowser的支持及其新增TWebBrowser通过SelectedEngine 来选择使用老的 IE 核心还是新的 Edge 核心,完美支持在MSWINDOWS下H5的各种性能

    详见本博客博文:

    《RAD Studio 10.4.1的TEdgeBrowser与javascript交互-基于Chromium的Edge浏览器控件用法之二》https://blog.csdn.net/pulledup/article/details/109934357

    《RAD Studio 10.4.1新的基于Chromium的Microsoft Edge浏览器的TEdgeBrowser控件用法》https://blog.csdn.net/pulledup/article/details/109848546

    1.3、综上所述:

    ----------->通过以上原理和方法,(修改:爱吃猪头肉 & Flying Wang 2015-07-21)已经为我们修改好了补丁单元Delphi10.4Update0_FixedDelphiPas\FMX.WebBrowser.pas,

    (1)、新增 跨平台属性 GetRealWebBrowserObject 获取各个平台下 原生的 浏览器对象:

        // 下面是 GetRealWebBrowserObject 在安卓下的 例子
        // (WebBrowser1.GetRealWebBrowserObject as JWebBrowser).getSettings.setUserAgentString(StringToJString('你的UserAgent'));

        :注意:《WebView在使用setUserAgentString时的坑https://blog.csdn.net/mahongy/article/details/103856643

        :您若尝试确认正确后,请这样使用:

    uses Androidapi.JNI.Webkit;

    var LJWebSettings :JWebSettings ;    L_UA :JString;

    begin

        LJWebSettings := (WebBrowser1.GetRealWebBrowserObject as JWebBrowser).getSettings ;

        L_UA:= LJWebSettings.getUserAgentString;

        LJWebSettings.setUserAgentString (L_UA) ;

        //       //LJWebSettings.setUserAgentString( StringToJString( L_UA+' ; 你追加的UserAgent的自定义部分的字符串' ) );

    end;

    user-agent,可以用getUserAgentString()方法获取,在手机上打印出来的结果是:

    Mozilla/5.0 (Linux; Android 8.1.0; NX606J Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36

    通过上面的getUserAgentString方法可以捕获你的运行平台下的当前默认设置的浏览器的内核的用户代理User-Agent

    为何需要判断和设置用户代理User-Agent:1、因为它是可以被伪装了;2、它决定了:同一个网页页面在不同浏览器内核下的排版显示效果===》用户体验、统计信息,简称UA,比如:统一页面,用手机访问网页和电脑访问是不一样的。

    补充常识:“html的head如何设置和调测不同浏览器内核的用户代理User-Agent” :https://jingyan.baidu.com/article/f0e83a25cb189363e491010b.html

    “不同浏览器内核下的html的head设置用户代理User-Agent的兼容性” :https://www.cnblogs.com/pinpin/p/10773327.html

    “不同浏览器内核下的html的head设置用户代理User-Agent的兼容性(截止2019年7月)” :https://blog.csdn.net/qq_34502571/article/details/95725337

    如何在网页代码中提示用户浏览器的H5兼容性:

    <html>
    <head>
    <script type="text/javascript">
    function detectBrowser()
    {
    var browser=navigator.appName
    var b_version=navigator.appVersion
    var version=parseFloat(b_version)
    if ((browser=="Netscape"||browser=="Microsoft Internet Explorer") && (version>=4))
      {alert("您的浏览器的H5兼容性已经很棒了!")}
    else
      {alert("您的浏览器的H5兼容性较低,会影响用户体验和统计信息的表达,请升级!")}
    }
    </script>
    </head>
    
    <body onload="detectBrowser()">
    </body>
    
    </html>
    

    H5兼容问题及解决方法: https://www.cnblogs.com/dreambin/p/9035446.html  :原文:https://blog.csdn.net/qq_42936527/article/details/89393130

    微信H5页面前端开发,大多数人都会遇到的几个兼容性坑: https://segmentfault.com/a/1190000019986963

     

    (2)、新增 重定向 Redirection 功能:

        // 重定向 Redirection 功能 完全来自 [重庆]新手(371889755)
        // IOS MAC 安卓的 重定向 全靠 [龟山]阿卍(1467948783) 帮忙测试:

        // 请设置好 RedirectionKey,千万不要用 URL 上的一些关键字,也不要用特殊字符:

        // 用 wwwwww 做关键字,比较好。
        // 测试用 wwwwww.xxx.com
        // 你发送的 url 中,千万也不要有 http: ftp: file: 等在 mac osx 系统上,带有这些,会导致打开网页。

        可直接拿来用,用于FMX.WebBrowser与H5交互JavaScript。

     

    二、应用

    2.1、腾讯开源H5图形图形处理库AlloyImage

    前端-纯前端实现人脸识别-提取-合成:https://cloud.tencent.com/developer/article/1408454
    腾讯开源H5图形图形处理库:https://github.com/AlloyTeam/AlloyImage
    Delphi FMX.WebBrowser.pas就能很好的跨平台交互js:方法见“一、原理”
    procedure EvaluateJavaScript(const JavaScript: string); 
        //Fix By Flying Wang and 爱吃猪头肉
        procedure EvaluateJavaScript(const JavaScript: string;
          DidEvaluateJavaScript: TWebBrowserDidEvaluateJavaScript = nil);
        //Fix or Add By 爱吃猪头肉
        function GetRealWebBrowserObject: IUnknown;
        //Fix 重定向关键字,如果包含这个关键字 页面不刷新
        //解析 重定向字符串
        function GetRedirectionKey: string;
        procedure SetRedirectionKey(const Value:string);

     

    《图片处理不用愁,给你十个小帮手》https://cloud.tencent.com/developer/article/1649704 

    其中,有很多案例在线测试。

     

    2.2、......(2021-01-12)写累了,明儿继续......

     

     

     

    展开全文
  • delphi FMX常用事件类型及其别名 一、System.Classes { Standard events } type TNotifyEvent = procedure(Sender: TObject) of object; TGetStrProc = procedure(const S: string) of object; 二、...

    delphi FMX常用事件类型及其别名

     

    一、System.Classes {标准事件 Standard events }
    type
      TNotifyEvent = procedure(Sender: TObject) of object;
      TGetStrProc = procedure(const S: string) of object;

     

    二、TControl class(TFmxObject, IControl, IContainerObject, IAlignRoot, IRotatedControl, IAlignableObject,
        IEffectContainer, IGestureControl, ITabStopController, ITriggerAnimation, ITriggerEffect)

      public

        property CustomSceneAddRect: TCustomSceneAddRectEvent read FCustomSceneAddRect write FCustomSceneAddRect;
        property OnDragEnter: TDragEnterEvent read FOnDragEnter write FOnDragEnter;
        property OnDragLeave: TNotifyEvent read FOnDragLeave write FOnDragLeave;
        property OnDragOver: TDragOverEvent read FOnDragOver write FOnDragOver;
        property OnDragDrop: TDragDropEvent read FOnDragDrop write FOnDragDrop;
        property OnDragEnd: TNotifyEvent read FOnDragEnd write FOnDragEnd;
        property OnKeyDown: TKeyEvent read FOnKeyDown write FOnKeyDown;
        property OnKeyUp: TKeyEvent read FOnKeyUp write FOnKeyUp;
        property OnClick: TNotifyEvent read FOnClick write SetOnClick stored OnClickStored;
        property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick;
        property OnCanFocus: TCanFocusEvent read FOnCanFocus write FOnCanFocus;
        property OnEnter: TNotifyEvent read FOnEnter write FOnEnter;
        property OnExit: TNotifyEvent read FOnExit write FOnExit;
        property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
        property OnMouseMove: TMouseMoveEvent read FOnMouseMove write FOnMouseMove;
        property OnMouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp;
        property OnMouseWheel: TMouseWheelEvent read FOnMouseWheel write FOnMouseWheel;
        property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
        property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
        property OnPainting: TOnPaintEvent read FOnPainting write FOnPainting;
        property OnPaint: TOnPaintEvent read FOnPaint write FOnPaint;
        property OnResize: TNotifyEvent read FOnResize write FOnResize;
        property OnResized: TNotifyEvent read FOnResized write FOnResized;
        property OnActivate: TNotifyEvent read FOnActivate write FOnActivate;
        property OnDeactivate: TNotifyEvent read FOnDeactivate write FOnDeactivate;
        property OnApplyStyleLookup: TNotifyEvent read FOnApplyStyleLookup write FOnApplyStyleLookup;

      published
        property Touch: TTouchManager read GetTouchManager write SetTouchManager;
        property OnGesture: TGestureEvent read FOnGesture write FOnGesture;
        property OnTap: TTapEvent read FOnTap write FOnTap;
      end;

    三、FMX.Types

    3.1、别名事件

      TMouseEvent = procedure(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single) of object;
      TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Single) of object;
      TMouseWheelEvent = procedure(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean) of object;
      TKeyEvent = procedure(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState) of object;
      TProcessTickEvent = procedure(Sender: TObject; time, deltaTime: Single) of object;
      TVirtualKeyboardEvent = procedure(Sender: TObject; KeyboardVisible: Boolean; const Bounds : TRect) of object;
      TTapEvent = procedure(Sender: TObject; const Point: TPointF) of object;
      TTouchEvent = procedure(Sender: TObject; const Touches: TTouches; const Action: TTouchAction) of object;


    3.2、事件接口类,比如:

      IFreeNotification = interface
        ['{FEB50EAF-A3B9-4b37-8EDB-1EF9EE2F22D4}']
        procedure FreeNotification(AObject: TObject);
      end;

      IFreeNotificationBehavior = interface
        ['{83F052C5-8696-4AFA-88F5-DCDFEF005480}']
        procedure AddFreeNotify(const AObject: IFreeNotification);
        procedure RemoveFreeNotify(const AObject: IFreeNotification);
      end;

    四、System.Types

    4.1、异步多线程事件

      /// <summary>
      ///    Interface returned from various "BeginXXX" methods in order to provide asynchronous execution of code.
      /// </summary>
      IAsyncResult = interface
        ///  <summary>
        ///    Returns an event suitable for use to block until the asynchronous call is complete. This event is also suitable for
        ///    use in a list to allow waiting for all or any to be signaled. See the TMultiWaitEvent.WaitForXXX class
        ///    functions.
        ///  </summary>
        function GetAsyncWaitEvent: TMultiWaitEvent;
        ///  <summary>
        ///    Event suitable for use to block until the asynchronous call is complete. This event is also suitable for
        ///    use in a list to allow waiting for all or any to be signaled. See the TMultiWaitEvent.WaitForXXX class
        ///    functions.
        ///  </summary>
        property AsyncWaitEvent: TMultiWaitEvent read GetAsyncWaitEvent;

      TMultiWaitEvent = class abstract
      public
        ///  <summary>
        ///    Rather than use a constructor which will create an instance of <strong>this</strong> class, this will
        ///    return an instance of the registered descendent type that provides the actual implementation.
        ///  </summary>
        class function Create: TMultiWaitEvent; static;
        /// <summary>Wait until at least one of the indicated TMultiWaitEvents are signaled or Timeout is reached.
        ///    Returns the TMultiWaitEvent instance which was signaled and caused the function to return. Event is
        ///    undefined if Timeout is reached.
        /// </summary>
        class function WaitForAny(const Events: array of TMultiWaitEvent; out Event: TMultiWaitEvent; Timeout: Cardinal = INFINITE): TWaitResult; overload; static;

    5、System.Classes

    5.1、异步事件


      TAsyncProcedureEvent = procedure (const ASyncResult: IAsyncResult) of object;
      TAsyncFunctionEvent = procedure (const ASyncResult: IAsyncResult; out Result: TObject) of object;
      TAsyncConstArrayProcedureEvent = procedure (const ASyncResult: IAsyncResult; const Params: array of const) of object;
      TAsyncConstArrayFunctionEvent = procedure (const ASyncResult: IAsyncResult; out Result: TObject; const Params: array of const) of object;

     

     

    展开全文
  • delphi fmx 实用DEMO

    热门讨论 2016-06-08 09:04:09
    FMX实用DEMO 01 后续如果有更新则升级版本号。
  • delphi fmx StringGrid

    2021-06-08 01:13:02
    Firemonkey 之 StringGrid Header 自定义颜色 https://www.cnblogs.com/onechen/p/5327732.html FMX StringGrid根据内容自适应列宽 https://www.cnblogs.com/dqi1999/p/13913366.html Delphi实现StringGrid的行列...

    Firemonkey 之 StringGrid Header 自定义颜色

    https://www.cnblogs.com/onechen/p/5327732.html

    FMX StringGrid根据内容自适应列宽

    https://www.cnblogs.com/dqi1999/p/13913366.html

    Delphi实现StringGrid的行列选择

    https://www.cnblogs.com/dawugui5460/articles/2914153.html

    在StringGrid中每行添加一个选择框(checkbox)

    https://blog.csdn.net/rznice/article/details/14167215

    delphi 如何编写使StringGrid中的一列具有Check功能,和CheckBox效果一样

    http://www.delphitop.com/html/kongjian/2294.html

     

    Delphi StringGrid控件如何单击选一行,双击编辑单元格,完后继续单击选择一行??

    https://www.cnblogs.com/devcjq/articles/2991855.html

    delphi StringGrid行列的增加和删除

    http://www.delphitop.com/html/kongjian/5633.html

     

    展开全文
  • Delphi FMX开发遇到的几个问题及解决方案FMX AndroidAndroid P 将禁止 App 使用所有未加密的连接Android APK自动更新并安装NethttpClient使用Https访问未知来源证书Android 使用Posix标准API函数实现串口通信FMX几种...
  • Delphi FMX正确加载图片最大限度减少内存占用(之二TImageList) 继上篇《Delphi FMX正确加载图片最大限度减少内存占用(之一TBitmapSurface)》之后,我们继续优化内存,本片谈谈FMX TImageList加载标清大图。 ...
  • Delphi FMX正确加载图片最大限度减少内存占用 国庆前,无意间发现App内存占用陡增,发现是几张4K图片加载引发的(TImage.Bitmap.LoadFromStream或TImage.Bitmap.LoadFromFile,加载大图片时(>=6M),D10.4下...
  • Delphi FMX下WndProc Hook

    2020-01-10 11:48:45
    因为FMX是一套跨平台的组件,所以把消息过程移除掉了,不能愉快的像VCL那样拦截消息。 现在提供一个简单拦截消息过程的方法: 开源地址: https://github.com/ying32/FMXWndProcHook 引用单元 FMX.WndProcHook ...
  • Delphi FMX怎样控制Listview和祖先为TCustomPresentedScrollBox的控件在MsWindows和Linux下滚动条的宽窄等 procedure TfrmGoodsDefine.FormCreate(Sender: TObject); var LScrollBar_ListView1: TControl; //...
  • System.TypInfo、System.Types和FMX.Types和Androidapi.JNI.JavaTypes对应关系
  • Delphi FMX 手机目录提取,把IO相关的都提取到System.IoUtils单元中标签:android com 使用 代码 si la sp 方法 ha Delphi把IO相关的都提取到System.IoUtils单元中。路径操作使用TPath的方法都很方便。uses...
  • Delphi FMX正确设计和加载图片满足跨平台需求,综合考虑:客户端(内存、设备屏幕适配)、服务端(上传效率、并发时效及网路瓶颈、内存)、美工工作量 刚刚请教了高勇老师,结合高老师的GYListview的优秀设计和...
  • Delphi XE8编写的安卓示例程序,模拟扑克牌计算24的小游戏程序。 程序提供了一种思路,可供借鉴。
  • Align :在父控件中的排列 Top : 顶充满父控件的宽 高度不变 Bottom : 底充满父控件的宽 高度不变 Left : 左充满父控件的高宽度不变 Right : 右充满父控件的高宽度不变 带Most的不考虑其它控件所占的...
  • fmx下,opendialog设置多选后,取文件名时会将最后一个“\”忽略,比如文件D:\123\1.TXT,会返回D:\1231.TXT。单选无此问题,求解决方法。
  • delphi FMX gridlayout与gridpannellayout

    千次阅读 2017-11-02 14:08:05
    Gridlayout:  如果将ItemWidth设置为-1,则单元格的宽度自动按TGridLayout的宽度进行等分计算.  使用TGridLayout布局控件,其子控件的Position,Align,Anchors属性都自动设置,忽略你对这些属性值的修改。...
  • Delphi FMX窗体中控件对齐方式介绍

    千次阅读 2020-02-23 13:29:20
    FMX.Types.TAlignLayout TAlignLayout是一个枚举类型。用于指定控件在其父级中(一定记住,对应参照物是他的父级)的对齐方式。 TAlignLayout指定如何相对于其父控件中的放置位置。控件的自动对齐会影响其位置、大小...
  • http://docwiki.embarcadero.com/Libraries/Berlin/en/FMX.ListBox.TComboBox_Properties http://docwiki.embarcadero.com/Libraries/Berlin/en/FMX.ListBox.TCustomComboBox.Placement DropDownKind属性 ...
  • //delphi客户端源码 uses IdMultipartFormData; procedure TForm1.Button1Click(Sender: TObject); //上传 var ABitmapCodecSaveParams:TBitmapCodecSaveParams; ASuperObject:ISuperObject; MS: TStringStream;...
  • 学习delphi FMX 的一些资料

    千次阅读 2017-10-26 16:15:06
    1. C:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples自带的例子 2. http://docwiki.embarcadero.com/ 官方的在线帮助文档 3. 软件上方的help 官方的离线帮助文档 4. 一些博客 http://www.cn
  • FMX的手势管理中,只有长按LONGTAP,点击TAP则是单独的事件,不能在同事件中管理。在执行LONGTAP后,TAP也会被触发​,解决方案,判断长按和点击是否同位置:添加变量TapLoaction:TPointf​​;procedure Tform1....
  • //直方图匹配 pipei procedure pipei(b : TBitmap; var g : array of Integer); var x, y , I ,J: Integer; A_BMPData : TBitmapData ; p: PByteArray;... n : array [0..255] of Integer;... //初始化数组 c

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 530
精华内容 212
关键字:

delphifmx