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

RichEdit的反白問題

尚未結案
AJCooer
初階會員


發表:48
回覆:52
積分:25
註冊:2004-02-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-13 13:56:57 IP:61.218.xxx.xxx 未訂閱
先進大大們 小弟有一小小的問題 我現在在做Simulator 需要一些功能類似我們再debug時後的功能. 也就是我需要使用RichEdit當成Editor 我的程式功能有單步執行 當每執行到某一行時必須要把RichEdit中的那行反白 或用其他顏色替代 請問各位大大 有哪個方法可以讓我反白(變換顏色)給某一行 若有更好的元件也請不吝賜教 謝謝
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-16 14:02:29 IP:61.63.xxx.xxx 未訂閱
AJCooer你好:               窄看你的題目是要在RichEdit上做出像run程式有bug後出現的那種一條反白,我覺得RichEdit上的反白大部份都是搞selstart、sellength這些東東吧!但是有點不足,比如說下圖" src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=14074684&CC=314776"> 所以覺得上述方式不好的話,可能就要自已用"繪"的了,我覺得啦< >! 也就是說自已劃一條長方形線上去就好啦,只是很多細節就應運而生了。 提供一個普普普的方法(<>注意事項必看< >):

in Unit.h    class TForm1 : public TForm
{
__published:        // IDE-managed Components
        TEdit *Edit1;
        TEdit *Edit2;
        TButton *Button1;
        TRichEdit *RichEdit1;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall RichEdit1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y);
        void __fastcall RichEdit1KeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift);
        void __fastcall FormCreate(TObject *Sender);
private:        // User declarations
        TWndMethod OrgRichEditWndProc;
        void __fastcall RichEditWndProc(TMessage&);
public:                // User declarations
        __fastcall TForm1(TComponent* Owner);
        int __fastcall CheckIfWrong();
};
in Unit.cpp

TForm1 *Form1;    bool FindwWrong=false;
int i=1;    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 OrgRichEditWndProc=RichEdit1->WindowProc;
 RichEdit1->WindowProc=RichEditWndProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RichEditWndProc(TMessage& Message)
{
 OrgRichEditWndProc(Message);     if (Message.Msg==WM_PAINT) {
     Form1->Caption="共重繪了:"+IntToStr(i)+" 次";
     i++;
 }     if (Message.Msg==WM_PAINT && FindwWrong) {         int WrongLine=Form1->CheckIfWrong();
     if (WrongLine==-1)
         return;         int FstVsblLine=SendMessage(RichEdit1->Handle,EM_GETFIRSTVISIBLELINE,0,0);
     int ActualScrnPos=WrongLine-FstVsblLine;         if ((ActualScrnPos>=10) || (FstVsblLine>WrongLine))
         return;         RECT* rect=new RECT;         rect->left=0;
     rect->top=25*(ActualScrnPos);
     rect->right=RichEdit1->Width;
     rect->bottom=25*(ActualScrnPos+1);         Edit1->Text=RichEdit1->Lines->Strings[WrongLine];         DrawCaption(Edit1->Handle,GetDC(RichEdit1->Handle),rect,DC_TEXT | DC_ACTIVE);
     DeleteObject(rect);         return;
 }
}
//---------------------------------------------------------------------------
int __fastcall TForm1::CheckIfWrong()
{
 for (int Cnt=0;Cnt<=RichEdit1->Lines->Count-1;Cnt++) {
      int Leng=RichEdit1->Lines->Strings[Cnt].Length();          if (RichEdit1->Lines->Strings[Cnt]!="" && RichEdit1->Lines->Strings[Cnt].SubString(Leng,1)!=";") {
          return Cnt;
      }
 }     return -1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int WrongLine=Form1->CheckIfWrong();     if (WrongLine==-1)
     return;     Edit2->Text="[C++ Error] Unit1.cpp("+IntToStr(WrongLine)+"): E2379 Statement missing ;";
 int FstVsblLine=SendMessage(RichEdit1->Handle,EM_GETFIRSTVISIBLELINE,0,0);
 int ActualScrnPos=WrongLine-FstVsblLine;
 TPoint NowPos;
 NowPos.x=0;
 NowPos.y=WrongLine;     if (ActualScrnPos>=10)
     SendMessage(RichEdit1->Handle,EM_LINESCROLL,0,WrongLine-(FstVsblLine+9)+5);     if (FstVsblLine>WrongLine)
     SendMessage(RichEdit1->Handle,EM_LINESCROLL,0,WrongLine-FstVsblLine-5);     RichEdit1->CaretPos=NowPos;     FindwWrong=true;
 RichEdit1->Repaint();
 RichEdit1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RichEdit1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
 FindwWrong=false;
 RichEdit1->Repaint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RichEdit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
 FindwWrong=false;
 RichEdit1->Repaint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 RichEdit1->Font->Size=14;     RichEdit1->Top=0;
 RichEdit1->Left=0;
 RichEdit1->Width=500;
 RichEdit1->Height=250;     Edit1->Visible=false;
}
//---------------------------------------------------------------------------
注意事項: (程式特性) 1. 程式模疑complier找出沒有";"做結尾的行列(第一次出現處),將之反白 2. 反白的行列會自動跳至RichEdit可見的地方 3. 此反白在RichEdit接受keyin、mouseclick事件等會自動消失(debug應有特性) 4. 反白在scroll、視窗zoom in、zoom out,maxmize、minmize時不消失(debug所應有特性) (不足處) 1. 字形大小、長方型的大小…目前要take care 2. 反白的顏色不能選擇,反白處的字形變小沒有調回 3. RichEdit做scroll時只有▲和▼能讓反白顯示正常,拖拽條(含mouse滾輪)則異常(如圖)。 (原因:重繪次數過多,見Form1->Caption可知,需再調整) 不足處一者因為我沒時間,二者那些已經是很 >! 發表人 -
AJCooer
初階會員


發表:48
回覆:52
積分:25
註冊:2004-02-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-16 16:53:41 IP:61.218.xxx.xxx 未訂閱
謝謝 m大大 小弟懂了 謝謝
系統時間:2024-07-06 1:32:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!