7

Delphi Chromium Embeddedでソースの表示オプションを無効にすることは可能ですか?
プロパティ/メソッドのリストに適切なものが見つかりませんでした。

4

2 に答える 2

13

Chromium ポップアップ メニュー項目を非表示にできる直接的な設定やイベントはありません。ただし、続行する方法は少なくともいくつかあります。たとえば、次のことができます。

1. ソースの表示オプションが禁止されていることをユーザーに伝え、アクションを断る

イベント ハンドラーでどのアクションを許可または拒否するかを決定できます。パラメーターOnMenuActionに True を割り当てるとResult、アクションは拒否されます。次のコードは、ソースの表示アクションを実行したことを確認し、実行した場合はアクションを拒否して情報メッセージを表示します。

type
  TCefMenuId = TCefHandlerMenuId;

procedure TForm1.Chromium1MenuAction(Sender: TObject;
  const browser: ICefBrowser; menuId: TCefMenuId; out Result: Boolean);
begin
  if menuId = MENU_ID_VIEWSOURCE then
  begin
    Result := True;
    ShowMessage('View page source is not allowed!');
  end;
end;

2.メニュー項目のキャプションをそのアクションで変更して、メニュー項目をカスタムなものに偽装する

メニュー項目のキャプションを変更し、カスタム アクションを実行することで、メニュー項目を別の用途に利用できます。次のサンプル コードは、ビュー ソース メニュー項目をアバウト ボックス メニュー項目に変更する方法を示しています。

type
  TCefMenuId = TCefHandlerMenuId;

procedure TForm1.Chromium1GetMenuLabel(Sender: TObject;
  const browser: ICefBrowser; menuId: TCefMenuId; var caption: ustring;
  out Result: Boolean);
begin
  if menuId = MENU_ID_VIEWSOURCE then
    caption := 'About my application...';
end;

procedure TForm1.Chromium1MenuAction(Sender: TObject;
  const browser: ICefBrowser; menuId: TCefMenuId; out Result: Boolean);
begin
  if menuId = MENU_ID_VIEWSOURCE then
  begin
    Result := True;
    ShowMessage('About box...!');
  end;
end;

3. 独自のカスタム ページ (フレーム) ポップアップ メニューを作成する

独自のポップアップ メニューを作成できますが、このメニューはかなりハードコードされていることを考慮する必要があるため、Delphi Chromium ラッパーの新しいバージョンごとに同じにする必要がある場合は維持する必要があります。ビューソースメニューアイテムなしでページメニューを作成するコードは次のとおりです。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, cefvcl, ceflib;

type
  PCefMenuInfo = PCefHandlerMenuInfo;

type
  TForm1 = class(TForm)
    Chromium1: TChromium;
    procedure FormCreate(Sender: TObject);
    procedure Chromium1BeforeMenu(Sender: TObject; const browser: ICefBrowser;
      const menuInfo: PCefMenuInfo; out Result: Boolean);
  private
    PageMenu: TPopupMenu;
    procedure OnNavigateBackMenuItemClick(Sender: TObject);
    procedure OnNavigateForwardMenuItemClick(Sender: TObject);
    procedure OnPrintMenuItemClick(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.OnNavigateBackMenuItemClick(Sender: TObject);
begin
  Chromium1.Browser.GoBack;
end;

procedure TForm1.OnNavigateForwardMenuItemClick(Sender: TObject);
begin
  Chromium1.Browser.GoForward;
end;

procedure TForm1.OnPrintMenuItemClick(Sender: TObject);
begin
  Chromium1.Browser.GetFocusedFrame.Print;
end;

procedure TForm1.Chromium1BeforeMenu(Sender: TObject;
  const browser: ICefBrowser; const menuInfo: PCefMenuInfo;
  out Result: Boolean);
begin
  if menuInfo.typeFlags = MENUTYPE_PAGE then
  begin
    Result := True;
    PageMenu.Items[0].Enabled := browser.CanGoBack;
    PageMenu.Items[1].Enabled := browser.CanGoForward;
    PageMenu.Popup(menuInfo^.x, menuInfo^.y);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  MenuItem: TMenuItem;
begin
  PageMenu := TPopupMenu.Create(Self);
  MenuItem := TMenuItem.Create(PageMenu);
  MenuItem.Caption := 'Back';
  MenuItem.OnClick := OnNavigateBackMenuItemClick;
  PageMenu.Items.Add(MenuItem);
  MenuItem := TMenuItem.Create(PageMenu);
  MenuItem.Caption := 'Forward';
  MenuItem.OnClick := OnNavigateForwardMenuItemClick;
  PageMenu.Items.Add(MenuItem);
  MenuItem := TMenuItem.Create(PageMenu);
  MenuItem.Caption := '-';
  PageMenu.Items.Add(MenuItem);
  MenuItem := TMenuItem.Create(PageMenu);
  MenuItem.Caption := 'Print';
  MenuItem.OnClick := OnPrintMenuItemClick;
  PageMenu.Items.Add(MenuItem);
  Chromium1.Load('www.stackoverflow.com');
end;

end.

脚注

Delphi Chromium の一部のバージョンに間違ったイベント ハンドラ定義があることに気付いたので、すべてのコード サンプルで使用されている型定義がそこにあります。

于 2012-05-31T13:13:03.570 に答える