找到字串後置於畫面的第一行? |
尚未結案
|
g6101
高階會員 發表:22 回覆:129 積分:110 註冊:2002-06-15 發送簡訊給我 |
大家好:
如題,貼上的程式碼在行數少的時候運作正常,行數多(7,000行)時就無法將找到的那一行置於可視畫面的第一行!我的方法錯了嗎?如何修改?請先進們指點,謝謝!
//... TFindDialog *fd = SearchFind1->Dialog; //將找到的文字標示顏色 CHARFORMAT SelectWordFmat; memset(&SelectWordFmat,0,sizeof(CHARFORMAT)); SelectWordFmat.cbSize = sizeof(CHARFORMAT); SelectWordFmat.dwMask = CFM_COLOR; SelectWordFmat.crTextColor = 0x00FF00FF; //桃紅色 SCROLLINFO scroll; //宣告(ScrollBar)結構 memset(&scroll,0,sizeof(SCROLLINFO));//結構初始化 scroll.fMask = SIF_ALL; //取得ScrollBar全部資料的旗標 scroll.cbSize = sizeof(SCROLLINFO); //配置足夠記憶體 GetScrollInfo(Editor->Handle,SB_VERT,&scroll);//取得垂直ScrollBar的資訊 int nCount = SendMessage(Editor->Handle,EM_EXLINEFROMCHAR,0,Editor->Text.Length()); nCount ; //計算字體(行)的高度(Pixels) int LineHeight = scroll.nMax / nCount; TSearchTypes stMode; if (fd->Options.Contains(frMatchCase)){ stMode << stMatchCase; } //全字拼寫完全吻合 if (fd->Options.Contains(frWholeWord)){ stMode << stWholeWord; } //大小寫視為相異 int FoundAt,StartPos,ToEnd; if (Editor->SelLength) { StartPos = Editor->SelStart temp->Editor->SelLength; } else { StartPos = Editor->SelStart; } ToEnd = Editor->Text.Length(); FoundAt = Editor->FindText(fd->FindTextA,StartPos,ToEnd,stMode); if (FoundAt != -1) { Editor->SelStart = FoundAt; Editor->SelLength = fd->FindTextA.Length(); Editor->Perform(EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM) (CHARFORMAT FAR *)&SelectWordFmat); int nPos = SendMessage(Editor->Handle,EM_EXLINEFROMCHAR,0,Editor->SelStart) * LineHeight; SendMessage(Editor->Handle,WM_VSCROLL,MAKELONG(SB_THUMBPOSITION,nPos),0); SendMessage(Editor->Handle,WM_SETFOCUS,0,0); } else { AnsiString str; Editor->SelStart = (Editor->SelLength)?Editor->SelStart Editor->SelLength : Editor->SelStart; str.sprintf("(\"%s\")\n已無相符的字串可供搜尋 <-- 到達文件尾端!",fd->FindTextA); MessageBox(fd->Handle,str.c_str(),"尋找字串...",MB_ICONASTERISK|MB_OK); }註:Editor為TRichEdit元件 |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
g6101
高階會員 發表:22 回覆:129 積分:110 註冊:2002-06-15 發送簡訊給我 |
引言: 在當年PE2的時代玩過的方法。 |--------------------DATA Size -------------------------------| |<---Windows size --->| 利用窗戶開頭跟資料開頭行做一個比對。 只把要顯示的資料抓進來顯示。 也許笨一點。可是。。。。當你面對有限的元件及有未知問題的元件時。 就只好用一些方法來避開那些問題。 加油。^_^感謝您的回應: 不過在下愚蠢,雖經百般思索,仍舊無法理解閣下所提的方法,可否再描述具體一點,感激不盡,謝謝! |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|--------------------DATA Size -------------------------------|
|<---Windows size --->| DATA 放在 buffer (memory or file)
window 則是你 display 的工具。(memo, rich edit...etc) 你所有的 search, add, delete 都是對 data 動作。
而 window 只是用來顯示你資料的異動。
這樣。你想要讓 memo or rich edit or TPannel 做出你要的效果,
不就很容易了嗎? 現成的元件不合你用,一方面就是改它。
一方面就是用它能做到的功能來做。
|
g6101
高階會員 發表:22 回覆:129 積分:110 註冊:2002-06-15 發送簡訊給我 |
引言: |--------------------DATA Size -------------------------------| |<---Windows size --->| DATA 放在 buffer (memory or file) window 則是你 display 的工具。(memo, rich edit...etc) 你所有的 search, add, delete 都是對 data 動作。 而 window 只是用來顯示你資料的異動。 這樣。你想要讓 memo or rich edit or TPannel 做出你要的效果, 不就很容易了嗎? 現成的元件不合你用,一方面就是改它。 一方面就是用它能做到的功能來做。暗黑破壞神兄,按照您的意思是叫我自行切割資料來顯示嗎?如果是的話,那這工程未免太浩大了些... 雖然所提方法不能解燃眉之急,不過我會留下「處方」,供日後參考研究之用,非常感謝您。 |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |