TMemo的Replace |
|
pcernet
初階會員 發表:69 回覆:113 積分:41 註冊:2002-11-29 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
謝謝指教,以下是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 發送簡訊給我 |
引言: 謝謝指教,以下是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這個函式來做這個動作. 我不是高手, 高手是正在銀幕前微笑的人.
------
我不是高手, 高手是正在銀幕前微笑的人. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |