1.打开多个包含控件的页面出错在delphi7中开发的控件就有这个问题,原因出在本身开发环境的类库代码有问题。目前没有好的解决方法,官方给出过修改办法,我没有试验成功,使用delphi2007开发,到目前为止没有出现这类问题。
2.资源的释放重载Destroy; override;函数,在IE6.0中,关闭窗口会调用到这个函数。但我拿到IE7.0看的时候却不行了,只会在跳转到另一个页面调用,直接点击IE右上角的关闭按钮时没用。后来发现,点击关闭按钮时会产生“OnDestroy”事件,在它的调用代码中加入我们用来释放的资源,如procedure TActiveFormX.DestroyEvent(Sender: TObject);begin self.destroy_app();//用来释放资源 if FEvents <> nil then FEvents.OnDestroy;end;可以解决问题。
3.调试调试ActiveForm,不能直接点调试运行按钮,因为它不是一个可执行的程序。需要在这之前设定一下运行参数,在菜单run--parameters中“host application”设置ie程序的路径,一般为C:/Program Files/Internet Explorer/iexplore.exe,“parameters”设置包含控件的htm页的路径,如d:/finger/FingerProj1.htm,然后就可以设定断点开始调试。还有一个地方需要注意,运行的时候ie会检测在C:/WINDOWS/Downloaded Program Files目录中是否已经有了该控件,如果有就会直接用该控件,新生成的控件不会被运行,所以最好在调试之前将C:/WINDOWS/Downloaded Program Files目录的该控件的旧有版本删除掉。
4.向javascript中传递事件只能是如下形式<script for="obj" event="onhello(arg)" language="jscript"></script>,“onhello”为事件名,arg为参数。obj.onhello=function(){}这种形式无效。
5.去除控件在网页中的虚框由于安全的原因,默认情况下控件在页面中不能获得焦点,不能响应一些事件。解决的方法是使用document.write输出控件的标签代码。如:function create_ck_webcamtest(){ document.write("<OBJECT id='ct_webcamtest' classid='clsid:CCCC7A66-B886-47F3-A2CD-09793F65DD1B' "); document.write("codebase='./twebcam.ocx' width=160 height=25 align=center hspace=0 vspace=0>"); document.write("</OBJECT>");}
6.压缩和签名一般用delphi开发的控件比较大,只一个空白的ActiveForm就有500k左右。必须对它进行压缩,我用“aspack”,可以减少一半左右的大小,再可以打包成cab形似会更小。签名也是必须的,不然IE会禁止控件的安装,使用微软提供的签名软件,前提是你要买一个证书,一年的费用1000多人民币。
7.将二进制文件传递给web服务器//用户登陆示例function TActiveFormX.User_Login(shop_id: Integer; const path: WideString): Integer;varIdHttp1:TIdHttp;PostStream:TIdMultiPartFormDataStream;ResponseStream:TIdStringStream;ms:TMemoryStream;login_path:string;begin result:=-1;
if not self.FIs_Scaned then begin result:=-11; exit; end;
login_path:=trim(string(path)); if login_path='' then begin result:=-12; exit; end;
IdHttp1:=TIdHttp.Create(nil); PostStream:=TIdMultiPartFormDataStream.Create; ResponseStream:=TIdStringStream.Create(''); ms:=TMemoryStream.Create;
try ms.Write(self.fpimage.Bits^,self.fpimage.Width*self.fpimage.Height); ms.Position:=0;
PostStream.AddFormField('shop_id',inttostr(shop_id)); PostStream.AddFormField('fp_w',inttostr(self.fpimage.Width)); PostStream.AddFormField('fp_h',inttostr(self.fpimage.Height)); PostStream.AddObject('File1','image/fp_bmp',ms,'fp.bp');
try IdHttp1.Request.ContentType:=PostStream.RequestContentType; IdHttp1.Post(login_path,PostStream,ResponseStream);
result:=strtoint(trim(ResponseStream.DataString)); except result:=-13; end; finally IdHttp1.Free; PostStream.Free; ms.Free;
ResponseStream.Free; end;end;