我在現有的C++ CodeGear的項目創建一個搜索功能。如何保存TRichEdit RTF文本的特定部分(C++的CodeGear)
當你雙擊一個單詞,單詞的所有出現的背景是綠色的油漆像記事本+ +。
在應用顏色之前,我將原始TRichEDit
文本保存在TMemoryStream中,以便能夠恢復原始文本。我重置顏色恢復正常就在TRichEdit
click事件。
我想知道是否有一種方法可以在TMemoryStream
中保存每個搜索詞的出現,也可以使用類似EM_STREAMOUT
的消息?
現在一切正常,但當TRichEdit
文本太大時,重新加載所有文本的大備忘錄需要很長時間。我認爲最好只記住單詞的顏色,而不是重新加載所有文字。
我真的在編程初學者,任何幫助是讚賞。告訴我,如果它不夠清楚。
這裏是我的代碼工作,並把背景顏色詞的出現: ` 無效SearchInText :: searchWordInText(TRichEdit * reTextToSearch,AnsiString類型strWordToFind) { lstOccurrences->清除(); // LST
strTextToParse = AnsiReplaceText(strTextToParse, "\r\n", "\n");
int nPrevTagPos = 0;
int nTagPos = strTextToParse.AnsiPos(strWordToFind);
while (nTagPos != 0)
{
int nPosMin = nPrevTagPos + nTagPos - 1;
//List of all the occurrence in the TRichEdit with their position in the text
//It's not a list of int, but it POINT to adresses of INT so it's the same result =)
lstOccurrences->Add((TObject*) nPosMin);
//Change color of background when there is an occurrence
changeBgColor(reTextToSearch, strWordToFind, nPosMin +1, 155, 255, 155); //lime
bColorWasApplied = true;
nPrevTagPos = nPosMin + strWordToFind.Length();
strTextToParse = strTextToParse.SubString(nTagPos + strWordToFind.Length(), strTextToParse.Length());
nTagPos = strTextToParse.AnsiPos(strWordToFind);
}
重置} `
您可以創建自己的結構,'Start'和'Length'成員,並將其存儲在一個列表或數組。爲每個突出顯示的單詞保存「RichEdit-> SelStart」和「 - > SelLength」。當需要恢復它們時,循環顯示列表,將RichEdit-> SelStart和 - > SelLength更改爲存儲的值,並將該選擇的顏色重置爲原始顏色。 (如果需要,您甚至可以將原始顏色保存爲該結構的一部分。) – 2014-11-03 21:54:07
@KenWhite:應該發佈爲答案而不是評論。 – 2014-11-03 23:37:00
@Remy:我沒有安裝Builder的機器,這遠離我的專業領域。 :-) – 2014-11-04 00:26:02