如何设置Memo的最大行数?

时间:2022-02-24 04:00:43
本人要在Memo中不停的添加文字,想实现文本滚动的功能,也即超过规定的行数时,删除前面的内容,使Memo的内容始终保持在规定行数之内,如最大行数为50,则在添加第51行时,把原来第0行的数据删除,如此实现Memo里面内容的滚动。
我试过在Memo1Change事件中,执行以下代码:
    while(Memo1->Lines->Count > 50)
    {
        Memo1->Lines->Delete(0);
    }
可以实现我想要的功能,但是这种方法会使Memo在添加内容的时候不停的闪动,各位有何高招可以解决这个问题,或用什么方法来实现这个功能。
不胜感激!先行谢过!

22 个解决方案

#1


if (Memo1->Lines->Count > 3)
                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();
}
//---------------------------------------------------------------------------

#3


你可以放置一个TTimer在Form上,之后在Timer的OnTimer事件中嵌入上面的代码,这样你就可以实现你想要得了。

#4


memo->maxlength()

#5


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()是设置最大长度吧,这个设了之后,超过这个长度的就不能输入数据了,不能满足我的要求啊。^_^

#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();
闪动依然存在,郁闷!
这个问题究竟怎样解决呢?期待中……

#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;
}

#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(不惑) 的方法,加了个判断,防止不必要的闪动,这种方法,闪动是减少了,不过还是存在,还能接受吧!
能否彻底解决这个问题呢??拭目以待
多谢各位的热心帮助,在下不胜感激!!!

#20


想在这一个函数中解决是不现实的.
最好在添加文字的地方写.
问题不难, 自己想想办法.

#21


晕,昨天怎么就没有在添加文字那里试一下呢!
刚试了,闪动基本上看不出来了,就是在滚动条那里还会跳动一下,不过这个问题可以收工了。
本人是BCB新手,多谢各位的赐教!
再次感谢各位的帮助!
结帖!!^_^^_^

#22


问题还没有解决啊,现在还是有闪动啊,机器快点就没事,要是慢点的机很容易就看出来了

#1


if (Memo1->Lines->Count > 3)
                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();
}
//---------------------------------------------------------------------------

#3


你可以放置一个TTimer在Form上,之后在Timer的OnTimer事件中嵌入上面的代码,这样你就可以实现你想要得了。

#4


memo->maxlength()

#5


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()是设置最大长度吧,这个设了之后,超过这个长度的就不能输入数据了,不能满足我的要求啊。^_^

#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();
闪动依然存在,郁闷!
这个问题究竟怎样解决呢?期待中……

#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;
}

#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(不惑) 的方法,加了个判断,防止不必要的闪动,这种方法,闪动是减少了,不过还是存在,还能接受吧!
能否彻底解决这个问题呢??拭目以待
多谢各位的热心帮助,在下不胜感激!!!

#20


想在这一个函数中解决是不现实的.
最好在添加文字的地方写.
问题不难, 自己想想办法.

#21


晕,昨天怎么就没有在添加文字那里试一下呢!
刚试了,闪动基本上看不出来了,就是在滚动条那里还会跳动一下,不过这个问题可以收工了。
本人是BCB新手,多谢各位的赐教!
再次感谢各位的帮助!
结帖!!^_^^_^

#22


问题还没有解决啊,现在还是有闪动啊,机器快点就没事,要是慢点的机很容易就看出来了