关于TChrome中加载JS与delphi交互问题回复liqiao的提问Word格式.docx
- 文档编号:15282966
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:16
- 大小:17.68KB
关于TChrome中加载JS与delphi交互问题回复liqiao的提问Word格式.docx
《关于TChrome中加载JS与delphi交互问题回复liqiao的提问Word格式.docx》由会员分享,可在线阅读,更多相关《关于TChrome中加载JS与delphi交互问题回复liqiao的提问Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
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:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 TChrome 加载 JS delphi 交互 问题 回复 liqiao 提问