كيفية إرفاق قائمة السياق بمتصفح TChromium
-
29-10-2019 - |
سؤال
لدي متصفح TChromium من Delphi Chromium Embedded (http://code.google.com/p/delphichromiumembedded).أرغب في إرفاق قائمة السياق بها.كيف يمكنني تحقيق ذلك؟
المحلول
تحتاج إلى التعامل مع OnBeforeMenu
حدث.في هذا الحدث، يكون المعالج كافيًا لتعيين معلمة الإخراج Result
ل True
ما الذي سيمنع ظهور قوائم السياق الافتراضية المنبثقة.بعد ذلك يمكنك عرض القائمة الخاصة بك على المواضع التي تم الحصول عليها من menuInfo
بناء.
إليك نموذج التعليمات البرمجية مع قائمة منبثقة مخصصة:
uses
ceflib, cefvcl;
procedure TForm1.FormCreate(Sender: TObject);
begin
Chromium1.Load('www.example.com');
end;
procedure TForm1.Chromium1BeforeMenu(Sender: TObject;
const browser: ICefBrowser; const menuInfo: PCefHandlerMenuInfo;
out Result: Boolean);
begin
Result := True;
PopupMenu1.Popup(menuInfo.x, menuInfo.y);
end;
procedure TForm1.PopupMenuItemClick(Sender: TObject);
begin
ShowMessage('You''ve clicked on a custom popup item :)');
end;
تحديث:
بالنسبة للمثيل الذي تم إنشاؤه ديناميكيًا، يجب عليك تعيين معالج الحدث يدويًا.جرب الكود التالي.
uses
ceflib, cefvcl;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
PopupMenu1: TPopupMenu;
procedure Button1Click(Sender: TObject);
private
procedure ChromiumOnBeforeMenu(Sender: TObject;
const browser: ICefBrowser; const menuInfo: PCefHandlerMenuInfo;
out Result: Boolean);
public
{ Public declarations }
end;
implementation
procedure Form1.ChromiumOnBeforeMenu(Sender: TObject; const browser: ICefBrowser;
const menuInfo: PCefHandlerMenuInfo; out Result: Boolean);
begin
Result := True;
PopupMenu1.Popup(menuInfo.x, menuInfo.y);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Chromium: TChromium;
begin
// owner is responsible for destroying the component
// in this case you are telling to Panel1 to destroy
// the Chromium instance before he destroys itself,
// it doesn't affect the event handling
Chromium := TChromium.Create(Panel1);
Chromium.Parent := Panel1;
Chromium.Left := 10;
Chromium.Top := 10;
Chromium.Width := Panel1.Width - 20;
Chromium.Height := Panel1.Height - 20;
// this line is important, you are assigning the event
// handler for OnBeforeMenu event, so in fact you tell
// to the Chromium; hey if the OnBeforeMenu fires, run
// the code I'm pointing at, in this case will execute
// the ChromiumOnBeforeMenu procedure
Chromium.OnBeforeMenu := ChromiumOnBeforeMenu;
Chromium.Load('www.example.com');
end;
نصائح أخرى
في الواقع ، لا تحتاج إلى قائمة popupmenu ولا يتعين عليك إضافة وحدة vcl.menus إلى تطبيقك إذا كان بإمكانك بالفعل إنشاء قائمة سياق chromium.كما أن قائمة الكروم الخاصة بها تبدو أكثر حداثة ووضوحًا وأداء رسم أسرع بدلاً من vcl الذي يستخدم مكتبة win32 api القديمة.
cef3 بها قائمتها قابلة للتكوين تمامًا مثل هذا. Genacodicetagpre
Genacodicetagpre
ملاحظة: تعمل اختصارات SetAccelerator فقط في حالة ظهور نافذة منبثقة. لذلك قد تحتاج إلى onPreKeyEvent