如何駕馭RichEdit中的行數相關問題? |
尚未結案
|
wakanai
一般會員 ![]() ![]() 發表:1 回覆:11 積分:2 註冊:2003-09-23 發送簡訊給我 |
前面有人問過“如何讀取文字檔的總行數?”,但若是已將文字檔載入RichEdit當中,這時則要如何得知其正確的總行數? 嚐試以 IntToStr(RichEdit1.Lines.Count);
去取得總行數,但總是得到不正確的數字?? 又 以程式去搜索某一字串時,若找到時如何獲得其所在的第幾行數??
(在“如何對RichEdit中某一行作彩色方式顯示?”,RichEdit1.Lines.Strings[20]; 是已知行數為前提的詢問) ps:難道是要以去判斷跳行數的方式獲得的嗎?我想Delphi應有更快速的方法!!以上應是最基本的本文處理問題,由於是第一次摸Delphi請各位多多包涵! ps(額外問題):像win32pad一樣即時秀出行號效果又是如何做出來的呢?
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
wakanai
一般會員 ![]() ![]() 發表:1 回覆:11 積分:2 註冊:2003-09-23 發送簡訊給我 |
奇異現象................... ◎以WordPad 去開啟那文字檔去比對以win32pad開啟的文字檔,總行數、內容皆一致! ◎以RichEdit去開啟文字檔去比對以win32pad開啟的文字檔,總行數、內容有些不一致! ◎將RichEdit文字區全部複製起來貼上win32pad時,兩者總行數、內容皆一致!但跟原始以WordPad 去開啟那文字檔的總行數、內容有些不一致! 這樣不就證明RichEdit去開啟文字檔時,有時會擅自更動行字串內容了嗎!!會不會因為本文內容夾帶有(#/{} -<>()%_-)所造成的............. 我的文字檔基本是程式文字,並沒有很長的字串。若沒辦法精準掌握行數及字串值的話,我怕會引響接下的程式的執行! 挖頭皮ing...............................
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
wakanai
一般會員 ![]() ![]() 發表:1 回覆:11 積分:2 註冊:2003-09-23 發送簡訊給我 |
引言: 怎樣的不一致?謝謝您持續的關注!! 我的問題就是在某一行的時候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 發送簡訊給我 |
|
AB
高階會員 ![]() ![]() ![]() ![]() 發表:166 回覆:262 積分:125 註冊:2003-08-21 發送簡訊給我 |
【分享】如何讓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 發送簡訊給我 |
對不起大家!...........犯了初學者最大的錯誤!! 我開啟的文字檔為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 發送簡訊給我 |
|
wakanai
一般會員 ![]() ![]() 發表:1 回覆:11 積分:2 註冊:2003-09-23 發送簡訊給我 |
引言: 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 字元替換成 #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 發送簡訊給我 |
謝謝您的再次的回覆! 這也不失為暫時的權宜之計,..........但我總是認為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 發送簡訊給我 |
有什麼快的方法小弟不知, 小弟想的是載入檔案後
判斷有無 #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 發送簡訊給我 |
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
wakanai
一般會員 ![]() ![]() 發表:1 回覆:11 積分:2 註冊:2003-09-23 發送簡訊給我 |
引言: 用 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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 2.不想要存成 rich text 的格式, 將 TRichEdit.PlainText 設為 True 3.小弟覺得奇怪的是, 既然您的資料都是純文字檔, 為何不用 TMemo?謝謝啦!剛發前一篇的稿之後就發覺我是否想太多了,只要在save之前將RichEdit1.PlainText:=true;就解決了。 至於為何不用TMemo,因考慮到要查詢某些字串給予特定標色之途等等其他功能,故選擇之! 謝謝hagar前輩的一路指導,就讓我把這神聖的第一次就獻給您了!! 還望往後請多多關注!! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |