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

TMemo的Replace

 
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-11-30 19:57:38 IP:61.218.xxx.xxx 未訂閱
function TForm1.ReplaceDialog1Replace(aa,bb:string):integer; var i:Integer; begin with TReplaceDialog(Self) do begin i:=0; while Pos(aa,Memo1.Lines.Text)>0 do begin Memo1.SelStart := Pos(aa,Memo1.Lines.Text) - 1; Memo1.SelLength :=Length(aa); Memo1.SelText := bb; i:=i 1; end; end; Result:=i; end; 這樣的程式是有BUG的,如果原字串是 天意 要替換成 "天意" 那麼就會造成無窮迴圈,請問有無較理想的源碼可供參考,謝謝。
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-11-30 22:39:17 IP:211.23.xxx.xxx 未訂閱
引言: function TForm1.ReplaceDialog1Replace(aa,bb:string):integer; var i:Integer; begin with TReplaceDialog(Self) do begin i:=0; while Pos(aa,Memo1.Lines.Text)>0 do begin Memo1.SelStart := Pos(aa,Memo1.Lines.Text) - 1; Memo1.SelLength :=Length(aa); Memo1.SelText := bb; i:=i 1; end; end; Result:=i; end; 這樣的程式是有BUG的,如果原字串是 天意 要替換成 "天意" 那麼就會造成無窮迴圈,請問有無較理想的源碼可供參考,謝謝。
會造成無窮迴圈是因為你的程式流程有問題,請將你的程式流程再檢視一下吧,因為這樣你才能寫出正確的程式,建議可以先將流程圖畫一下,再對照一下你的程式就可以知道你程式的bug在那了 @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
pcernet
初階會員


發表:69
回覆:113
積分:41
註冊:2002-11-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-01 01:01:00 IP:61.218.xxx.xxx 未訂閱
謝謝指教,以下是Delphi5 Help中的範例 procedure TForm1.ReplaceDialog1Replace(Sender: TObject); var SelPos: Integer; begin with TReplaceDialog(Sender) do begin { Perform a global case-sensitive search for FindText in Memo1 } SelPos := Pos(FindText, Memo1.Lines.Text); if SelPos > 0 then begin Memo1.SelStart := SelPos - 1; Memo1.SelLength := Length(FindText); { Replace selected text with ReplaceText } Memo1.SelText := ReplaceText; end else MessageDlg(Concat('Could not find "', FindText, '" in Memo1.'), mtError, [mbOk], 0); end; end; 很顯然也是這個問題,不才認為這是因為POS所比對的範圍是整篇文章,即使已經比對並替換也會重新比對,因此才會造成無窮迴圈,除了去記錄位置往下搜尋之外,連Delphi Help的範例也會出現的問題,應該有較好的解決方案,如果能讓資料"往下搜尋"自然問題就解決了,謝謝。
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-02 07:44:09 IP:210.58.xxx.xxx 未訂閱
引言: 謝謝指教,以下是Delphi5 Help中的範例 procedure TForm1.ReplaceDialog1Replace(Sender: TObject); var SelPos: Integer; begin with TReplaceDialog(Sender) do begin { Perform a global case-sensitive search for FindText in Memo1 } SelPos := Pos(FindText, Memo1.Lines.Text); if SelPos > 0 then begin Memo1.SelStart := SelPos - 1; Memo1.SelLength := Length(FindText); { Replace selected text with ReplaceText } Memo1.SelText := ReplaceText; end else MessageDlg(Concat('Could not find "', FindText, '" in Memo1.'), mtError, [mbOk], 0); end; end; 很顯然也是這個問題,不才認為這是因為POS所比對的範圍是整篇文章,即使已經比對並替換也會重新比對,因此才會造成無窮迴圈,除了去記錄位置往下搜尋之外,連Delphi Help的範例也會出現的問題,應該有較好的解決方案,如果能讓資料"往下搜尋"自然問題就解決了,謝謝。
Hi pcernet 您好: 在Delphi範例中並沒有用到迴圈所以沒有無窮迴圈的問題, 由你的程式可看出一定會造成無窮迴圈, 請再研究一下便可知道, 您可以用StringReplace這個函式來做這個動作. 我不是高手, 高手是正在銀幕前微笑的人.
------


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