大家好,我現在遇到了一個問題,就是我用RichEdit或者TMemo加載十M左右的資料,都很慢,一般都需要十幾秒。有沒有什么辦法,可以讓他快一些呢?就像winhex那樣。 之前有提示說winhex其實并不是全部加載,而是根據滾動條滾動動態加載資料進來,那么想請大神給我一些具體的函式或者代碼呢,謝謝了,高分跪求解決方案。
uj5u.com熱心網友回復:
10M 就是1000多萬位元組, 打個半折還得500多萬的字, 用戶能看的過來么?uj5u.com熱心網友回復:
妖哥,我知道大概的原理,就是不全部把資料加載進來,在用戶可視區域顯示資料就行,但是怎么樣用代碼處理呢。跪求妖哥給我一個大概的方向吧。uj5u.com熱心網友回復:
可以把全部的資料放在記憶體中(但不是一下全顯示出來),計算顯示一頁需要多少的資料,根據當前滾動頁面的位置,算出當前需要顯示的資料在10MB資料中的偏移,然后顯示出來uj5u.com熱心網友回復:
妖哥,是不是我要去截獲richedit的滾動條事件,然后在事件里面處理?uj5u.com熱心網友回復:
只顯示一屏的資料,估計頂多幾k,就會快很多。可以不用richedit,用自己的滾動條。
uj5u.com熱心網友回復:
如果存盤的是存文本格式,比較的好做,如果是富文本格式要做到完美顯示難度比較的大猜測樓主的需求,可能是做小說閱讀器類的程式吧,用memo或生產圖片吧
uj5u.com熱心網友回復:
生產圖片較簡單uj5u.com熱心網友回復:
請問生產圖片具體怎么做呢?我只需要顯示內容,不需要考慮樣式?uj5u.com熱心網友回復:
還有個問題,生成圖片以后那不是不能編輯了,所以可能還是需要顯示文本內容,但是我遇到的問題是我自己處理Memo的滾動條事件,在向下拖動滾動條的時候加載內容,但是在加載內容的時候,Memo的顯示內容和滾動潭訓動不連貫不一致,怎么弄呢?uj5u.com熱心網友回復:
不同的滾動條可以同步的,但這里不需要同步你先把memo的滾動條隱藏起來,這樣滾動條同步不同步就沒有任何關系了
關鍵點是你要外掛一個獨立的滾動條控制元件,然后算出你的文本有多少行,把外掛的滾動條設定成對應的行數,然后在滾動條的滾動事件中取得當前行數乘每行的字符數,然后截取顯示
uj5u.com熱心網友回復:
要編輯的話,也要通過計算,把修改的內容替換到記憶體,否則的話回頭重新顯示的話內容就還是原來的uj5u.com熱心網友回復:
影像的話用image控制元件,然后有API算出每行文字在畫布上的寬度和高度,以及設定好行間距,然后用畫布畫文字的方法畫就可以了,畫布可以設定字體和文字大小等,這是所有文本編輯控制元件最底層都是這樣實作的就是說螢屏上的所以東西都是畫上去的
uj5u.com熱心網友回復:
對于大量的資料滾動顯示是有標準解決方案的.自己實作先不說,當然也很簡單.
在bcb中,至少有兩種簡便方案來實作.
對于簡單的應用可用TListBox來實作,對于復雜的應用可用TListView來實作.
對于更個性化的應用,TListBox,TListView勻有自繪支持.
下面以TListBox為例,實作100萬條,140M位元組資料的秒顯示.
//Form上放個Button,放個TListBox.
//---------------------------------------------------------------------------
TList *dList=NULL;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListBox1->Style=lbVirtual; //ListBox設為虛擬的,
if(dList==NULL)
dList=new TList(); //資料存放到 TList中
char strLine[512];
int size=0;
for(int i=0;i<1000000;i++) //添加資料到dList中
{
int len=0;
for(int j=0;j<16;j++)
len+=wsprintf(strLine+len,"%08x ",i+j);
char *tmp=new char[len+16];
size+=wsprintf(tmp,"%d %s",i+1,strLine);
dList->Add(tmp);
}
ListBox1->Count=dList->Count; //同步TList和dList的個數
Caption=size/(1024*1024); //計算資料大小
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1Data(TWinControl *Control, int Index,
AnsiString &Data)
{
Data=https://bbs.csdn.net/topics/(char*)dList->Items[Index]; //顯示當前視窗中的一條資料
}
//---------------------------------------------------------------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/119897.html
