Có thể tắt tùy chọn nguồn xem trong Delphi Chromium Embedded không?
Tôi chưa tìm thấy bất kỳ điều gì phù hợp trong danh sách thuộc tính/phương thức.Cách tắt tùy chọn nguồn xem trong Chromium được nhúng?
Trả lời
Không có cài đặt trực tiếp hoặc sự kiện nào cho phép ẩn các mục menu bật lên Chromium. Tuy nhiên bạn có ít nhất vài lựa chọn cách tiếp tục, bạn có thể ví dụ:
sử dụng 1. Cho rằng tùy chọn Xem nguồn bị cấm và từ chối hành động
Bạn có thể quyết định những gì hành động sẽ bạn cho phép hoặc từ chối trong trình xử lý sự kiện OnMenuAction
, nếu bạn gán True cho thông số Result
thì hành động sẽ bị từ chối. Kiểm tra mã sau đây mà bạn đã thực hiện những hành động xem mã nguồn và nếu như vậy, từ chối các hành động và hiển thị thông báo thông tin:
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. Fake mục trình đơn để một cái gì đó tùy chỉnh bằng cách thay đổi chú thích mục trình đơn với nó hành động
Bạn có thể tận dụng mục menu cho mục khác bằng cách thay đổi chú thích của mục menu và thực hiện một số hành động tùy chỉnh. Mẫu mã sau đây cho thấy làm thế nào để thay đổi các mục menu xem nguồn vào mục về hộp menu:
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. Tạo bạn sở hữu tùy chỉnh trang (frame) Menu popup
Bạn có thể tạo menu popup của riêng bạn, nhưng bạn cần phải xem xét rằng trình đơn này là khá hardcoded, vì vậy bạn sẽ cần phải duy trì nó nếu bạn sẽ cần phải có nó giống nhau với mỗi phiên bản mới của Delphi Chromium wrapper. Đây là mã làm thế nào để tạo menu trang mà không mục menu view source:
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.
Footnote
Các định nghĩa kiểu sử dụng trong tất cả các mẫu mã được ở đó vì tôi đã nhận thấy rằng một số phiên bản của Delphi Chromium có định nghĩa trình xử lý sự kiện sai.
Có lẽ mọi thứ đã thay đổi trong những năm, hôm nay một phương pháp trực tiếp tồn tại:
uses
ceflib;
[..]
implementation
procedure TForm1.Chromium1BeforeContextMenu(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel);
begin
//model.Clear;
model.Remove(Integer(MENU_ID_VIEW_SOURCE));
end;
Bạn có thể sử dụng model.Clear
nếu bạn muốn hoàn toàn thoát khỏi trình đơn popup.
OK. Cảm ơn nhiều ! – henry60
Rất vui được giúp ;-) – TLama
Cảm ơn bạn đã giúp đỡ rất nhiều;) – Beny