疑似delphi richedit 的 bug ...?? |
答題得分者是:wameng
|
zenokuao
一般會員 發表:1 回覆:1 積分:0 註冊:2004-05-20 發送簡訊給我 |
剛剛發現在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 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
不知道這樣模擬測試可不可行?
[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 發送簡訊給我 |
|
zenokuao
一般會員 發表:1 回覆:1 積分:0 註冊:2004-05-20 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
對呀,JOW前輩不當板主實在太可惜了><...
x2 ===================引 用 taishyang 文 章=================== 對呀,JOW前輩不當板主實在太可惜了><... ===================引 用 wameng 文 章=================== 要不然就這樣。 RichEdit1.SelText := 'ˋˊ'#13#10; 或 TMemo(RichEdit1).Lines.Append('ˋˊ'); JOW 兄 提供方法很辛苦,不失為研究及學習事件本質。 只能說 JOW 太努力了。這種人才不當版主太可惜。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |