मेरे पास डेल्फी क्रोमियम एंबेडेड (http://code.google.com/p/delphichromiumembedded) से एक टीएचरोमियम ब्रोसर है। मैं इसे एक संदर्भ मेनू संलग्न करना चाहता हूं। मैं इसे कैसे प्राप्त कर सकता हूं?TChromium ब्राउज़र में संदर्भ मेनू को कैसे संलग्न करें
उत्तर
आपको 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 इकाई जोड़ने अगर आपके पास पहले से क्रोमियम के संदर्भ मेनू का निर्माण कर सकते करना होगा। क्रोमियम का अपना मेन्यू विंटेज Win32 एपीआई लाइब्रेरी का उपयोग करने वाले वीसीएल की बजाय अधिक आधुनिक और स्पष्ट दिखता है और तेजी से आकर्षित करता है।
सीएफ 3 का मेनू पूरी तरह कॉन्फ़िगर करने योग्य है।
procedure Tfmmain.Chromium1BeforeContextMenu(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; const model: ICefMenuModel);
begin
model.Clear;
model.AddItem(1, 'Your Command 1');
model.AddItem(2, 'Your Command 2');
model.AddSeparator;
model.AddItem(3, 'Your Command 3');
model.AddItem(4, 'your Command 4');
model.AddSeparator;
model.AddItem(999, 'Quit');
model.SetAccelerator(1, VK_RIGHT, false, false, false);
model.SetAccelerator(2, VK_LEFT, false, false, false);
model.SetAccelerator(3, VK_DOWN, false, false, false);
model.SetAccelerator(4, VK_UP, false, false, false);
model.SetAccelerator(999, VK_ESCAPE, false, false, false);
end;
procedure Tfmmain.Chromium1ContextMenuCommand(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const params: ICefContextMenuParams; commandId: Integer;
eventFlags: TCefEventFlags; out Result: Boolean);
begin
case commandId of
1:
begin
DoIt1;
Result := true;
end;
2:
begin
DoIt2;
Result := true;
end;
3:
begin
DoIt3;
Result := true;
end;
4:
DoIt4;
Result := true;
end;
999:
begin
Application.MainForm.Close;
Result := true;
end;
end;
end;
ध्यान दें: SetAccelerator शॉर्टकट केवल कार्यात्मक आप appears.so पॉपअप onPreKeyEvent आवश्यकता हो सकती है यदि
देखें यह दृष्टिकोण आपको मौजूदा क्रोमियम पॉपअप आइटम रखने की अनुमति देता है यदि आप उन्हें चाहते हैं; लेकिन ध्यान दें [सभी उपयोगकर्ता परिभाषित कमांड आईडी MENU_ID_USER_FIRST और MENU_ID_USER_LAST] के बीच होनी चाहिए (http://magpcss.org/ceforum/apidocs3/projects/ (डिफ़ॉल्ट) /CefMenuModel.html) –
असल में संलग्न एक माता पिता के लिए पॉपअप मेनू TPanel काफी ठीक काम किया, लेकिन मैं स्वीकार करेंगे अपने सटीक और सीधे होने के रूप में जवाब दें। –
आप शायद क्रोमियम नियंत्रण गतिशील रूप से बना रहे हैं, लेकिन इसे एक रूप में डिजाइन करने का प्रयास करें। और यहां तक कि यह अजीब बात है, मैं कहूंगा कि क्रोमियम को अपने पॉपअप मेनू को अपना मालिक रखना चाहिए। इस तरह से पॉपअप मेनू को ओवरराइड करने का इरादा है;) – TLama
जब भी ब्राउज़र को टीपीनल के मालिक के रूप में रन टाइम पर बनाया जाता है तब भी मैं इसे काम नहीं कर सकता। इवेंट हैंडलर को बस बुलाया नहीं जाता है। कोई विचार? –