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

关于RICHEDIT的多重UNDO 和 REDO

楼主Creuset()2005-04-01 15:40:58 在 C++ Builder / 基础类 提问

利用某位前辈的以下代码生成了一个MyRichEdit,使用RICHEDIT2。0可以解决多重UNDO,REDO问题,但是,原来撰写的  
    RichEdit1->Lines->Add(“任意字符串”);会出现运行期错误OutOfResource,richedit   insertion   error!到底是怎么回事啊,求教!  
  如果不用ADD方法,自己在RICHEDIT里面敲字符一点问题没有。  
   
  那位前辈的思路和代码:  
  //----------------------------------------------------------  
  问题本质在于,从Richedit2.0开始,多重undo和redo实际上已经为系统所支持。  
  BCB提供的TRichEdit只是一个简单的不完整的封装。更糟的是,这个实现总是载入最低版本的TRichEdit实现。  
   
  这里需要自己动手丰衣足食了。略加改造!  
   
  #include   <ComCtrls.hpp>  
  class   TMyRichEdit   :   public   TRichEdit  
  {  
  private:  
      THandle   FLibHandle;  
   
  protected:  
      virtual   void   __fastcall   CreateParams(Controls::TCreateParams   &Params);  
      virtual   void   __fastcall   DestroyWnd(void);  
   
  public:  
      __fastcall   TMyRichEdit(TComponent*   Owner);  
  };  
   
  __fastcall   TMyRichEdit::TMyRichEdit(TComponent*   Owner)   :   TRichEdit(Owner)  
  {  
  }  
  //---------------------------------------------------------------------------  
  void   __fastcall   TMyRichEdit::CreateParams(Controls::TCreateParams   &Params)  
  {  
      const   char   RichEditModuleName[]   =   "RICHED20.DLL";  
      char   ControlClassName[]   =   "RICHEDIT20W";  
      int   OldError;  
   
      OldError   =   SetErrorMode(SEM_NOOPENFILEERRORBOX);  
      FLibHandle   =   (unsigned   int)LoadLibrary(RichEditModuleName);  
   
      if   ((FLibHandle   >   0)   &&   (FLibHandle   <   HINSTANCE_ERROR)   )  
          FLibHandle   =   0;  
   
      if   (FLibHandle   ==   0   )  
      {  
              TRichEdit::CreateParams(Params);  
              return;  
      }  
   
      SetErrorMode(OldError);  
   
      TRichEdit::CreateParams(Params);  
      Params.Style   =   Params.Style   |  
  (HideScrollBars   ?   0   :   ES_DISABLENOSCROLL)   |   (HideSelection   ?   0   :   ES_NOHIDESEL);  
   
      CreateSubClass(Params,   ControlClassName);  
  }  
  void   __fastcall   TMyRichEdit::DestroyWnd(void)  
  {  
      TRichEdit::DestroyWnd();  
      if   (FLibHandle   !=   NULL)   FreeLibrary((void*)FLibHandle);  
  }  
  TMyRichEdit*   RE;  
   
  __fastcall   TForm1::TForm1(TComponent*   Owner)  
  :   TForm(Owner)  
  {  
  RE   =   new   TMyRichEdit(this);  
  RE->Parent   =   this;  
  RE->Align   =   alClient;  
  }  
  //--------------------------------------------------------------------------- 问题点数:50、回复次数:4Top

1 楼Creuset()回复于 2005-04-02 18:06:28 得分 0

upTop

2 楼jishiping(JSP 季世平)回复于 2005-04-02 20:00:24 得分 50

调试了一下VCL源程序,问题的本质在于:BCB本身的TRichEdit,将换行符看做是2个字符\r\n,而你这儿的RichEdit,换行仅仅是1个字符\n。而BCB的源代码,始终将换行看做是2个字符\r\n。楼主上面的代码,虽然会弹出错误信息,但是实际的操作是成功的,仅仅是在操作结束后,VCL判断是否成功时,因为换行符的关系,导致判断错误而弹出了错误信息。Top

3 楼jishiping(JSP 季世平)回复于 2005-04-02 20:08:52 得分 0

一个简单的解决办法,就是在你使用     RichEdit1->Lines->Add   的地方,加上try   catch   就可以了。  
  try  
  {  
          RichEdit1->Lines->Add("测试");  
  }  
  catch(EOutOfResources&   e)  
  {  
  }  
  catch(...)  
  {  
          throw;  
  }Top

4 楼Creuset()回复于 2005-04-03 11:49:38 得分 0

谢谢大侠。确实能解决。  
   
  可是每次ADD都这么做也真是好麻烦。。。。。Top

相关问题

  • about richeditctrl's undo redo
  • Undo Redo的问题
  • 求Undo/Redo方法、经验.
  • RichEdit
  • RichEdit
  • RICHEDIT
  • 如何实现undo ,redo(up有分)
  • redo/undo的实现方法求助!!!急!!!!
  • 2000多重启动
  • 多重循环的问题

关键词

  • 字符
  • bcb
  • 解决
  • richedit
  • tmyrichedit
  • flibhandle
  • trichedit
  • 多重undo
  • redo
  • fastcall

得分解答快速导航

  • 帖主:Creuset
  • jishiping

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

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