关于TChrome中加载JS与delphi交互问题回复liqiao的提问Word格式.docx
《关于TChrome中加载JS与delphi交互问题回复liqiao的提问Word格式.docx》由会员分享,可在线阅读,更多相关《关于TChrome中加载JS与delphi交互问题回复liqiao的提问Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
![关于TChrome中加载JS与delphi交互问题回复liqiao的提问Word格式.docx](https://file1.bdocx.com/fileroot1/2022-10/29/cc7c0d1e-68f9-4f3f-ad3b-fd6d45646260/cc7c0d1e-68f9-4f3f-ad3b-fd6d456462601.gif)
SysUtils,Classes,ceflib,Rtti,cefvcl;
const
csErrorParameters='
ErrorParameters'
;
csHaveNoThisMember='
Havenomember'
csChromiumCouldNotBeNil='
Chromiumcouldnotbenil,pleasefirstsettheChromiumproperty'
type
{}
TVCLJsExtended=class(TComponent)
type
TANameType=(ntMethod,ntField,ntProperty);
{Innerclass}
TNCJSHandle=class(TCefv8HandlerOwn)
private
FContainer:
TVCLJsExtended;
protected
functionExecute(constname:
ustring;
constobj:
ICefv8Value;
constarguments:
TCefv8ValueArray;
varretval:
varexception:
ustring):
Boolean;
override;
procedureJsCallMethod(Method:
TRttiMethod;
outReturnVal:
ICefv8Value;
constParam:
TCefv8ValueArray);
overload;
ICefv8Value);
functionMethodParamLength(Mn:
string):
Integer;
public
constructorCreate(Container:
TVCLJsExtended);
end;
FProcessObject:
TObject;
FJsHandle:
TNCJSHandle;
FTypeInfo:
Pointer;
FCustomChromium:
TChromium;
FFrame:
ICefFrame;
Frame:
ICefFrame{readFFramewriteFFrame};
propertyProcessObject:
TObjectreadFProcessObject;
propertyATypeInfo:
PointerreadFTypeInfo;
procedureSetProcessObject(value:
ATypeInfo:
Pointer);
ProcedureExecuteJavaScript(constjsCode,scriptUrl:
string;
startLine:
Integer);
ProcedureExecuteJavaScript(constjsCode:
string);
constructorcreate(AOwner:
TComponent);
override;
propertyChromium:
TChromiumreadFCustomChromiumwriteFCustomChromium;
TVCLNcJsExtended=class(TVCLJsExtended)
published
propertyChromium;
TNCWebBrowser=class(TChromium)
procedureRegister;
implementation
usesTypInfo;
begin
RegisterComponents('
NwControls'
[TVCLNcJsExtended]);
[TChromium]);
end;
{TVCLJsExtended}
constructorTVCLJsExtended.create(AOwner:
inheritedcreate(AOwner);
=nil;
=TNCJSHandle.Create(Self);
procedureTVCLJsExtended.ExecuteJavaScript(constjsCode,scriptUrl:
ifnotAssigned(FCustomChromium)then
begin
raiseException.Create(csChromiumCouldNotBeNil);
Exit;
FCustomChromium.Browser.MainFrame.ExecuteJavaScript(jsCode,scriptUrl,startLine);
procedureTVCLJsExtended.ExecuteJavaScript(constjsCode:
ExecuteJavaScript(jsCode,'
'
0);
procedureTVCLJsExtended.SetProcessObject(value:
TObject;
var
RttiContext:
TRttiContext;
RttiType:
TRttiType;
RM:
RP:
TRttiProperty;
RF:
TRttiField;
JsStr,name:
String;
I:
{
根据object所提供的方法属性生成js字符串,希望注册.
}
=value;
=ATypeInfo;
=RttiContext.GetType(FTypeInfo);
name:
=RttiType.Name;
JsStr:
=Format('
var%s;
[name]);
%sif(!
%s)%s={};
[JsStr,name,name]);
{Processmethod}
forRMinRttiType.GetMethodsdo
=JsStr+Format(#$A#$D'
nativefunction%s('
[RM.Name]);
ifLength(RM.GetParameters)=0then
%s);
[JsStr])
else
forI:
=0toLength(RM.GetParameters)-2do
%s%s,'
[JsStr,chr(ord('
A'
)+I)]);
=Length(RM.GetParameters)-1;
%s%s);
{ProcessField}
forRFinRttiType.GetFieldsdo
%s'
#$A#$D'
var%s;
[JsStr,RF.Name]);
caseRF.FieldType.TypeKindof
tkUnknown:
;
tkInteger:
%s=%d;
[JsStr,RF.Name,RF.GetValue(FProcessObject).AsInteger]);
tkChar:
%s="
%s"
[JsStr,RF.Name,RF.GetValue(FProcessObject).AsString]);
tkEnumeration:
tkFloat:
%s=%f;
[JsStr,RF.Name,RF.GetValue(FProcessObject).AsExtended]);
tkString:
tkSet:
tkClass:
{supportlater}JsStr:
%s={};
tkMethod:
tkWChar:
tkLString:
tkWString:
tkVariant:
tkArray: