RICHEDIT 光标所在行号的问题 |
答題得分者是:st33chen
|
ralph921
一般會員 發表:17 回覆:31 積分:14 註冊:2005-08-22 發送簡訊給我 |
如题。
我要取得当前光标在RICHEDIT的第几行,为此我写了一段代码如下: [code delphi] const EM_EXLINEFROMCHAR = WM_USER 54; procedure TFRM_01_MAIN.Button2Click(Sender: TObject); var CharPos : tpoint; tmpstr : string; begin CharPos.Y := SendMessage(REDT_35.Handle, EM_EXLINEFROMCHAR, 0, REDT_35.SelStart); CharPos.X := (REDT_35.SelStart - SendMessage(REDT_35.Handle, EM_LINEINDEX, CharPos.Y, 0)); inc(CharPos.Y); inc(CharPos.X); TmpStr := REDT_35.Lines.Strings[CharPos.Y-1]; end; [/code] 目前的问题是,RICHEDIT有自动换行的功能,以上代码取出来的行号并不区分 自动换行(即打字到RICHEDIT的最大宽度自动折行)或者手动换行(通过回车换行) 我只想取得手动换行所产生的行数变化,忽略自动折行所带来的行数变化,有什么好的办法? 谢谢 |
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
|
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
大家好,
我的感覺是兩岸對行列這兩個字的理解是不一樣的(或是只有我和大家不一樣) 我個人從唸行列式時起就一直是 橫列(row) 直行(column) 的觀念. 但我讀了一些簡体文章, 感覺 行 被定義成橫的. 如果您的 第几行 是要求得 第几row 的話 那您的題目是 : 在 richedit 看到的 cursor 所在的位置 是 輸入文字的第幾列字串 對嗎? 我發現 : 1. design time 時把 redt_35.wordwrap 設為 false; (注意, 若 design time 設為 true 且有預設文字 就沒效果) 2. form 的 o n s h o w 事件中把 redt_35.wordwrap 設為 true; 3. button 的 o n c l i c k 事件中 tmpstr := redt_35.lines.text; // 就是 wordwrap 後的字串集, 含有自動加的 crlf redt_35.wordwrap := false; tmpstr2 := redt_35.lines.text; // 就是未 wordwrap 的字串集, 不含自動加的 crlf, 只有人工輸入的 crlf 比較一下應該可以知道 cursor 是在輸入字串集的第幾個字串. ----------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var CharPos : tpoint; tmpstr : string; ii : integer; mylist : tstringlist; begin charpos := redt_35.CaretPos; // cursor 所在位置做記號 redt_35.lines[charpos.y] := copy(redt_35.lines[charpos.y],1,charpos.x) '_x_x_x_x_' copy(redt_35.lines[charpos.y],charpos.x 1, 1000); // 設為不折列, 這時 caretpos 為變成 (0,0) redt_35.WordWrap := false; // 檢查 記號在 哪一列, 後來覺得直接用 redt_35 判斷也可以, 不需用 mylist. mylist := tstringlist.create; mylist.text := redt_35.lines.Text; for ii := 0 to mylist.Count-1 do begin if pos('_x_x_x_x_', mylist.Strings[ii])>0 then break; end; if ii < mylist.Count then showmessage(inttostr(ii)); mylist.free; // 復原 redt_35.wordwrap := true; redt_35.lines[charpos.y] := stringreplace(redt_35.lines[charpos.y],'_x_x_x_x_','',[]); redt_35.CaretPos := charpos; redt_35.SetFocus; end; // 用來處理 直行 位置好像也可以
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
我以前沒仔細發現 RichEdit.Text 和 RichEdit.Line.Text 的差別
沒想到一測試就發現這是你要的答案 當wordwrap=true 的時候 RichEdit.Line.Text 是經過Wordwrap自動換行後的結果 而 RichEdit.Text 是沒經過自動換行的結果 所以配合http://delphi.ktop.com.tw/board.php?cid=30&fid=1498&tid=92758 中 eaglewolf 計算SelStart 的方法就可以滿足你的需求 需要注意的是 RichEdit.Text & RichEdit.Line.Text 要在runtime 才會有差異 , 如果預先key in在properties的 字串會自動轉換成有換行的 但是 runtime 使用 RichEdit.Line.LoadFromFile(xx) 載入的文字則兩個會有不同
------
額有朝天骨,眼中有靈光 |
ralph921
一般會員 發表:17 回覆:31 積分:14 註冊:2005-08-22 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |