2011-12-06 32 views
5

मेरे पास डेल्फी क्रोमियम एंबेडेड (http://code.google.com/p/delphichromiumembedded) से एक टीएचरोमियम ब्रोसर है। मैं इसे एक संदर्भ मेनू संलग्न करना चाहता हूं। मैं इसे कैसे प्राप्त कर सकता हूं?TChromium ब्राउज़र में संदर्भ मेनू को कैसे संलग्न करें

उत्तर

5

आपको 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; 
+0

असल में संलग्न एक माता पिता के लिए पॉपअप मेनू TPanel काफी ठीक काम किया, लेकिन मैं स्वीकार करेंगे अपने सटीक और सीधे होने के रूप में जवाब दें। –

+0

आप शायद क्रोमियम नियंत्रण गतिशील रूप से बना रहे हैं, लेकिन इसे एक रूप में डिजाइन करने का प्रयास करें। और यहां तक ​​कि यह अजीब बात है, मैं कहूंगा कि क्रोमियम को अपने पॉपअप मेनू को अपना मालिक रखना चाहिए। इस तरह से पॉपअप मेनू को ओवरराइड करने का इरादा है;) – TLama

+0

जब भी ब्राउज़र को टीपीनल के मालिक के रूप में रन टाइम पर बनाया जाता है तब भी मैं इसे काम नहीं कर सकता। इवेंट हैंडलर को बस बुलाया नहीं जाता है। कोई विचार? –

3

वास्तव में आप 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 आवश्यकता हो सकती है यदि

+0

देखें यह दृष्टिकोण आपको मौजूदा क्रोमियम पॉपअप आइटम रखने की अनुमति देता है यदि आप उन्हें चाहते हैं; लेकिन ध्यान दें [सभी उपयोगकर्ता परिभाषित कमांड आईडी MENU_ID_USER_FIRST और MENU_ID_USER_LAST] के बीच होनी चाहिए (http://magpcss.org/ceforum/apidocs3/projects/ (डिफ़ॉल्ट) /CefMenuModel.html) –