CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

难道是Delphi的Bug?(WebBrowser的问题)

楼主78product(来电显示)2000-10-19 19:40:00 在 Delphi / VCL组件开发及应用 提问

 
    我用WebBrowser做了一个浏览器,一切都正常。可是当浏览到有  
   
  论坛的网站并在<texfield>中输入文字(就是发表文章)的时候,却  
   
  发现回车不管用了? 问题点数:90、回复次数:8Top

1 楼stonejhao(navystone)回复于 2000-10-20 08:33:00 得分 20

WEBBrowser只是用IE的核心ActiveX控件而已,這裡Delphi只是做了接口的單元而已,不會是Delphi的Bug,   可能是你的瀏覽器太粗糙了...Top

2 楼zhyy(zhyy)回复于 2000-10-22 12:18:00 得分 20

是这样的,不支持回车键,这是MS的错。Top

3 楼78product(来电显示)回复于 2000-10-27 10:09:00 得分 0

 
  当时我一直不敢相信,后来启动vc,vb分别做了同样的东西,呵呵  
  一切正常~~~  
   
    看来比尔还是对自己的亲生儿子要好一点,呵呵~Top

4 楼78product(来电显示)回复于 2000-11-27 11:34:00 得分 0

  没有人知道吗?Top

5 楼jucky(兔子)回复于 2000-11-27 13:13:00 得分 30

不知道下面一段程序对你有无帮助:  
  首先来实现写,因为这是最迫切的要求:  
  procedure   SetHtml(const   WebBrowser:    
  TWebBrowser;   const   Html:   string);  
  var  
  Stream:   IStream;  
  hHTMLText:   HGLOBAL;  
  psi:   IPersistStreamInit;  
  begin  
  if   not   Assigned(WebBrowser.Document)   then   Exit;  
   
  hHTMLText   :=   GlobalAlloc(GPTR,   Length(Html)   +   1);  
  if   0   =   hHTMLText   then   RaiseLastWin32Error;  
   
  CopyMemory(Pointer(hHTMLText),    
  PChar(Html),   Length(Html));  
   
  OleCheck(CreateStreamOnHGlobal  
  (hHTMLText,   True,   Stream));  
  try  
  OleCheck(WebBrowser.Document.  
  QueryInterface(IPersistStreamInit,   psi));  
  try  
  OleCheck(psi.InitNew);  
  OleCheck(psi.Load(Stream));  
  finally  
  psi   :=   nil;  
  end;  
  finally  
  Stream   :=   nil;  
  end;  
  end;  
  ----   首先,此过程需要的两个参数,WebBrowser是显示目的控件,Html是需要显示的HTML源码;然后,先检查WebBrowser.Document对象是否有效,无效则退出;接着在系统全局堆里分配一块内存,将需要显示的HTML源码复制进去。这是因为下一步需要建立一个WebBrowser控件可以读取的流。GlobalAlloc函数的参数GPTR表示需要分配一块固定的以0初始化过的内存区域,如果分配失败则返回0,则通过RaiseLastWin32Error函数引发一个异常,提示用户;然后用CreateStreamOnHGlobal函数建立一个基于全局堆内存块的流,第二个参数如果为True则流在释放时自动释放所占全局堆内存。如果建立成功则此流和刚刚建立的内存块共用同一块内存区域。接着用WebBrowser.Document.QueryInterface函数建立一个IPersistStreamInit接口。然后就可以直接使用此接口,psi.InitNew初始化状态;psi.Load(Stream)从流中载入HTML源码。    
  ----   至此,以Html参数指定的HTML源码就在WebBrowser参数指定的控件中显示出来。    
   
  ----   值得注意的是,每个关于COM接口的函数调用,也就是那些返回类型为HResult的函数,都必须以OleCheck包装,因为一个不检查返回状态的COM接口操作实在太危险了;此外接口的释放,虽然Delphi可以在后台自动完成,但作为一个好的编程习惯,还是应该显式地手工释放,释放只需将接口设为nil即可。    
   
  ----   接着来实现HTML源码的读:    
   
  function   GetHtml(const   WebBrowser:  
  TWebBrowser):   string;  
  const  
  BufSize   =   $10000;  
  var  
  Size:   Int64;  
  Stream:   IStream;  
  hHTMLText:   HGLOBAL;  
  psi:   IPersistStreamInit;  
  begin  
  if   not   Assigned(WebBrowser.Document)   then   Exit;  
   
  OleCheck(WebBrowser.Document.QueryInterface  
  (IPersistStreamInit,   psi));  
  try  
  //OleCheck(psi.GetSizeMax(Size));  
  hHTMLText   :=   GlobalAlloc(GPTR,   BufSize);  
  if   0   =   hHTMLText   then   RaiseLastWin32Error;  
   
  OleCheck(CreateStreamOnHGlobal(hHTMLText,  
  True,   Stream));  
  try  
  OleCheck(psi.Save(Stream,   False));  
   
  Size   :=   StrLen(PChar(hHTMLText));  
  SetLength(Result,   Size);  
  CopyMemory(PChar(Result),   Pointer(hHTMLText),    
  Size);  
  finally  
  Stream   :=   nil;  
  end;  
  finally  
  psi   :=   nil;  
  end;  
  end;  
   
  ----   此函数有一个参数WebBrowser指定从那个控件读取HTML源码,返回一个字符串为此控件中的HTML源码。首先还是要先检查WebBrowser.Document对象是否有效,无效则退出;然后取得IPersistStreamInit接口;接着取得HTML源码的大小:本来应该使用IPersistStreamInit接口的GetSizeMax函数,但在我的机器上测试,这个函数范围值衡为0,无效。因此只能先定义一个足够大的缓冲区,如BufSize   =   $10000字节(注意此缓冲区应该足够大);然后同样地分配全局堆内存块,建立流,然后将HTML文本写到流中。因为此HTML文本在流中是以#0结尾的字符串,因此可以用Size   :=   StrLen(PChar(hHTMLText))取得实际长度,用SetLength(Result,   Size);设置返回字符串长度为HTML源码实际长度,最后复制字符串到返回字符串中。    
  ----   至此,直接访问WebBrowser控件中的HTML源码所需的两个函数全部解析完毕。    
   
  ----   不过需要注意的时,在使用这两个函数前,最好对WebBrowser.Document对象进行初始化。下面提供一个函数,通过显示一个空白页面实现WebBrowser.Document对象初始化。    
   
  procedure   ShowBlankPage(WebBrowser:    
  TWebBrowser);  
  var  
  URL:   OleVariant;  
  begin  
  URL   :=   'about:blank';  
  WebBrowser.Navigate2(URL);  
  end;  
   
  ----   建议在你有WebBrowser控件的Form的FormCreate事件里调用此函数,初始化WebBrowser.Document对象。    
  ----   本文程序在Win   NT   +   Delphi   5   环境下调试通过   Top

6 楼easypaper()回复于 2000-11-28 19:30:00 得分 20

也可以说是delphi的bug。因为VCL库,把回车吃掉了。Top

7 楼78product(来电显示)回复于 2000-12-02 16:19:00 得分 0

我想了一个办法:  
    用hook监听键盘事件,当form获得焦点的时候用户敲回车了,我就在<textarea>  
  中加一个Chr(13),呵呵~可惜不能给自己加分……  
    同意easypaper的意见,世界上没有十全十美的事物嘛……Top

相关问题

  • 难道这是Delphi的Bug吗?
  • Delphi 的 BUG???
  • Delphi超级Bug!!!
  • Delphi 6 的 BUG?
  • Delphi 6 Bug Report !!!!!!!
  • Delphi的BUG????!!!!
  • delphi 6的bug
  • 是DELPHI的BUG????????!!!!!!!!!
  • Delphi的BUG?
  • delphi的一个bug

关键词

  • win32
  • 函数
  • 源码
  • 控件
  • 接口
  • 内存
  • html
  • delphi
  • webbrowser
  • hhtmltext

得分解答快速导航

  • 帖主:78product
  • stonejhao
  • zhyy
  • jucky
  • easypaper

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo