線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1163
推到 Plurk!
推到 Facebook!

找到字串後置於畫面的第一行?

尚未結案
g6101
高階會員


發表:22
回覆:129
積分:110
註冊:2002-06-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-26 12:20:15 IP:61.226.xxx.xxx 未訂閱
大家好: 如題,貼上的程式碼在行數少的時候運作正常,行數多(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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-28 12:52:37 IP:221.169.xxx.xxx 未訂閱
在當年PE2的時代玩過的方法。 |--------------------DATA Size -------------------------------| |<---Windows size --->| 利用窗戶開頭跟資料開頭行做一個比對。 只把要顯示的資料抓進來顯示。 也許笨一點。可是。。。。當你面對有限的元件及有未知問題的元件時。 就只好用一些方法來避開那些問題。 加油。^_^
g6101
高階會員


發表:22
回覆:129
積分:110
註冊:2002-06-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-30 20:29:29 IP:163.29.xxx.xxx 未訂閱
引言: 在當年PE2的時代玩過的方法。 |--------------------DATA Size -------------------------------| |<---Windows size --->| 利用窗戶開頭跟資料開頭行做一個比對。 只把要顯示的資料抓進來顯示。 也許笨一點。可是。。。。當你面對有限的元件及有未知問題的元件時。 就只好用一些方法來避開那些問題。 加油。^_^
感謝您的回應: 不過在下愚蠢,雖經百般思索,仍舊無法理解閣下所提的方法,可否再描述具體一點,感激不盡,謝謝!
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-30 22:37:10 IP:221.169.xxx.xxx 未訂閱
|--------------------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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-31 20:44:55 IP:163.29.xxx.xxx 未訂閱
引言: |--------------------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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-02 00:09:24 IP:61.30.xxx.xxx 未訂閱
yes.就是這個意思。 如果不這樣。就是要去看看 那些元件的屬性及METHOD有沒有可以湊成你要的功能囉。^_^
系統時間:2024-05-19 9:45:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!