zoukankan      html  css  js  c++  java
  • 为app建立一个浏览器窗口

    为了显示一个网页,我做了一个窗口,同样参考前面写过的为Android做一个ShowModal窗口。先看一下代码:

    unit Form.WebBrowser;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      System.Threading, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
      FMX.Objects, FMX.Layouts, CC.NavigationBar, CC.StatusBar, CC.X5WebView, FMX.WebBrowser;
    
    type
      TWebBrowserForm = class(TForm)
        CCStatusBar1: TCCStatusBar;
        CCNavigationBar1: TCCNavigationBar;
        Rectangle1: TRectangle;
        WebBrowser1: TWebBrowser;
        CCX5WebView1: TCCX5WebView;
        procedure FormCreate(Sender: TObject);
        procedure FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
            Shift: TShiftState);
      private
        FURL: string;
        procedure SetURL(const Value: string);
      public
        property URL:string read FURL write SetURL;
      end;
    
    procedure ShowWebBrowserForm(const AURL:string; AFormResult: TProc<TModalResult>=nil);
    
    implementation
    
    {$R *.fmx}
    //调用方法:
    //   ShowWebBrowserForm('https://www.baidu.com/',
    //    procedure(AResult: TModalResult)
    //    begin
    //
    //    end);
    
    var
      WebBrowserForm: TWebBrowserForm;
    
    procedure ShowWebBrowserForm(const AURL:string; AFormResult: TProc<TModalResult>);
    begin
      if not assigned(WebBrowserForm) then
      begin
           WebBrowserForm := TWebBrowserForm.Create(Application);
      end;
    
      WebBrowserForm.URL:=AURL;
    
      WebBrowserForm.ShowModal(
        procedure(AResult: TModalResult)
        begin
          if Assigned(AFormResult) then
            AFormResult(AResult);
    
          TTask.Run(
                    procedure
                    begin
                      TThread.Synchronize(nil,
                        procedure
                        begin
                          WebBrowserForm.DisposeOf;
                          WebBrowserForm := nil;
                        end);
                    end);
        end);
    end;
    
    procedure TWebBrowserForm.FormCreate(Sender: TObject);
    begin
    {$IFDEF ANDROID}
      WebBrowser1.Free;
    {$ELSE}
      CCX5WebView1.Free;
    {$ENDIF}
    end;
    
    procedure TWebBrowserForm.FormKeyUp(Sender: TObject; var Key: Word;
        var KeyChar: Char; Shift: TShiftState);
    begin
      if Key = vkHardwareBack then
           self.ModalResult := mrCancel;
    end;
    
    procedure TWebBrowserForm.SetURL(const Value: string);
    begin
      FURL := Value;
    {$IFDEF ANDROID}
      CCX5WebView1.loadURL(Value);
    {$ELSE}
      WebBrowser1.Navigate(Value);
    {$ENDIF}
    end;
    
    end.

    通过代码,可以看到:

    1.使用了ChinaCock的X5WebView来支持android

    2.使用了原生的WebBrowser来支持Windows平台,因为ChinaCock的X5WebView现在不支持Windows平台。这里有个小坑,我在运行期建立WebBrowser实例,发现不显示网页,设计期放置到Form上,就正常,这应该是10.4.2的bug.

    3.调用方法在注释中写了,可以使用回调函数,也可以省略,只显示一个网页。

    4.最后,开发环境:在10.4.2下测试通过

    你要是使用,建一个Form,放置一个X5WebView及WebBrowser两个组件即可,然后复制这里的代码。好象再没有什么可写的了。

  • 相关阅读:
    ngRx 官方示例分析
    ngRx 官方示例分析
    oracle归档日志的操作
    【cocos2dx中Node类getParent和getChildByTag()】学习体会
    Objective-c调用Swift
    关于UITableView的黑线条
    Bootstrap风格button
    第7章 高级分组
    GDB 程序调试简单实践
    HDU 4548 美素数 素数题解
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/14939742.html
Copyright © 2011-2022 走看看