我试过在Memo1Change事件中,执行以下代码:
while(Memo1->Lines->Count > 50)
{
Memo1->Lines->Delete(0);
}
可以实现我想要的功能,但是这种方法会使Memo在添加内容的时候不停的闪动,各位有何高招可以解决这个问题,或用什么方法来实现这个功能。
不胜感激!先行谢过!
22 个解决方案
#1
if (Memo1->Lines->Count > 3)
Memo1->Lines->Delete(0);
Memo1->Update();
Memo1->Lines->Delete(0);
Memo1->Update();
#2
这样写,可以保证你不论将下面的代码放置在哪个事件里都能顺利在Memo中输入,而删除最前行。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Memo1->Lines->Count > 3)
Memo1->Lines->Delete(0);
Memo1->SetFocus();
Memo1->SelStart = Memo1->Text.Length();
Memo1->Update();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Memo1->Lines->Count > 3)
Memo1->Lines->Delete(0);
Memo1->SetFocus();
Memo1->SelStart = Memo1->Text.Length();
Memo1->Update();
}
//---------------------------------------------------------------------------
#3
你可以放置一个TTimer在Form上,之后在Timer的OnTimer事件中嵌入上面的代码,这样你就可以实现你想要得了。
#4
memo->maxlength()
#5
BlueDeepOcean(蓝色·深海) :
你的方法行不通啊,不管把你的代码放在onchange事件中,还是在添加文字的前面,超过规定的行数时,就会出现闪动,你在测试时,要使Memo右边的滚动条出现。
用Timer来做,情况又不一样了,当它清除的时候,会一下子删除很多行,同时也会闪动。
老兄,还有高招吗?
谢谢BlueDeepOcean(蓝色·深海) !
你的方法行不通啊,不管把你的代码放在onchange事件中,还是在添加文字的前面,超过规定的行数时,就会出现闪动,你在测试时,要使Memo右边的滚动条出现。
用Timer来做,情况又不一样了,当它清除的时候,会一下子删除很多行,同时也会闪动。
老兄,还有高招吗?
谢谢BlueDeepOcean(蓝色·深海) !
#6
你怎么试验的,代码发给我,我看看。
#7
to:BlueDeepOcean(蓝色·深海)
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
while(Memo1->Lines->Count > 50)
{
Memo1->Lines->Delete(0);
}
Memo1->SetFocus();
Memo1->SelStart = Memo1->Text.Length();
Memo1->Update();
}
to:zyyoung(zyyoung)
memo->maxlength()是设置最大长度吧,这个设了之后,超过这个长度的就不能输入数据了,不能满足我的要求啊。^_^
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
while(Memo1->Lines->Count > 50)
{
Memo1->Lines->Delete(0);
}
Memo1->SetFocus();
Memo1->SelStart = Memo1->Text.Length();
Memo1->Update();
}
to:zyyoung(zyyoung)
memo->maxlength()是设置最大长度吧,这个设了之后,超过这个长度的就不能输入数据了,不能满足我的要求啊。^_^
#8
隐藏TMemo控件
#9
隐藏这个方法不可取,同样会因为隐藏和显示的切换造成闪动,我试过了,试验证明也是这样。
#10
不能在OnChange事件里。我觉得应该是在添加数据后再判断行数是否超出从而删除
#11
不能在OnChange中,我昨天看了,由于OnChange是采用消息循环的方式进行验证,因此,当处理完Memo1->SelStart之后,又回到对行数的判断之中。所以,就出现第一行、最后一行的屏幕切换。这样,一旦你连续输入,就出现闪烁的假象。
#12
但理论上,我的方法是可以的。
#13
我在添加数据后加入以下代码:
while(Memo1->Lines->Count > 50)
{
//Memo1->Lines->Delete(0); //BlueDeepOcean(蓝色·深海) 的方法
Memo1->SelStart = 0;
Memo1->SelLength
= Memo1->Lines->Strings[0].Length() + 1;
Memo1->SelText = "";
}
Memo1->SetFocus();
Memo1->SelStart = Memo1->Text.Length();
Memo1->SelLength = 0;
Memo1->Update();
闪动依然存在,郁闷!
这个问题究竟怎样解决呢?期待中……
while(Memo1->Lines->Count > 50)
{
//Memo1->Lines->Delete(0); //BlueDeepOcean(蓝色·深海) 的方法
Memo1->SelStart = 0;
Memo1->SelLength
= Memo1->Lines->Strings[0].Length() + 1;
Memo1->SelText = "";
}
Memo1->SetFocus();
Memo1->SelStart = Memo1->Text.Length();
Memo1->SelLength = 0;
Memo1->Update();
闪动依然存在,郁闷!
这个问题究竟怎样解决呢?期待中……
#14
我说了,只要在OnChange中写,问题就存在。
#15
学习
#16
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
Memo1->OnChange = NULL;
Memo1->Lines->BeginUpdate();
while(Memo1->Lines->Count > 5)
{
Memo1->Lines->Delete(0);
}
Memo1->Lines->EndUpdate();
Memo1->SelStart = Memo1->Text.Length();
SendMessage(Memo1->Handle, WM_VSCROLL, MAKEWORD(SB_BOTTOM, 0), NULL);
Memo1->OnChange = Memo1Change;
}
{
Memo1->OnChange = NULL;
Memo1->Lines->BeginUpdate();
while(Memo1->Lines->Count > 5)
{
Memo1->Lines->Delete(0);
}
Memo1->Lines->EndUpdate();
Memo1->SelStart = Memo1->Text.Length();
SendMessage(Memo1->Handle, WM_VSCROLL, MAKEWORD(SB_BOTTOM, 0), NULL);
Memo1->OnChange = Memo1Change;
}
#17
楼上的方法可行。结帖了。
#18
借宝地学习一下,那要是RichEdit控件呢?
#19
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
if(Memo1->Lines->Count <= 50) //减少不必要的闪动
{
return;
}
Memo1->OnChange = NULL;
Memo1->Lines->BeginUpdate();
while(Memo1->Lines->Count > 50)
{
Memo1->Lines->Delete(0);
}
Memo1->Lines->EndUpdate();
Memo1->SelStart = Memo1->Text.Length();
SendMessage(Memo1->Handle, WM_VSCROLL, MAKEWORD(SB_BOTTOM, 0), NULL);
Memo1->OnChange = Memo1Change;
}
我用了cczlp(不惑) 的方法,加了个判断,防止不必要的闪动,这种方法,闪动是减少了,不过还是存在,还能接受吧!
能否彻底解决这个问题呢??拭目以待
多谢各位的热心帮助,在下不胜感激!!!
{
if(Memo1->Lines->Count <= 50) //减少不必要的闪动
{
return;
}
Memo1->OnChange = NULL;
Memo1->Lines->BeginUpdate();
while(Memo1->Lines->Count > 50)
{
Memo1->Lines->Delete(0);
}
Memo1->Lines->EndUpdate();
Memo1->SelStart = Memo1->Text.Length();
SendMessage(Memo1->Handle, WM_VSCROLL, MAKEWORD(SB_BOTTOM, 0), NULL);
Memo1->OnChange = Memo1Change;
}
我用了cczlp(不惑) 的方法,加了个判断,防止不必要的闪动,这种方法,闪动是减少了,不过还是存在,还能接受吧!
能否彻底解决这个问题呢??拭目以待
多谢各位的热心帮助,在下不胜感激!!!
#20
想在这一个函数中解决是不现实的.
最好在添加文字的地方写.
问题不难, 自己想想办法.
最好在添加文字的地方写.
问题不难, 自己想想办法.
#21
晕,昨天怎么就没有在添加文字那里试一下呢!
刚试了,闪动基本上看不出来了,就是在滚动条那里还会跳动一下,不过这个问题可以收工了。
本人是BCB新手,多谢各位的赐教!
再次感谢各位的帮助!
结帖!!^_^^_^
刚试了,闪动基本上看不出来了,就是在滚动条那里还会跳动一下,不过这个问题可以收工了。
本人是BCB新手,多谢各位的赐教!
再次感谢各位的帮助!
结帖!!^_^^_^
#22
问题还没有解决啊,现在还是有闪动啊,机器快点就没事,要是慢点的机很容易就看出来了
#1
if (Memo1->Lines->Count > 3)
Memo1->Lines->Delete(0);
Memo1->Update();
Memo1->Lines->Delete(0);
Memo1->Update();
#2
这样写,可以保证你不论将下面的代码放置在哪个事件里都能顺利在Memo中输入,而删除最前行。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Memo1->Lines->Count > 3)
Memo1->Lines->Delete(0);
Memo1->SetFocus();
Memo1->SelStart = Memo1->Text.Length();
Memo1->Update();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Memo1->Lines->Count > 3)
Memo1->Lines->Delete(0);
Memo1->SetFocus();
Memo1->SelStart = Memo1->Text.Length();
Memo1->Update();
}
//---------------------------------------------------------------------------
#3
你可以放置一个TTimer在Form上,之后在Timer的OnTimer事件中嵌入上面的代码,这样你就可以实现你想要得了。
#4
memo->maxlength()
#5
BlueDeepOcean(蓝色·深海) :
你的方法行不通啊,不管把你的代码放在onchange事件中,还是在添加文字的前面,超过规定的行数时,就会出现闪动,你在测试时,要使Memo右边的滚动条出现。
用Timer来做,情况又不一样了,当它清除的时候,会一下子删除很多行,同时也会闪动。
老兄,还有高招吗?
谢谢BlueDeepOcean(蓝色·深海) !
你的方法行不通啊,不管把你的代码放在onchange事件中,还是在添加文字的前面,超过规定的行数时,就会出现闪动,你在测试时,要使Memo右边的滚动条出现。
用Timer来做,情况又不一样了,当它清除的时候,会一下子删除很多行,同时也会闪动。
老兄,还有高招吗?
谢谢BlueDeepOcean(蓝色·深海) !
#6
你怎么试验的,代码发给我,我看看。
#7
to:BlueDeepOcean(蓝色·深海)
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
while(Memo1->Lines->Count > 50)
{
Memo1->Lines->Delete(0);
}
Memo1->SetFocus();
Memo1->SelStart = Memo1->Text.Length();
Memo1->Update();
}
to:zyyoung(zyyoung)
memo->maxlength()是设置最大长度吧,这个设了之后,超过这个长度的就不能输入数据了,不能满足我的要求啊。^_^
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
while(Memo1->Lines->Count > 50)
{
Memo1->Lines->Delete(0);
}
Memo1->SetFocus();
Memo1->SelStart = Memo1->Text.Length();
Memo1->Update();
}
to:zyyoung(zyyoung)
memo->maxlength()是设置最大长度吧,这个设了之后,超过这个长度的就不能输入数据了,不能满足我的要求啊。^_^
#8
隐藏TMemo控件
#9
隐藏这个方法不可取,同样会因为隐藏和显示的切换造成闪动,我试过了,试验证明也是这样。
#10
不能在OnChange事件里。我觉得应该是在添加数据后再判断行数是否超出从而删除
#11
不能在OnChange中,我昨天看了,由于OnChange是采用消息循环的方式进行验证,因此,当处理完Memo1->SelStart之后,又回到对行数的判断之中。所以,就出现第一行、最后一行的屏幕切换。这样,一旦你连续输入,就出现闪烁的假象。
#12
但理论上,我的方法是可以的。
#13
我在添加数据后加入以下代码:
while(Memo1->Lines->Count > 50)
{
//Memo1->Lines->Delete(0); //BlueDeepOcean(蓝色·深海) 的方法
Memo1->SelStart = 0;
Memo1->SelLength
= Memo1->Lines->Strings[0].Length() + 1;
Memo1->SelText = "";
}
Memo1->SetFocus();
Memo1->SelStart = Memo1->Text.Length();
Memo1->SelLength = 0;
Memo1->Update();
闪动依然存在,郁闷!
这个问题究竟怎样解决呢?期待中……
while(Memo1->Lines->Count > 50)
{
//Memo1->Lines->Delete(0); //BlueDeepOcean(蓝色·深海) 的方法
Memo1->SelStart = 0;
Memo1->SelLength
= Memo1->Lines->Strings[0].Length() + 1;
Memo1->SelText = "";
}
Memo1->SetFocus();
Memo1->SelStart = Memo1->Text.Length();
Memo1->SelLength = 0;
Memo1->Update();
闪动依然存在,郁闷!
这个问题究竟怎样解决呢?期待中……
#14
我说了,只要在OnChange中写,问题就存在。
#15
学习
#16
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
Memo1->OnChange = NULL;
Memo1->Lines->BeginUpdate();
while(Memo1->Lines->Count > 5)
{
Memo1->Lines->Delete(0);
}
Memo1->Lines->EndUpdate();
Memo1->SelStart = Memo1->Text.Length();
SendMessage(Memo1->Handle, WM_VSCROLL, MAKEWORD(SB_BOTTOM, 0), NULL);
Memo1->OnChange = Memo1Change;
}
{
Memo1->OnChange = NULL;
Memo1->Lines->BeginUpdate();
while(Memo1->Lines->Count > 5)
{
Memo1->Lines->Delete(0);
}
Memo1->Lines->EndUpdate();
Memo1->SelStart = Memo1->Text.Length();
SendMessage(Memo1->Handle, WM_VSCROLL, MAKEWORD(SB_BOTTOM, 0), NULL);
Memo1->OnChange = Memo1Change;
}
#17
楼上的方法可行。结帖了。
#18
借宝地学习一下,那要是RichEdit控件呢?
#19
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
if(Memo1->Lines->Count <= 50) //减少不必要的闪动
{
return;
}
Memo1->OnChange = NULL;
Memo1->Lines->BeginUpdate();
while(Memo1->Lines->Count > 50)
{
Memo1->Lines->Delete(0);
}
Memo1->Lines->EndUpdate();
Memo1->SelStart = Memo1->Text.Length();
SendMessage(Memo1->Handle, WM_VSCROLL, MAKEWORD(SB_BOTTOM, 0), NULL);
Memo1->OnChange = Memo1Change;
}
我用了cczlp(不惑) 的方法,加了个判断,防止不必要的闪动,这种方法,闪动是减少了,不过还是存在,还能接受吧!
能否彻底解决这个问题呢??拭目以待
多谢各位的热心帮助,在下不胜感激!!!
{
if(Memo1->Lines->Count <= 50) //减少不必要的闪动
{
return;
}
Memo1->OnChange = NULL;
Memo1->Lines->BeginUpdate();
while(Memo1->Lines->Count > 50)
{
Memo1->Lines->Delete(0);
}
Memo1->Lines->EndUpdate();
Memo1->SelStart = Memo1->Text.Length();
SendMessage(Memo1->Handle, WM_VSCROLL, MAKEWORD(SB_BOTTOM, 0), NULL);
Memo1->OnChange = Memo1Change;
}
我用了cczlp(不惑) 的方法,加了个判断,防止不必要的闪动,这种方法,闪动是减少了,不过还是存在,还能接受吧!
能否彻底解决这个问题呢??拭目以待
多谢各位的热心帮助,在下不胜感激!!!
#20
想在这一个函数中解决是不现实的.
最好在添加文字的地方写.
问题不难, 自己想想办法.
最好在添加文字的地方写.
问题不难, 自己想想办法.
#21
晕,昨天怎么就没有在添加文字那里试一下呢!
刚试了,闪动基本上看不出来了,就是在滚动条那里还会跳动一下,不过这个问题可以收工了。
本人是BCB新手,多谢各位的赐教!
再次感谢各位的帮助!
结帖!!^_^^_^
刚试了,闪动基本上看不出来了,就是在滚动条那里还会跳动一下,不过这个问题可以收工了。
本人是BCB新手,多谢各位的赐教!
再次感谢各位的帮助!
结帖!!^_^^_^
#22
问题还没有解决啊,现在还是有闪动啊,机器快点就没事,要是慢点的机很容易就看出来了