我在富文本框中存储大量文本时遇到问题。
我正在尝试读取相当大的文本文件(从90mb到450mb),并将我在富文本框中阅读的内容放入其中。它在一个简单的程序中工作,但是当我在一个复杂的程序中,我得到一个OutOfMemory异常。
有一点需要注意的是,当我退出我的简单程序时,我在程序返回0之前得到一个OutOfMemory异常。
这是我的简单程序代码:
array<String^>^ strArray;
StreamReader^ sr;
String^ dummyStr;
int dummyInt;
sr = gcnew StreamReader("C:\\testsize.txt");
while( (dummyStr = sr->ReadLine() )!= nullptr)
{
dummyInt++;
}
sr->Close();
sr = gcnew StreamReader("C:\\testsize.txt");
strArray = gcnew array<String^>( dummyInt );
for(int i=0; i < strArray->Length; i++)
{
strArray[i] = sr->ReadLine();
}
richTextBox1->Lines = strArray;
我的项目中有类似的代码片段,当我执行richTextBox1-&gt; Lines = strArray行时会弹出异常。
我已经阅读了富文本框的文档,并且它说最大限制是64KB的字符,但这是有道理的,因为我可以加载文本,但我想程序有一个问题后来倾倒它
有什么想法吗?我一直试图找到一些没有限制的自定义控件,但到目前为止没有成功。
答案 0 :(得分:1)
至于将大量文本转储到丰富的编辑中,这通常会非常慢,以记事本为例,尝试用它打开2MB文件。我认为更先进的文本编辑器处理这些的方式是通过“虚拟控件”我知道这些通常与列表控件一起使用,我也会想到文本框。它们基本上以与普通日常控制相同的方式运行/运行,但是没有尝试一次渲染大量文本,它们具有“离开屏幕空间”的虚拟空间。
至于你的内存不足问题...我很困惑你说当你尝试将文本转储到它时,错误发生在示例代码的最后一行。你还提到限制是64KB所以现在假设你的文件很大,就像你说的那样......你有一个错误,你试图将超过64KB的文本转储到64KB的限制框中。我错过了什么吗?
编辑我重读了一些问题,我看到你现在要问的是什么,所以在简单的程序中,一旦加载完毕,当程序退出时,你会收到一个错误。将调试点扔到析构函数中,并查看此错误发生的确切位置。
编辑2 现在我知道你在使用什么系统,我去看看,文档比64K限制稍微复杂一点。首先,它不是指64 KB而是指64000个字符。另请注意,您可以根据需要更改此限制。其次,如果您使用SF_TEXT而不是SF_RTF进行流式传输,则此限制无效,我可以想象这是.NET界面背后的情况。