2011-07-31 21 views
15

Delphi Chromium Embedded yardımıyla Chromium'u Delphi 6 projelerime başarıyla yerleştirdim. Şimdi Javascript kodunu çalıştırmak ve ana bilgisayarımın Delphi uygulamasına döndürülen sonuçlara sahip olmak istiyorum. Geçerli yöntemim, ExecuteJavascript() yöntemini çağırmak ve Javascript çağrısının sonuçlarını yazdığı bir DOM öğesini kullanmak ve bu öğeyi, sonuçları almak için Delphi'den bir TTimer yönteminde sorgulamaktır.Chromium ve Delphi 6'yı kullanarak bir web sayfasında "yerel işlevleri" Javascript'e nasıl sunabilirsiniz?

http://magpcss.org/ceforum/viewtopic.php?f=7&t=180

Bu da I denemek istiyorum: Ancak, ben JavaScript yerine sonuçlarını almak için çağrı bir yol olarak benim Delphi koduna "geri aramak" olması doğal işlevleri ve V8 uzantıları kullanmayla ilgili bilgi edinmek Delphi tabanlı olay dinleyicilerini web sayfasındaki (onblur, onmousedown, vb.) DOM öğelerine nasıl ekleyeceğinizi bilmek ister. Kimse onları nerede bulacağını bilen varsa, bu iki şeyi nasıl yapacağımı gösteren bazı örnekler arıyorum.

+2

Wow, tüm Unicode el ile Unicode ve tam Unicode desteği ile Chromium yapmak zorunda Delphi-6.Şimdi bu benim için bir empedans uyuşmazlığı gibi geliyor :) –

+0

"Empedans uyumsuzluğu". Oda arkadaşında elektronik mühendisi var. :) Haklısın, ama Delphi 6 hala en sevdiğim IDE. En azından şimdilik. –

+0

Keşke elektronik mühendisi olsaydım; Hiç çalışma şansım olmadı, ama hala elektronik mühendisliği hakkında bilgi sahibi olmanın ve neyin yanlış gidebileceği konusunda bir fikir sahibi olmanın BT'de çok yararlı olduğu hissine kapıldım. Delphi 6 gibi anlıyorum ama daha güncel versiyonlara bakmaya çalışıyorum. Son zamanlarda geri dönmek zorunda kaldım ve o kadar çok özledim ki ... –

cevap

14

dinleyici takılması oldukça kolay (CEF sadece eski sürümler) 'dir: JavaScript almak için genişletilmiş fonksiyonlara ilişkin

procedure MouseDownCallback(const Event: ICefDomEvent); 
begin 
    ShowMessage('Mouse down on '+Event.Target.Name); 
end; 

procedure AttachMouseDownListenerProc(const Doc: ICefDomDocument); 
begin 
    Doc.Body.AddEventListenerProc('mousedown', True, MouseDownCallback); 
end; 

procedure TMainForm.Button1Click(Sender: TObject); 
begin 
    ChromiumComponent.Browser.MainFrame.VisitDomProc(AttachMouseDownListenerProc); 
end; 

doğrudan sonuçları: (? Henüz) gövde bunları içermez. Devam eden bir iş gibi görünüyor.

Düzenleme:

uzantıları yoluyla yoklama kurtulmak:

JavaScript kodu uzantılarını kullanarak Delphi koduna geri çağırması da gerçekten mümkün. Ayrıca, JavaScript'ten Delphi'ye değerler gönderebilirsiniz - bu, sonuçları sorgulamadan aktarmak için kullanılabilir.

procedure RegisterExtension; 
var 
    Code:string; 
begin 

    Code := 
    'var cef;'+ 
    'if (!cef)'+ 
    ' cef = {};'+ 
    'if (!cef.test)'+ 
    ' cef.test = {};'+ 
    '(function() {'+ 
    ' cef.test.__defineGetter__(''test_param'', function() {'+ 
    ' native function GetTestParam();'+ 
    ' return GetTestParam();'+ 
    ' });'+ 
    ' cef.test.__defineSetter__(''test_param'', function(b) {'+ 
    ' native function SetTestParam();'+ 
    ' if(b) SetTestParam(b);'+ 
    ' });'+ 
    ' cef.test.test_object = function() {'+ 
    ' native function GetTestObject();'+ 
    ' return GetTestObject();'+ 
    ' };'+ 
    '})();'; 

    CefRegisterExtension('example/v8', Code, TMyHandler.Create as ICefv8Handler); 
end; 

initialization 
    RegisterExtension; 

TMyHandler 'ın Execute sonra çağrılır: En initialization bölümünde

İlk geri çağrılırken sonra kullanılmak üzere bir JavaScript nesnesi oluşturur uzantısı, kayıt.

ChromiumComponent.Browser.MainFrame.ExecuteJavaScript('cef.test.test_object().GetMessage();', 'about:blank', 0); 

Bu göstermesi gerekir:

Şimdi
function TMyHandler.Execute(const name: ustring; const obj: ICefv8Value; const arguments: TCefv8ValueArray; var retval: ICefv8Value; var exception: ustring): Boolean; 
begin 
    ShowMessage('Execute!'); 
end; 

basitçe do JavaScript dan Delphi içine çağıran test etmek: TMyHandler

TMyHandler = class(TCefv8HandlerOwn) 
protected 
    function Execute(const name: ustring; const obj: ICefv8Value; 
    const arguments: TCefv8ValueArray; var retval: ICefv8Value; 
    var exception: ustring): Boolean; override; 
end; 

gösteri amaçlı uygulama şimdilik basittir olarak tanımlanır "Execute!" yazan bir mesaj kutusu.

Sana \ demolar bulabileceğiniz cefclient \ cefclient bileşeni kök dir klasör adında bir örnekten demo senaryoyu çekti. Uzantı örnek kodu biraz gizli ve diğer demo koduyla karıştırılmış. Ancak bizim için özel ilgi alanımız TExtension.Execute (benim TMyHandler.Execute'a eşdeğer) uygulamasıdır. Burada hangi işlevin çağrıldığını ve parametrelerin nasıl iletileceğini nasıl bulabilirsiniz. ( Link to the code.)

+0

Teşekkür ederim Heinrich. İhtiyacım olan buydu. Msgstr "JavaScript sonuçları almak için genişletilmiş işlevler hakkında ...". Okuduğum iş parçacıklarından biri, bunun bir sonucu olduğunda, sonuç döndürüldüğünde çağıran iş parçacığının engellenmesini içereceği için bazı endişeler olduğunu gösterdi. Bu endişeyi anlıyorum ama kişisel olarak, kilitleme iş parçacıkları hakkında olağan uyarılar ile görmek istiyorum. Ama bu benim düşüncem. –

+0

Yardım almaktan memnun oldum. Genişletilmiş işlevlerin yararlı olabileceğine tamamen katılıyorum, özellikle de 'executeScriptAndReturnValue' kullanışlı geliyor. –

İlgili konular