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

RichEdit 文字變色問題

尚未結案
yachu721
初階會員


發表:51
回覆:98
積分:44
註冊:2003-07-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-16 00:06:41 IP:59.104.xxx.xxx 未訂閱
我使用RichEdit來讓顏色區分 以下程式是主要將數字的部分以顏色區分 我要將檔案呼叫進來後才開始執行 但是當檔案較大時卻是非常非常的慢 是否有其他方法呢        
 
int i,j,k = 0;
    char Text[80];        for( i = 0; i < RichEdit1->Lines->Count; i  )
    {
        strcpy(Text,R1->Lines->Strings[i].c_str());
        for ( j = 0; j < strlen(Text); j   )
        {
            if ( isdigit(Text[j]) )
            {
                RichEdit1->SelStart = k   j;
                RichEdit1->SelLength = 1;
                RichEdit1->SelAttributes->Color = clBlue;
            }
        }
        k  = strlen(Text)   2;// 2 => /r/n
    }    
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-16 01:18:28 IP:219.137.xxx.xxx 未訂閱
yachu721 您好:    在處理 RichEdit 物件之前後分別加上 BeginUpdate 與 EndUpdate 敘述,應該會讓您的處理速度節省一些,例如:
RichEdit1->Lines->BeginUpdate();
RichEdit1->Lines->LoadFromFile("C:\\temp.txt");    .... 其它的處理動作 ....    RichEdit1->Lines->EndUpdate();
如果您要處理的檔案非常大的話,那可能還是得設法突破傳統方式來處理,我的印象中好像看過類似的討論,說是可以將資料分段處理,意思是說 "位於顯示區域的資料才做處理",當檔案載入後,先處理 "第一頁" 的顯示資料,當捲動畫面資料時,再處理新顯示頁面上的資料,然後依此類推....,但是我手邊沒有具體的程式碼,看看有無其他有經驗的人能提供這樣子的範例? 另外您可否說明一下您使用 RichEdit 以不同顏色標示數字的 "用途" 為何?如果僅僅是供顯示之用,或許可以有其它的替代方案能取得更好的效率也說不定。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/06/16 02:22:15
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-16 02:51:24 IP:221.169.xxx.xxx 未訂閱
yachu721:先朝改善你程式撰寫方式著手。
你的程式我載入一RTF檔206K需時4.22~4.33秒。
只要改成以下:
int k=0,r,q=RichEdit1->Lines->Count;
AnsiString S;
char Text[256];
for( int i = 0; i < q; i  )  {
  S= RichEdit1->Lines->Strings[i];
  strcpy(Text,S.c_str());
  r=strlen(Text);
  for ( int j = 0; j < r; j   )  {
    if ( isdigit(Text[j]) )      {
       RichEdit1->SelStart = k   j-2;
       RichEdit1->SelLength = 1;
       RichEdit1->SelAttributes->Color = clBlue;
    }
  }
  k  = r   2;// 2 => /r/n
}
需時3.26~3.36秒約快了一秒鐘!
如果改成以下:
int r;
AnsiString S;
S=RichEdit1->Text;
r=S.Length();
for (int i=1;i<=r;i  ) {
  if ( isdigit(S[i]) )      {
     RichEdit1->SelStart = i-1;
     RichEdit1->SelLength = 1;
     RichEdit1->SelAttributes->Color = clBlue;
  }
}
需時3.34~3.41秒!    請參考!
Andy Chang
------
Andy Chang
yachu721
初階會員


發表:51
回覆:98
積分:44
註冊:2003-07-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-16 18:22:47 IP:59.104.xxx.xxx 未訂閱
我的程式全部都是座標點 如下面的格式 X179.839Y-17.725 X122.273Y-14.251 我想要把數字的部分變顏色 或把固定的英文保留字變色 但以上面的方法還是非常的慢 我的檔案大約有10mb大 是否有其他方法呢 有些軟體只要四五秒 該如何做呢 實在是太難了 想到頭痛 哈哈哈...
yachu721
初階會員


發表:51
回覆:98
積分:44
註冊:2003-07-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-17 01:00:24 IP:59.104.xxx.xxx 未訂閱
感謝 RedSnow 及andychang1690 大大的回答 目前又試了一個元件synedit 速度增快許多 但又遇到了問題 真是的..............
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-17 05:56:05 IP:221.169.xxx.xxx 未訂閱
我想到一個方法,會何不僅處理RichEdit畫面出現的部分!
花一個晚上!目前僅控制ScrollBar。其它請自己試試。
有些部分還有改進空間!
其中有參考
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=61986
【BCB】【問題】有關RichEdit上的捲軸問題
答題得分者為:rogan321    開一個專案,Button,RichEdit,OpenDialog各一個!    Unit1.h
private:        // User declarations
  AnsiString RichText;
  int RichLen;
  TWndMethod RichEdit1ScrollBar;
  void __fastcall RichEdit1ScrollBarWinProcs(TMessage &Mes);
  void __fastcall HLClick();
Unit1.cpp    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int tmp1=-1;
int iVPos1=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  RichEdit1ScrollBar=RichEdit1->WindowProc;
  RichEdit1->WindowProc=RichEdit1ScrollBarWinProcs;
}
//---------------------------------------------------------------------------    void __fastcall TForm1::RichEdit1ScrollBarWinProcs(TMessage &Mes)
{
  
  RichEdit1ScrollBar(Mes);
  if(Mes.Msg==WM_VSCROLL)  {
    iVPos1=GetScrollPos(RichEdit1->Handle, SB_VERT); 
    if(tmp1 != iVPos1) {
      HLClick();
      tmp1=iVPos1;
    }
  }
}    void __fastcall TForm1::HLClick()
{
  int first_line,first_add;
  int last_add,last_line;
  TRect Rct;
  // 啟始行
  RichEdit1->Perform(EM_GETRECT,0,(long)&Rct);
  first_line = RichEdit1->Perform(EM_GETFIRSTVISIBLELINE,0,0); //取得可視文件頭行
  Label1->Caption = first_line;
  first_add = RichEdit1->Perform( EM_CHARFROMPOS, 0,(long)&Rct); // 取得可視文件頭行位置
  Label5->Caption = first_add;
  // 結束行
  RichEdit1->Perform(EM_GETRECT,0,(long)&Rct);
  Rct.left =1;
  Rct.Top=Rct.Bottom-2;
  last_add = RichEdit1->Perform( EM_CHARFROMPOS, 0,(long)&Rct);
  last_line = RichEdit1->Perform( EM_LINEFROMCHAR,last_add, 0); // 取得可視文件尾行
  last_add = RichEdit1->Perform( EM_LINEINDEX,last_line, 0);    取得可視文件尾行位置
  // 取得可視文件內容
  RichEdit1->SelStart = first_add;
        // 選取長度
  RichEdit1->SelLength= last_add-first_add 1;
  RichText=RichEdit1->SelText;
  int l=RichText.Length();
  for (int i=1;i<=l;i  ) {
    if ( isdigit(RichText[i]) )      {
      RichEdit1->SelStart = first_add i-1;
      RichEdit1->SelLength = 1;
      if ( RichEdit1->SelAttributes->Color != clBlue)
        RichEdit1->SelAttributes->Color = clBlue;
    }
  }      Application->ProcessMessages(); //看有無其他的指令需執行,以免鎖住    }    由一個Button開啟檔案。  
  if (!OpenDialog1->Execute())
    return ;
  RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName);
  SendMessage(RichEdit1->Handle,WM_VSCROLL,MAKELONG(SB_LINEUP,0),0);  
    
於BCB6 OK!
請參考!    
Andy Chang
------
Andy Chang
yachu721
初階會員


發表:51
回覆:98
積分:44
註冊:2003-07-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-17 08:06:28 IP:59.104.xxx.xxx 未訂閱
謝謝andychang1690大大的回覆 果然使用此方法後 速度提升了許多 因為並不需全部皆改變 真是太強了......
系統時間:2024-05-03 21:54:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!