RichEdit中的回退操作只能退一次,能否控制它退想要的次数?

李志林HZ 2002-10-10 01:44:19
题目如上,搜索遍论坛都找不到相关的东西,请各位帮忙,在线等,谢谢!
...全文
64 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lo 2003-01-18
  • 打赏
  • 举报
回复
在FormCreate中加入

Rich1->Perform(EM_SETUNDOLIMIT,0, 0);
Rich1->Perform(EM_SETUNDOLIMIT, 100, 0);//一百次UNDO
就可以UNDO一百次

这个方法难道不行吗?我就用这是个简单、方法的方法呀。。。!!!
李志林HZ 2002-10-12
  • 打赏
  • 举报
回复
这个问题暂时告一段落,我另开一贴讨论撤消后恢复的问题,就是上面说到的控制退格在5步以内循环,就是前进或后退5步都可以,5以上就不允许的做法。请各位大侠过去看看,谢谢!
  • 打赏
  • 举报
回复
季斑竹很巧得绕过了这个限制....
用删除模拟bkspace....:)
李志林HZ 2002-10-11
  • 打赏
  • 举报
回复
还有一个小问题,如果只做了BackSpack键删除,而不是用Delete键,会将输入的内容一下就搞掉;可否控制退格在5步以内循环,就是前进或后退5步都可以,5以上就不允许的做法。谢谢!
李志林HZ 2002-10-11
  • 打赏
  • 举报
回复
谢谢 各位的帮助!cker(〖烟波浩淼三千里、人鬼殊途五百年〗) ,你的解法确实好用,问题已经解决了,这下可以松一口气了,以后有什么问题还请多多帮忙!

我们公司是用组件库来开发系统的,所以我现在正在努力成为一个组件编写者,毕业前就有一个老师评价我给一个小公司做的商场进销存说这些都是垃圾代码,用过一次就不能用了,要向通用的代码发展,也重点提到你所说的不要让控件的限制成为你的限制,是真正掌握RAD的原动力和理想!所以我现在正在学习中,以后还要各位大侠帮忙的地方请多多指教!

顺便问一下,cker(〖烟波浩淼三千里、人鬼殊途五百年〗) ,我测试时还有一个小问题,就是我输入的东西会一下就被撤消掉,请问该怎样做才可以让它也是可以一步步的撤消?
jishiping 2002-10-11
  • 打赏
  • 举报
回复
重载 OnKeyDown 事件,拦截字符 VK_BACK 就可以了。

class TForm1 : public TForm
{
__published: // IDE-managed Components
void __fastcall RichEditKeyDown(TObject *Sender,
WORD &Key, TShiftState Shift);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
RE = new TMyRichEdit(this);
RE->Parent = this;
RE->Align = alClient;
RE->OnKeyDown = RichEditKeyDown;
}

void __fastcall TForm1::RichEditKeyDown(TObject *Sender,
WORD &Key, TShiftState Shift)
{
TRichEdit* RichEdit;

if (Key==VK_BACK) {
Key = 0;
RichEdit = (TRichEdit*)Sender;
if (RichEdit->SelLength==0 &&
RichEdit->SelStart>0) {
RichEdit->SelStart -= 1;
RichEdit->SelLength = 1;
}
RichEdit->ClearSelection();
}
}
李志林HZ 2002-10-11
  • 打赏
  • 举报
回复
我的意思是用了CKER的代码后会出现:
用BackSpace(退格键)和Delete键混合删除输入在RichEdit中的内容时,可以一个

一个字符的来撤消删除操作,但是如果只用到BackSpace(退格键)来删除时,会出

现在撤消删除操作时根本就不撤消删除操作,而是直接就把你所输入的所有内容撤

消掉,而且不能用撤消操作来恢复你所输入的内容。
jishiping 2002-10-11
  • 打赏
  • 举报
回复
不明白你的意思?我没有使用 cker 的代码,只是使用BCB的TRichEdit,没有
看到“用Delete键,会将输入的内容一下就搞掉”这个现象。
李志林HZ 2002-10-11
  • 打赏
  • 举报
回复
各位来帮忙的我都感谢!
kingcaiyao 2002-10-11
  • 打赏
  • 举报
回复
已收到你的短消息,身边没有BCB,暂时不能告诉你解决方案,请原谅。。
  • 打赏
  • 举报
回复
问题本质在于,从Richedit2.0开始,多重undo和redo实际上已经为系统所支持。
BCB提供的TRichEdit只是一个简单的不完整的封装。更糟的是,这个实现总是载入最低版本的TRichEdit实现。

这里需要自己动手丰衣足食了。略加改造!

#include <ComCtrls.hpp>
class TMyRichEdit : public TRichEdit
{
private:
THandle FLibHandle;

protected:
virtual void __fastcall CreateParams(Controls::TCreateParams ¶ms);
virtual void __fastcall DestroyWnd(void);

public:
__fastcall TMyRichEdit(TComponent* Owner);
};

__fastcall TMyRichEdit::TMyRichEdit(TComponent* Owner) : TRichEdit(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyRichEdit::CreateParams(Controls::TCreateParams ¶ms)
{
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;
}
//---------------------------------------------------------------------------
嗬嗬,不要让控件的限制成为你的限制,是真正掌握RAD的原动力和理想!
flashboy 2002-10-10
  • 打赏
  • 举报
回复
首先应该定义一个操作记忆类,在该类核心是一栈结构。
对EDIT进行HOOK,所有操作存储在这个类中。
所以关键是如何抽象所有EDIT的操作,能够存储在该类的实例中。
大大怪老张 2002-10-10
  • 打赏
  • 举报
回复
给你打气,up
jishiping 2002-10-10
  • 打赏
  • 举报
回复
这个问题很难啊。上面说的,要实现起来很困难啊。毕竟RichEdit的操作,有
很多是用户执行Windows的标准操作而实现对RichEdit的修改的,程序很难完
全拦截到这些操作。又比如,现在执行剪贴簿操作(从剪贴簿粘贴),如果你
仅仅保存粘贴,那么剪贴簿的内容是会变化的。所以你还需要保存剪贴簿的内
容,太难了。要实现BCB编辑器那样的Undo功能,还是很困难的。我觉得简单
一点的话,就是监视每一次的字符改变。而每次改变的字符,必然位于插入点附近。拦截RichEdit的事件OnChange及(或)OnSelectionChange就可以了。
penitent 2002-10-10
  • 打赏
  • 举报
回复
的确没有好的办法啊,我也没有写过这样的东西。
还是自己写吧,要么到google上去找找源码!
看你的运气怎么样
penitent 2002-10-10
  • 打赏
  • 举报
回复
的确没有好的办法啊,我也没有写过这样的东西。
还是自己写吧,要么到google上去找找源码!
看你的运气怎么样
李志林HZ 2002-10-10
  • 打赏
  • 举报
回复
难道除了堆栈的解法就没有更好的解法了?
jbmw 2002-10-10
  • 打赏
  • 举报
回复
gzgz
cbluesky 2002-10-10
  • 打赏
  • 举报
回复
需要学习
李志林HZ 2002-10-10
  • 打赏
  • 举报
回复
怎样联系起来?编写一个站,记录信息后怎样与RICHEDIT取得联系?小弟水平差,希望各位给出大致无错的的代码,谢谢!
加载更多回复(9)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧