it1.Text := _msg; end;
即设置Msg属性时,同时也把值显示在文本框里,以便等会儿我们好测试在js中给activeX 属性赋值的效果 ok了,再来测试一下,编译一下,如果通不过,请先运行 regsvr32 C:\Users\jimmy.yang\Desktop\delphi_activex\MyActiveX\MyActiveX.ocx /u 将刚才
注册的ocx反注册,同时关掉浏览器,不然该ocx文件一直被占用,无法更新. 修改一下html的代码:
代码
运行效果
:
10.添加Method 我们已经知道了如何给ActiveX添加对外公开的属性,但是光有属性显然不够,我们再添加一 个Method,参考第5步中的截图,选择new-->Method,添加 一个方法,命名为ShowMsg,Return参数项用默认值HRESULT,然后Parameters添加一 个参数,如下图:
同样不要忘记了点击工具栏中的更新按钮,再打开UMyForm.pas,会发现自动添加了一个过程 的定义:
procedure ShowMsg(const p: WideString); safecall;
转到它的实现部分,写几行测试代码:
procedure TMyForm.ShowMsg(const p: WideString); begin showmessage('Msg属性的值为:' + _msg + #13 + '传入的参数为:' + p); end;
再编译,html代码中添加一些代码:
代码
运行看下:
类似的,我们还可以为ActiveX添加带返回值的function,而非过程procedure,但是比较郁 闷的是,我试了半天,delphi中编译正常后,但是在javascript中就是无法取得返回值,估计 是delphi的变量类型与javascript的变量类型不匹配引起的, 哪位delphi高人如果知道原因, 还请指点一二,在此先谢过. 11.深入看下ActiveX中到底有哪些玩意儿?
既然
ActiveX能加载到网页中,肯定也是dom树的一份子了,想知道ActiveX到底提供了哪 些其它属性或方法吗?以下的js代码可以测试出来:
代码
当然如果你用IE8的js调试功能,也能看到刚才定义的那些方法和属性:
注意一下这里还有其它很多属性,比如
Caption,所以你在js中用alert(x.Caption)也能弹出ActiveForm的标题,这是我们通过IE/JS从外部来看ActiveX的,其实也能换个角度从delphi内部看下activex的结构,com技术号称就是一组通用的接口规范,所以我们在delphi内部确实也能发现不少接口:
MyActiveX.ridl中可以看到
library MyActiveX
{
...
interface IMyForm;
...
...
表明IMyForm就是一个接口,再定位到MyActiveX_TLB.pas可以发现:
type
...
IMyForm = interface;
...
MyForm = IMyForm;
IMyForm = interface(IDispatch)
...
说明MyForm就是从IDispatch继承下来的一个接口
最后再到UMyForm.pas中可以看到
type
TMyForm = class(TActiveForm, IMyForm)
Edit1: TEdit;
...
说明最终的运行窗口,就是继承自TActiveForm并实现了IMyForm的一个类
12.事件支持
打开MyActiveX.ridl,查看IMyFormEvents部分,可以看到delphi生成的ActiveX控件中已经预置了很多事件
dispinterface IMyFormEvents
{
properties:
methods:
[id(0x000000C9)]
void OnActivate(void);
[id(0x000000CA)]
void OnClick(void);
[id(0x000000CB)]
void OnCreate(void);
[id(0x000000CC)]
void OnDblClick(void);
[id(0x000000CD)]
void OnDestroy(void);
[id(0x000000CE)]
void OnDeactivate(void);
[id(0x000000CF)]
void OnKeyPress([in, out] short* Key);
[id(0x000000D0)]
void OnMouseEnter(void);
[id(0x000000D1)]
void OnMouseLeave(void);
[id(0x000000D2)]
void OnPaint(void);
};
我们可以用javascript来响应这些事件,比如就拿我们最熟悉的OnClick事件,js中要这么处理:
运行后,鼠标在ActiveX的空白处点击,会弹出一个警告框:"你点击了ActiveX控件"
13.其它问题
(1)delphi2010中的function
问题 前面提到了带返回值的function不好弄,其实这个不是什么大问题,完全可以迂回用procedure与属性解决
比如我们可以定义一个带参数的procedure,js调用时传入参数,然后在procedure内部,对参数进行处理后,将其赋值为ActiveX的任何一个类型匹配的属性,比如前面提到的Caption属性,然后js获取Caption属性,相当于就是ActiveX处理后的返回值了
(2)d7中如何添加属性和方法
d7中没有New-->Method之类的菜单,要添加属性/方法的话,得手动半自动化输入,步骤:先选中xxximp对应的单元,利用Edit菜单下的Add to Interface功能,参考下图:
然后在弹出对话框里,手动输入要添加的属性
/方法声明,参考下图:
另外在我本机测试,发现d7中添加的function,js能正常调用,不知道是不是我机器的个别 现象 注:截图不易,打字很累,允许转载,但请注明来自菩提树下的杨过 cnblogs/yjmyzz/archive/2009/12/16/1625559.html
-
相关文章
-
最新文件