• 为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两个组件即可,然后复制这里的代码。好象再没有什么可写的了。

  • 相关阅读:
    Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)
    Cogs 2221. [SDOI2016 Round1] 数字配对(二分图)
    Cogs 750. 栅格网络(对偶图)
    最小环问题
    浅谈卡特兰数
    洛谷 P1744 采购特价商品
    HDU 1212 Big Number
    HDU 2108 Shape of HDU
    HDU 1029 Ignatius and the Princess IV
    HDU 1021 Fibonacci Again
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/14939742.html
Copyright © 2020-2023  润新知