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

疑似delphi richedit 的 bug ...??

答題得分者是:wameng
zenokuao
一般會員


發表:1
回覆:1
積分:0
註冊:2004-05-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-03 15:53:25 IP:61.218.xxx.xxx 訂閱
剛剛發現在delphi上只要這麼寫 就會出錯誤訊息了  @@
richedit1.Lines.Append('ˋˊ');

但是這麼寫卻沒問題,所以應該是delphi的richedit有bug吧
memo1.Lines.append('ˋˊ');

似乎只要append某些符號就能讓delphi的richedit出錯了...
總共有哪些符號會出錯目前並不清楚,但大概都是注音的聲符
備註:在我測試時,是使用d7,xp sp2在form上放一個richedit,textbox,和button,
並在button的按下事件內放上面的兩行代碼
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-03 16:40:01 IP:61.222.xxx.xxx 訂閱
BUG

改成

richedit1.Lines[richedit1.Lines.Add('')] := 'ˋˊ';


try
richedit1.Lines.Append('ˋˊ');
except
end;
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-03 16:52:33 IP:210.66.xxx.xxx 訂閱
不知道這樣模擬測試可不可行?
[code delphi]
{
procedure TStrings.Append(const S: string);
begin
Add(S);
end;

function TStrings.Add(const S: string): Integer;
begin
Result := GetCount;//TStrings->function GetCount: Integer; virtual; abstract;
Insert(Result, S); //TStrings->
end;

在 TStrings 中的宣告:
function GetCount: Integer; virtual; abstract;
procedure Insert(Index: Integer; const S: string); virtual; abstract;

所以上面兩個 function, 在 TRichEditStrings = class(TStrings) 中被改寫,

如下所示:

function TRichEditStrings.GetCount: Integer;
begin
(略)
end;

procedure TRichEditStrings.Insert(Index: Integer; const S: string);
begin
(略)
end;

我的想法是寫以下四個, DO_* function 來 Trace.
結果Exception 出現在

XXXX := Length(Str);
if RichEdit.SelStart <> (Selection.cpMax XXXX) then
raise EOutOfResources.Create(sRichEditInsertError);

觀察Exception 發生時,
XXXX = 6;
RichEdit.SelStart = 15;
Selection.cpMax = 11;

[/code]


[code delphi]
unit fMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
RichEdit1: TRichEdit;
procedure Button1Click(Sender: TObject);
public
procedure DO_Append(RichEdit: TRichEdit; const S: string);
function DO_Add(RichEdit: TRichEdit; const S: string): Integer;
function DO_GetCount(RichEdit: TRichEdit): Integer;
procedure DO_Insert(RichEdit: TRichEdit; Index: Integer; const S: string);
end;

var
Form1: TForm1;

implementation
{$R *.dfm}
{ TForm1 }
resourcestring
sRichEditInsertError = 'RichEdit line insertion error';
const
EM_EXSETSEL = WM_USER 55;

type
TCharRange = record
cpMin: Longint;
cpMax: LongInt;
end;

procedure TForm1.DO_Insert(RichEdit: TRichEdit; Index: Integer; const S: string);
var
L: Integer;
Selection: TCharRange;
Fmt: PChar;
Str: string;
XXXX: Integer;
begin
if Index >= 0 then
begin
Selection.cpMin := SendMessage(RichEdit.Handle, EM_LINEINDEX, Index, 0);
if Selection.cpMin >= 0 then Fmt := '%s'#13#10
else begin
Selection.cpMin :=
SendMessage(RichEdit.Handle, EM_LINEINDEX, Index - 1, 0);
if Selection.cpMin < 0 then Exit;
L := SendMessage(RichEdit.Handle, EM_LINELENGTH, Selection.cpMin, 0);
if L = 0 then Exit;
Inc(Selection.cpMin, L);
Fmt := #13#10'%s';
end;
Selection.cpMax := Selection.cpMin;
SendMessage(RichEdit.Handle, EM_EXSETSEL, 0, Longint(@Selection));
Str := Format(Fmt, [S]);
SendMessage(RichEdit.Handle, EM_REPLACESEL, 0, LongInt(PChar(Str)));

//Exception occur here.
XXXX := Length(Str);
if RichEdit.SelStart <> (Selection.cpMax XXXX) then
raise EOutOfResources.Create(sRichEditInsertError);


end;
end;
function TForm1.DO_GetCount(RichEdit: TRichEdit): Integer;
begin
Result := SendMessage(RichEdit.Handle, EM_GETLINECOUNT, 0, 0);
if SendMessage(RichEdit.Handle, EM_LINELENGTH, SendMessage(RichEdit.Handle,
EM_LINEINDEX, Result - 1, 0), 0) = 0 then Dec(Result);
end;
procedure TForm1.DO_Append(RichEdit: TRichEdit; const S: string);
begin
DO_Add(RichEdit, S);
end;
function TForm1.DO_Add(RichEdit: TRichEdit; const S: string): Integer;
begin
Result := DO_GetCount(RichEdit);
DO_Insert(RichEdit, Result, S);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
DO_Append(RichEdit1, 'ˋˊ');
end;
end.
[/code]

wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-03 17:28:08 IP:61.222.xxx.xxx 訂閱
要不然就這樣。
RichEdit1.SelText := 'ˋˊ'#13#10;

TMemo(RichEdit1).Lines.Append('ˋˊ');

JOW 兄
提供方法很辛苦,不失為研究及學習事件本質。
只能說 JOW 太努力了。這種人才不當版主太可惜。
zenokuao
一般會員


發表:1
回覆:1
積分:0
註冊:2004-05-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-03 17:33:34 IP:61.218.xxx.xxx 訂閱
哈哈  感謝兩位的回答,與努力除錯,使我的問題能夠解決 ^_^
不過很抱歉,答案好像只能指定一個人,本來我是打算全選的....
編輯記錄
zenokuao 重新編輯於 2007-10-03 17:35:45, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-10-03 17:36:41 IP:122.124.xxx.xxx 未訂閱
對呀,JOW前輩不當板主實在太可惜了><...


===================引 用 wameng 文 章===================
要不然就這樣。
RichEdit1.SelText := 'ˋˊ'#13#10;

TMemo(RichEdit1).Lines.Append('ˋˊ');

JOW 兄
提供方法很辛苦,不失為研究及學習事件本質。
只能說 JOW 太努力了。這種人才不當版主太可惜。
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-10-03 17:50:25 IP:220.130.xxx.xxx 訂閱
對呀,JOW前輩不當板主實在太可惜了><...

x2

===================引 用 taishyang 文 章===================
對呀,JOW前輩不當板主實在太可惜了><...


===================引 用 wameng 文 章===================
要不然就這樣。
RichEdit1.SelText := 'ˋˊ'#13#10;

TMemo(RichEdit1).Lines.Append('ˋˊ');

JOW 兄
提供方法很辛苦,不失為研究及學習事件本質。
只能說 JOW 太努力了。這種人才不當版主太可惜。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-10-03 17:55:37 IP:123.193.xxx.xxx 訂閱
啊, 我以為提問的人想知道原因,
還好只是張張貼貼了一下而已,
那些都是 Vcl 的 source code啦.

嗯, 最近真的比較辛苦, 趁專案空檔, 把
D7和BCB6裝起來,練習練習!!!
系統時間:2024-05-04 6:33:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!