delphi的ActiveForm的开发

delphi的ActiveForm的开发几点总结

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;
var
IdHttp1: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;

posted on 2016-12-13 16:08  随心--  阅读(188)  评论(0编辑  收藏  举报