全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3925
推到 Plurk!
推到 Facebook!

如何駕馭RichEdit中的行數相關問題?

尚未結案
wakanai
一般會員


發表:1
回覆:11
積分:2
註冊:2003-09-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-23 12:11:12 IP:61.219.xxx.xxx 未訂閱
前面有人問過“如何讀取文字檔的總行數?”,但若是已將文字檔載入RichEdit當中,這時則要如何得知其正確的總行數? 嚐試以 IntToStr(RichEdit1.Lines.Count); 去取得總行數,但總是得到不正確的數字?? 又 以程式去搜索某一字串時,若找到時如何獲得其所在的第幾行數?? (在“如何對RichEdit中某一行作彩色方式顯示?”,RichEdit1.Lines.Strings[20]; 是已知行數為前提的詢問) ps:難道是要以去判斷跳行數的方式獲得的嗎?我想Delphi應有更快速的方法!!以上應是最基本的本文處理問題,由於是第一次摸Delphi請各位多多包涵! ps(額外問題):像win32pad一樣即時秀出行號效果又是如何做出來的呢?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-23 13:04:42 IP:202.39.xxx.xxx 未訂閱
1.須把 RichEdit1.WordWrap 設為 False, 則能取得正確行數 2.假設要找 'RichEdit1' 這個字串在 RichEdit1 內所在的位置, 一個偷吃步的方法:
procedure TForm1.Button3Click(Sender: TObject);
var iPos: integer;
begin
  iPos := Pos('RichEdit1', RichEdit1.Lines.Text);
  if iPos <> 0 then begin
    RichEdit1.SetFocus;
    RichEdit1.SelStart := iPos - 1;
    ShowMessage(IntToStr(RichEdit1.CaretPos.x)   ', '   IntToStr(RichEdit1.CaretPos.y));
  end;
end;
--- 歡迎光臨 KTop 研究院 發表人 -
wakanai
一般會員


發表:1
回覆:11
積分:2
註冊:2003-09-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-23 13:40:38 IP:61.219.xxx.xxx 未訂閱
引言: 1.須把 RichEdit1.WordWrap 設為 False, 則能取得正確行數 2.假設要找 'RichEdit1' 這個字串在 RichEdit1 內所在的位置, 一個偷吃步的方法:
謝謝您的回覆! 1.RichEdit1.WordWrap 是設為 False的狀態,就是行總數不合!! 不知問題出在何處? 已知最後一行若是空白的跳行的話,行總數會少算一。 我是以win32pad(free soft)去驗證我的總行數,文字檔越大好像誤差值越多!! 2.很好奇正確吃步的方法!(笑) 發表人 - wakanai 於 2003/09/23 13:43:18 發表人 - wakanai 於 2003/09/23 16:09:47
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-23 16:18:31 IP:202.39.xxx.xxx 未訂閱
1. 您可以看一下關於 WordWrap 這個屬性的 Help, 它設為 True 的時候, 若 TRichEdit 內一個 Line 的字串長度超過它的顯示範圍 超過的部份就為顯示到下一行, 此時計算 Lines.Count 就會不準了 也因此文字檔越大, 誤差也越大    2.上述方法也許不能說是偷吃步 :) 或者要一行一行的算? --- 歡迎光臨 > 發表人 -
wakanai
一般會員


發表:1
回覆:11
積分:2
註冊:2003-09-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-23 17:08:05 IP:61.219.xxx.xxx 未訂閱
奇異現象................... ◎以WordPad 去開啟那文字檔去比對以win32pad開啟的文字檔,總行數、內容皆一致! ◎以RichEdit去開啟文字檔去比對以win32pad開啟的文字檔,總行數、內容有些不一致! ◎將RichEdit文字區全部複製起來貼上win32pad時,兩者總行數、內容皆一致!但跟原始以WordPad 去開啟那文字檔的總行數、內容有些不一致! 這樣不就證明RichEdit去開啟文字檔時,有時會擅自更動行字串內容了嗎!!會不會因為本文內容夾帶有(#/{} -<>()%_-)所造成的............. 我的文字檔基本是程式文字,並沒有很長的字串。若沒辦法精準掌握行數及字串值的話,我怕會引響接下的程式的執行! 挖頭皮ing...............................
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-23 17:34:32 IP:202.39.xxx.xxx 未訂閱
怎樣的不一致?    --- 歡迎光臨 KTop 研究院
wakanai
一般會員


發表:1
回覆:11
積分:2
註冊:2003-09-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-24 09:09:45 IP:61.219.xxx.xxx 未訂閱
引言: 怎樣的不一致?
謝謝您持續的關注!! 我的問題就是在某一行的時候RichEdit會擅自將兩行文字(此兩行為英文數字不超過20字,但當中夾帶有"/","{","}"這些字)合併成一行文字........ 例如原來2行文字 }aa /bb{ 變成1行文字 }aa/bb{ 若把這有問題的文字區塊,複製起來另存起來開啟的話,RichEdit卻是正常的顯示內容與行數。 好像行數少的時候問題不會發生,文字檔行數超過7000以上時,誤差就為3行。RichEdit自動幫我行數減肥(%&#@..),我想要原汁原味的東西啊! 這是RichEdit的bug呢?還是原來的文字檔隱藏有其他字元所造成的呢?還是在設定上所造成的呢? 又、如何在RichEdit旁顯示出行數效果呢?免得要從數千行中去尋找相異處之苦。 眾多疑惑....讓剛碰Delphi的我有點挫折感!! ================== ps:在開啟2萬行的文字檔,兩相比較竟然誤差快100行!這.......RichEdit叫我如何用下去...............help!! 發表人 - wakanai 於 2003/09/24 09:40:59
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-24 10:13:21 IP:202.39.xxx.xxx 未訂閱
1.沒您的檔案, 無法測試, 您可使用 UltraEdit 來看看有什麼特殊字元 2.可使用 RichEdit1.CaretPos.x 與 RichEdit1.CaretPos.y 兩值 來取得 RichEdit1 游標所在的 Col 與 Row 值 3.可不可以問一下, 您取得這些資訊的用途為何? --- 歡迎光臨 >
AB
高階會員


發表:166
回覆:262
積分:125
註冊:2003-08-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-09-24 10:20:38 IP:61.221.xxx.xxx 未訂閱
【分享】如何讓RichEdit自動判斷網址(Source Code) http://delphi.ktop.com.tw/topic.php?TOPIC_ID=20164 【BCB】【分享】打開RichEdit 2.0版以上的多重Undo功能 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=20619 【發表】記事本 (稍微加強版) http://delphi.ktop.com.tw/topic.php?TOPIC_ID=22436 在試看看 發表人 - ab 於 2003/09/24 10:21:28
wakanai
一般會員


發表:1
回覆:11
積分:2
註冊:2003-09-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-09-24 11:06:36 IP:61.219.xxx.xxx 未訂閱
對不起大家!...........犯了初學者最大的錯誤!! 我開啟的文字檔為Mac格式的文字檔,我的目的是於Mac 與 PC 之間所作的文字檔互相溝通,另附一些以程式來進行文字自動替換、新增、刪除功能。說起來應是蠻基本的程式。 原來、win32pad這free soft有支援DOS/WIN,UNIX,MAC的文字檔案格式,TRichEdit雖可開啟但會造成某些行數的合併,原因應是MAC的檔案格式所造成的問題吧!! Win32Pad 1.4.2 http://www.gena01.com/win32pad/ (有興趣者試試看,程式短小功能還不錯。若覺得可以的話、我可將其中文化提供給大家使用) 那麼如何於Delphi作出如同win32pad般可開啟與儲存MAC的文字檔案格式。(我不想跳槽去學習C!) 各位先進、MAC的文字檔案格式要如何正確開啟與回存? Win32Pad原作者有提到可參考Yet Another Code Site http://home.att.net/~robertdunn/Yacs.html#TaeRichEditComponent 但那只提供The Borland C Builder (no Delphi) source is included 各位、可幫忙一下嗎?C 對我而言可是另一境界啊!!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-09-24 11:14:18 IP:202.39.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?topic_id=26933 http://delphi.ktop.com.tw/topic.php?topic_id=33024 http://delphi.ktop.com.tw/topic.php?topic_id=35612    --- 歡迎光臨 KTop 研究院 發表人 -
wakanai
一般會員


發表:1
回覆:11
積分:2
註冊:2003-09-23

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-09-24 12:48:09 IP:61.219.xxx.xxx 未訂閱
引言: http://delphi.ktop.com.tw/topic.php?topic_id=26933 http://delphi.ktop.com.tw/topic.php?topic_id=33024 http://delphi.ktop.com.tw/topic.php?topic_id=35612 ---
謝謝您的指導,看樣子是換行CRLF與CR之間的差別!? 疑惑的是若是7000行的時候其總行數誤差僅只2,這未免有點搞不清為何如此少?? 那麼如何作一簡易的判別出文字檔是以何種換行格式存在,在以RichEdit開啟時自動作出一個轉換動作? 差一點迷途在文字碼上面,原以為是出在EUC碼的問題! http://mlang1.osaka-gaidai.ac.jp/~tagengo/multi/char_code.html 謝謝!! ps: ASCII 的換行字元 在DOS時期,chr(13)只是歸位,就是回第一行的位置(column 1),而chr(10)才是新增一列(new row)。 UNIX根本不這麼分。只是單純的用一個chr(13)就代表了Return。 某些Windows的軟體(如Delphi),的確用一個就夠。但是,為了相容,這類的軟體內部仍將單一一個chr(13)轉換作chr(13) chr(10)。 確實我的文字檔是以chr(13)來作跳行,那如何關閉Delphi不必要的相容轉換動作呢? 發表人 - wakanai 於 2003/09/24 13:40:12
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-09-24 21:53:16 IP:202.39.xxx.xxx 未訂閱
開檔前先把所有的 #13 字元替換成 #13#10 字元
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile('C:\TxtFile.txt');
    sl.Text := StringReplace(sl.Text, #13, #13#10, [rfReplaceAll]);
    sl.SaveToFile('C:\TxtFile.txt');
  finally
    sl.Free;
  end;
end;
然後, 再將文字檔載至 TRichEdit --- 歡迎光臨 KTop 研究院
wakanai
一般會員


發表:1
回覆:11
積分:2
註冊:2003-09-23

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-09-25 08:33:08 IP:61.219.xxx.xxx 未訂閱
謝謝您的再次的回覆! 這也不失為暫時的權宜之計,..........但我總是認為Delphi不應該是要如此的方式先轉檔後再讀入的這樣動作! 就誠如UltraEdit在開啟此類的mac or unix的文字檔時,它會跳出是否要轉換成DOS的格式,按是的話就自動轉換!(不會它私底下開一個Temp檔做轉換的動作吧!) 但UltraEdit這方法,我總覺得不如win32pad般便利,因它會自動辨識文字檔格式做轉碼的動作,在回存的時候也自動存成原來的檔案格式。 依hagar前輩的方式,就須執行來回轉換兩次的動作,這在文字檔很大的時候,所耗的時間我想必定不少!! 原諒我的求精的心態,不知除了此方法之外..............是否尚有更佳的方案!!最近也一直在網路詢查中,望能解套!? 再次、感謝您! ps:回報! 採用事前轉檔後叫入RichEdit內變成逐行跳一個空白行???且不出所料轉檔會耗不少時間(以7000行文字檔而言)! why?why?why?............... 發表人 - wakanai 於 2003/09/25 09:21:08
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-09-25 09:16:59 IP:202.39.xxx.xxx 未訂閱
有什麼快的方法小弟不知, 小弟想的是載入檔案後 判斷有無 #13#10, 有的話則為 Dos/Windows 格式的文字檔;  若無, 則再判斷有無 #13, 有, 則為 Mac 格式的文字檔 另外判斷有無 #10, 有則為 Unix 格式的文字檔 可以用 AdjustLineBreaks 這個 function 將各格式的文字檔的各行結尾改成 #13#10 的格式 參考: http://groups.google.com.tw/groups?hl=zh-TW&lr=&ie=UTF-8&oe=UTF-8&th=be4fd42930b735f2&rnum=11 至於將 Dos/Windows 的文字檔存為 Unix 或 Mac 格式 小弟找了一篇, 如下:
procedure form1.saveunixfile;
var
  stream:tmemorystream;
  c,cl:integer;
  s:string;
begin
  stream:=tstream.create;
  c:=0 to memo1.lines.count - 1 do begin
    s:=memo1.lines.strings[c];
    for cl:=1 to length(s) - 2 do
      stream.writebuffer(s[cl],1);
    stream.writebuffer(#10,1); // 這裏的 #10 改成 #13 就是存 Mac
  end;
  stream.savetofile('myfile');
  stream.free;
end;
Well, this might not be the fastes example, but it's pretty easy to understand... Hope it can help you. Regards, Anders Molin --- 歡迎光臨 KTop 研究院 發表人 -
wakanai
一般會員


發表:1
回覆:11
積分:2
註冊:2003-09-23

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-09-25 09:29:57 IP:61.219.xxx.xxx 未訂閱
引言: 文字檔的各行結尾改成 #13#10 的格式
感謝ing........... 如上則回報! 轉檔後叫入RichEdit內變成逐行跳一個空白行???這會不會RichEdit太聰明了,又把它誤認為兩個跳行..............??
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-09-25 09:48:34 IP:202.39.xxx.xxx 未訂閱
用 Delphi 內附的 AdjustLineBreaks function 這樣應該就不會有問題了    --- 歡迎光臨 KTop 研究院
wakanai
一般會員


發表:1
回覆:11
積分:2
註冊:2003-09-23

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-09-29 15:04:48 IP:61.219.xxx.xxx 未訂閱
引言: 用 Delphi 內附的 AdjustLineBreaks function 這樣應該就不會有問題了
果真曉得這個keyword,mac的檔案格式就簡單萬事搞定! var sl: TStringList; sTmp: String; begin sl := TStringList.Create; sl.LoadFromFile(FileOpen1.Dialog.FileName); sTmp: := sl.Text; RichEdit1.Text:=AdjustLineBreaks(sTmp); sl.Free; end; end; 如此、就可以得到正確文字內容與總行數(雖然它總是於最後一行冒出空白的一行,但可以忽略了!) 剩下的是、如何於回存的時後再轉存成mac格式的文字檔(CR=Char(13))了! hagar前輩雖然有提供將 Dos/Windows 的文字檔存為 Unix 或 Mac 格式的程式碼! 我也嘗試將memo1.lines.count 改成 RichEdit1.Lines.Count但還是沒辦法成功轉出,若是直接RichEdit1.Lines.SaveToFile(FileSaveAs1.Dialog.FileName); 此刻是存成Rich Text 文件,加了一大堆有的沒的Rich 字元進去!! 好像別處說用這個 function DeleteCR(S: string): string; begin while pos(#13,S)<>0 do Delete(S,pos(#13,S),1); Result := S; end; 會比較快的樣子.................... 請問到底要以何種方式,來將RichEdit內的內容回存成正確的mac檔案格式呢? 謝謝!!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#19 引用回覆 回覆 發表時間:2003-09-29 18:54:41 IP:202.39.xxx.xxx 未訂閱
1.Mac 格式每行結尾是 CR(#13), 所以原有的方式改成如下:
function DeleteLF(S: string): string;
begin
  while Pos(#10, S) <> 0 do
    Delete(S, Pos(#10, S), 1);
  Result := S;
end;
另一種:
begin
    RichEdit1.Lines.Text := StringReplace(RichEdit1.Lines.Text, #13#10, #13, [rfReplaceAll]);
end;
哪一種比較快, 您自己試試看吧. 2.不想要存成 rich text 的格式, 將 TRichEdit.PlainText 設為 True 3.小弟覺得奇怪的是, 既然您的資料都是純文字檔, 為何不用 TMemo? --- 歡迎光臨 KTop 研究院 發表人 -
wakanai
一般會員


發表:1
回覆:11
積分:2
註冊:2003-09-23

發送簡訊給我
#20 引用回覆 回覆 發表時間:2003-09-30 08:37:22 IP:61.219.xxx.xxx 未訂閱
引言: 2.不想要存成 rich text 的格式, 將 TRichEdit.PlainText 設為 True 3.小弟覺得奇怪的是, 既然您的資料都是純文字檔, 為何不用 TMemo?
謝謝啦!剛發前一篇的稿之後就發覺我是否想太多了,只要在save之前將RichEdit1.PlainText:=true;就解決了。 至於為何不用TMemo,因考慮到要查詢某些字串給予特定標色之途等等其他功能,故選擇之! 謝謝hagar前輩的一路指導,就讓我把這神聖的第一次就獻給您了!! 還望往後請多多關注!!
系統時間:2024-04-24 0:21:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!