网上有个很流行的Flash Save源码,相信很多人见过,可能因为代码很早就发布了,的确很简陋,有些情况下不能正常工作,事件的关联,在DocumnetComplete,或者在NavigateComplete2中实例化并与事件关联。  

delphi代码
     
  1.   TObjectProcedure = procedure(var oDoc: IHTMLDocument2) of object;   
  2.   TEventObject = class(TInterfacedObject, IDispatch)   
  3.   private  
  4.     FOnEvent: TObjectProcedure;   
  5.     FoDoc: IHTMLDocument2;   
  6.   protected  
  7.     function GetTypeInfoCount(out Count: Integer): HResult; stdcall;   
  8.     function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;   
  9.     function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;   
  10.     function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;   
  11.   public  
  12.     constructor Create(const OnEvent: TObjectProcedure; var oDoc: IHTMLDocument2);   
  13.     property OnEvent: TObjectProcedure read FOnEvent write FOnEvent;   
  14.   end;   
  15.   
  16. htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver, htmlDoc) as IDispatch);   
  17.   
  18. htmlDoc.onmouseout := (TEventObject.Create(Document_OnMouseOut, htmlDoc) as IDispatch);   
  19.   
  20.   
  21. 2、事件发生后,取得坐标上,可以使用srcelement的属性,但对于iframe中的事件无效。为此,改用事件eventobject来取得坐标位置。取得为屏幕坐标,再转换为工作区坐标。ScreenToClient需要一个HWND,我们采用最上层IE为容器,在setsite时,将IE 的HWND记录下来。    
  22.   
  23. 事件发生的每次坐标都不一样,但是事件上IHTMLEventObj.offsetY属性,表示偏移量,与事件的screenX相减后,即可得到控件的左上角坐标。    
  24.   
  25. pt.X:=vEvt.screenX-vEvt.offsetX; //offsetX是相对于事件下面那个空间左上角的偏移量,所以减去他可以得到控件的原点(左上角)   
  26. pt.Y:=vEvt.screenY-vEvt.offsetY;    
  27.   
  28. 3、解决flash影片的相对路径问题    
  29.   
  30. src:= (vEle as IHTMLElement).getAttribute('movie',0);    
  31. src:='<A HREF='''+ src + '''></A>';通过建立超级连接,让系统自动为我们解决相对路么的问题。    
  32.   
  33. obj:=vdoc.createElement(src);    
  34.   
  35. src:= obj.getAttribute('href',0);    
  36.   
  37. 4.Flash有两个可能的tagName,object和embed   
  38.   
  39. 5.新建form后在启用alexa工具条的浏览器上使用有严重问题,关闭浏览器会弹出红色的错误提示,表明严重错误,解决方法是在隐藏窗口时重新设置SetParent(hwmd,0);   
  40.   
最后修改:2009 年 08 月 16 日
一分也是爱