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

RICHEDIT 光标所在行号的问题

答題得分者是:st33chen
ralph921
一般會員


發表:17
回覆:31
積分:14
註冊:2005-08-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-27 17:49:24 IP:210.83.xxx.xxx 訂閱
如题。

我要取得当前光标在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的最大宽度自动折行)或者手动换行(通过回车换行)

我只想取得手动换行所产生的行数变化,忽略自动折行所带来的行数变化,有什么好的办法?

谢谢
編輯記錄
ralph921 重新編輯於 2009-04-27 17:50:41, 註解 無‧
ralph921 重新編輯於 2009-04-27 17:51:30, 註解 無‧
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-27 19:10:56 IP:59.112.xxx.xxx 訂閱
我路過看看而已,有好的解決方法的話麻煩po一下來參考

雖然不明白你的用途,但是不能在key down 裡面 用 if key = VK_RETURN then inc(myReturnTimes)
弄個變數來紀錄嗎?
------
額有朝天骨,眼中有靈光
編輯記錄
小傑克 重新編輯於 2009-04-27 19:15:57, 註解 無‧
小傑克 重新編輯於 2009-04-27 19:38:59, 註解 無‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-04-27 23:06:53 IP:59.114.xxx.xxx 未訂閱
假如可以的話
設個全域變數(integer)
之後事先計算一行可以輸入多少個字數
然後就判斷是否已經到了末端
假如到了末端時變數就加1
而且每到了末端就再加1(一直累加)
然後在顯示行數時再扣除掉這個變數
這樣可以嗎?
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-04-28 00:50:14 IP:122.116.xxx.xxx 未訂閱
大家好,

我的感覺是兩岸對行列這兩個字的理解是不一樣的(或是只有我和大家不一樣)
我個人從唸行列式時起就一直是 橫列(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 (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2009-04-28 00:52:06, 註解 無‧
st33chen 重新編輯於 2009-04-28 01:17:57, 註解 無‧
st33chen 重新編輯於 2009-04-28 01:20:54, 註解 無‧
st33chen 重新編輯於 2009-04-28 08:22:00, 註解 無‧
st33chen 重新編輯於 2009-04-28 08:23:23, 註解 無‧
st33chen 重新編輯於 2009-04-28 08:24:49, 註解 無‧
st33chen 重新編輯於 2009-04-28 08:27:07, 註解 無‧
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-28 08:25:28 IP:59.112.xxx.xxx 訂閱
我以前沒仔細發現 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-05-04 16:35:07 IP:210.83.xxx.xxx 訂閱
首先感谢各位的无私帮助。

我最后使用st33chen 的方法得到了我想要的目的;但看下去,小傑克 在五楼的回应 也指出了关键就在于wordwrap这个属性的变化。另外,老大仔小傑克在2、3楼的跟帖 也不失为一种好办法……

又及,st33chen 说的没错,我们对于“行、列”的理解确实恰好相反。

再次感谢
系統時間:2024-05-16 19:33:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!