掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
CEF4Delphiについて (ID:150705)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
さすがにDelphi 6/7あたりの話になると回答が付きにくいですね…無償版で、ということであればDelphi 10.4 RioのCommunity Editionにされたほうがいいとは思いますが… それはさておき、 > GlobalCEFApp_OnProcessMessageReceived構文のところにprocedureの下にprocedureという構文があり > 検索していてもよく見かけるのですが、D7だとprocedureの下にprocedureを置くことができないようです。 これはDelphi 2009で導入された無名メソッドですね。 Delphi での無名メソッド - RAD Studio https://docwiki.embarcadero.com/RADStudio/ja/Delphi_%E3%81%A7%E3%81%AE%E7%84%A1%E5%90%8D%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89 で質問にあったGlobalCEFApp_OnProcessMessageReceivedのところを見ると、ICefFrame.VisitDomProcの呼び出しのパラメータとして無名メソッドを渡しているのですが、ここでCEF4Delphiのソースコード(uCEFInterfaces.pas)を見ると、ICefFrame.VisitDomProcは ICefFrame = interface(ICefBaseRefCounted) ... procedure VisitDomProc(const proc: TCefDomVisitorProc); となっていて、パラメータの型はTCefDomVisitorProcで、これは TCefDomVisitorProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(const document: ICefDomDocument); と定義されています。なのでDelphi 2007およびそれ以前のバージョンでは(reference toがなく)単にprocedure(const document: ICefDomDocument);と解釈されるので、無名メソッドをサポートしていないバージョンのDelphiでは、単にどこかで定義したprocedureを渡せばいい、ということになります(ただしここにはof objectがついていないので、フォームなどクラスのメンバメソッドは渡すことができず、普通のprocedureである必要があります)。 単なるfunction/procedureと無名メソッドの違いは、無名メソッドでは、その置かれた場所からアクセスできる概ねすべてのものに無名メソッド内部からアクセスできる、というところにあって、このコードでいうと無名メソッドの最後にある browser.SendProcessMessage(PID_BROWSER, LMsg); で、呼び出し元のGlobalCEFApp_OnProcessMessageReceivedの仮引数browserがそれにあたります。これを正しく回避するのはちょっと難しいように思います。 とりあえず、ということであれば、たとえば var gbrowser: ICefBrowser; procedure VisitDom(const doc: ICefDomDocument); var LMsg : ICefProcessMessage; LText : ustring; begin //メインプロセスに送信するメッセージの文字列 //ここでは受け取った値と同じにしている LMsg := TCefProcessMessageRef.New(message.Name); LText := doc.Title; //送信内容のセット(ここでは文字列) LMsg.ArgumentList.SetString(0, LText); //送信(メインプロセスで受け取る必要がなければ不要) gbrowser.SendProcessMessage(PID_BROWSER, LMsg); end; procedure GlobalCEFApp_OnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId; const message: ICefProcessMessage; var aHandled: boolean); var LIFrame : ICefFrame; begin ... if (message.Name = 'get_doctitle') then begin gbrowser := browser; LIFrame.VisitDomProc(VisitDom); ... のようにして、コンテキストに相当するもの(この場合はbrowser)をファイルローカルのgbrowser経由でコールバック関数VisitDomに渡すような感じで行けるかな、とは思いますが…。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.