سؤال

لدي متصفح 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top