我有一个简单的“粗鲁”大文本文件(20MB)。我想在 TRichEdit 中展示它。问题是显示需要 6 秒。我想在应用程序的底部放置一个进度条,以避免这种糟糕的用户体验设计。
我的问题是如何获得 TRichEdit 显示的进度?使用 TRichEdit::LoadFromStream 方法,它从 0 到 100% 快(不到 1 秒),但在第一次显示期间应用程序等待 6 秒后。
我用 TFileStream 继承创建了这个类 FileStreamProgress。我覆盖了 TFileStream::Read()
int __fastcall FileStreamProgress::Read(void *Buffer, int Count)
{
__int64 previousPosition = this->Position;
int ret = TFileStream::Read(Buffer, Count);
if (this->Position == 0 || this->Position == this->Size || (previousPosition/128000) != (this->Position/128000)) {
ProgressCallBack(ProgressCallBackParam1, this->Position, this->Size);
}
return ret;
}
static void FileStreamProgress::ProgressCallBack(void*thiz, int i, int max)
{
TProgressBar* ProgressBar = (TProgressBar*)thiz;
if (ProgressBar)
{
if (max > 0)
{
ProgressBar->Position = int(i * 100 / max);
}
if (Application)
{
Sleep(1);
Application->ProcessMessages();
}
}
}
这就是我测试它的方式:
void MyApp::CreatePage(AnsiString filename)
{
ProgressBar->Visible = true;
FileStreamProgress::ProgressCallBackParam1 = (void*)this->ProgressBar;
TFileStream * stream = new FileStreamProgress(filename.c_str(), fmOpenRead);
TPageMemo* Page = new TPageMemo(this);
Page->Parent = PControl;
Page->PageControl = PControl;
MessageDlg("111",mtError,TMsgDlgButtons()<<mbOK,0);
Page->Texte->Lines->LoadFromStream(stream);
MessageDlg("222",mtError,TMsgDlgButtons()<<mbOK,0);
PControl->ActivePage = Page;
}
2 个消息对话框“111”和“222”之间有 7 秒。我的进度条在 100% 处等待 6 秒(在显示期间)