关于RICHEDIT的多重UNDO 和 REDO
利用某位前辈的以下代码生成了一个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




