線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1487
推到 Plurk!
推到 Facebook!

SynEdit元件不使用Highlighters元件有辦法變更顏色嗎

尚未結案
yachu721
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-12-10 07:57:00 IP:59.105.xxx.xxx 未訂閱
請問大大們 因為我只要變更文字中"X"的顏色 但Highlighters似乎沒有此功能 所以想請教SynEdit不使用Highlighters 是否有辦法變更顏色 還是有其他元件可使用呢 不考慮RichEdit 因為RichEdit讀取檔案及變更顏色實在太慢了 類似 lcsboy版主大人的SNotePad的功能 http://delphi.ktop.com.tw/topic.php?topic_id=22436 在其中lcsboy版主大人展示了幾種不同的顏色辦更
RedSnow
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-12-10 17:49:02 IP:61.217.xxx.xxx 未訂閱
yachu721 您好:    由 lcsboy 版主發表的作品 Special NotePad,應該也是使用 RichEdit 製作的,您可以在該篇較稍後的幾個討論中看到有討論到 RichEdit 3.0,至於 RichEdit 顯示速度的問題,您可以複習一下原先我們曾討論過的那一篇: RichEdit 文字變色問題 http://delphi.ktop.com.tw/topic.php?topic_id=73302 另外有關 SynEdit 的 Highlighters 問題,SynEdit 有提供開放介面,如果您對 Delphi 有一點點的瞭解,那麼或許您可以參考 SynEdit 的 SynHighlighter*.pas 原始碼試著自行製作 Highlighters 來配合使用。 如果上述作法仍無法滿足您的需求,那麼您若能明確的描述一下您打算在什麼地方、什麼時機使用到 "變色" 功能的話 (是否需要像 Memo 元件一樣的上下瀏覽內容?是否僅需像 Edit 元件一樣顯示單行字樣?....等等),或許有其它方式可以達到您得需求也說不定。 7 天天敲鍵盤 v 時時按滑鼠 8
yachu721
初階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-12-10 19:46:54 IP:218.32.xxx.xxx 未訂閱
RedSnow 大大您好
引言: 由 lcsboy 版主發表的作品 Special NotePad,應該也是使用 RichEdit 製作的,您可以在該篇較稍後的幾個討論中看到有討論到 RichEdit 3.0,至於 RichEdit 顯示速度的問題,您可以複習一下原先我們曾討論過的那一篇: RichEdit 文字變色問題 http://delphi.ktop.com.tw/topic.php?topic_id=73302
在先前討論中 andychang1690前輩的方法 確實提高不少效率 但是總必須在拖拉ScrollBar後等1~2秒才會完成 所以才想是否還有其他解決方案
引言: 另外有關 SynEdit 的 Highlighters 問題,SynEdit 有提供開放介面,如果您對 Delphi 有一點點的瞭解,那麼或許您可以參考 SynEdit 的 SynHighlighter*.pas 原始碼試著自行製作 Highlighters 來配合使用。
對DELPHI,小弟沒有接觸過,所以~~~
引言: 如果上述作法仍無法滿足您的需求,那麼您若能明確的描述一下您打算在什麼地方、什麼時機使用到 "變色" 功能的話 (是否需要像 Memo 元件一樣的上下瀏覽內容?是否僅需像 Edit 元件一樣顯示單行字樣?....等等),或許有其它方式可以達到您得需求也說不定。
小弟的需求如下 讀取約1MB的文字檔 文字檔中包含了一堆的座標點 P1X254.153Y254.154Z254.478 P2X852.25Y458.48Z48.254 . . . P85672X114.524Y45.00Z745.514 文件必須像Memo一樣的上下瀏覽 因為一堆座標點看起來實在雜亂無章 為了讓使用者可以一目了然 所以要將P X Y Z 變色 曾經使用SynEdit中的SynGeneralSyn元件 但是必須為單一一個英文字的時候才可以 所以也是不行 不知是否還有其他方案
RedSnow
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-12-10 21:14:10 IP:61.230.xxx.xxx 未訂閱
yachu721 您好:    依據您的需求來看,您可以用 PaintBox 來做一個顯示的介面,速度應該能讓您滿意的,給您一個範例如下,您參考一下吧:
  1. 請設置一個 PaintBox 命名為 PaintBox1,放到您想要顯示資料的位置。
  2. 設置兩個 ScrollBar,ScrollBar1 的 Kind 屬性設為 sbVertical,ScrollBar2 的 Kind 屬性設為 sbHorizontal,分別放置於 PaintBox1 的右邊與下方。
  3. 設置一個按鈕 Button1 作為載入檔案的處理。
  4. 在 .cpp 檔案中做下列設定:
    // 全域變數
    int FLineHeight;    // 假設 PaintBox 的下層是 Panel1 元件
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
        Panel1->DoubleBuffered = true;  // 避免或減少 PaintBox 重繪動作時的閃爍現象
    }    // 建立 Button1 的 OnClick 事件處理程序如下:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        if(!FLines){
            FLines = new TStringList;
        }        FLines->LoadFromFile("C:\\test.txt");  // 載入要顯示內容的文字檔        Canvas->Font->Assign(PaintBox1->Font);
        FLineHeight = Canvas->TextHeight('龘');  // 隨便找一個筆劃較多字樣的高度來當作行高        ScrollBar1->Position = 0;
        ScrollBar1->Max = FLines->Count;
        ScrollBar1->SmallChange = 1;        if(FLineHeight > 0){
            ScrollBar1->LargeChange = ((PaintBox1->Height / FLineHeight) - 1);
            ScrollBar1->PageSize = ScrollBar1->LargeChange;
        }        PaintBox1->Invalidate();
    }    // 建立 PaintBox1 的 OnPaint 事件處理程序如下:
    void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
    {
        PaintBox1->Canvas->Brush->Color = clWindow;
        PaintBox1->Canvas->Brush->Style = bsSolid;
        PaintBox1->Canvas->FillRect(ClientRect);        if (FLines) {
            int nLine, nLen, nLeft, nRow, nCol;
            AnsiString currLine, currChar;
            nLine = ScrollBar1->Position;
            nLeft = ScrollBar2->Position 1;
            nRow = 0;
            PaintBox1->Canvas->Brush->Style = bsClear;
            while (nRow < PaintBox1->ClientHeight && nLine < FLines->Count) {
                nLen = FLines->Strings[nLine].Length();
                currLine = FLines->Strings[nLine].SubString(nLeft, nLen-(nLeft-1));
                nCol = 2;
                for (int i=1; i<=currLine.Length(); i  ) {
                    currChar = currLine.SubString(i, 1);  // 取得應顯示的字元
                    if (AnsiString("PXYZ").Pos(currChar) > 0) {  // 如果是 PXYZ 其中的一個字元,就使用紅色
                        PaintBox1->Canvas->Font->Color = clRed;
                    } else {  // 否則就使用黑色
                        PaintBox1->Canvas->Font->Color = clBlack;
                    }
                    PaintBox1->Canvas->TextOut(nCol, nRow, currChar);  // 顯示字元
                    nCol  = PaintBox1->Canvas->TextWidth(currChar);  // 下一個字元的顯示位置
                }
                nLine  ;  // 下一行資料的索引值
                nRow  = FLineHeight;  // 下一行的顯示位置
            }
        }
    }    // 建立 ScrollBar1 的 OnChange 事件處理程序如下:
    void __fastcall TForm1::ScrollBar1Change(TObject *Sender)
    {
        PaintBox1->Invalidate();
    }    // 建立 ScrollBar2 的 OnChange 事件處理程序如下:
    void __fastcall TForm1::ScrollBar2Change(TObject *Sender)
    {
        PaintBox1->Invalidate();
    }
以上範例僅供參考,請按照您的需求來修改它。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/12/10 21:15:37
yachu721
初階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-12-10 22:08:44 IP:218.32.xxx.xxx 未訂閱
RedSnow大大您好 首先感謝您抽空回答.. 我有依您的程式碼測試過了 顯示速度上完全沒有問題 格式也完全正確 但還有一個問題 因為我知道RedSnow大大花了時間在這題上 希望RedSnow大大別生氣 因為我沒講清楚我的需求 除了瀏覽以外 還需像Memo RichEdit SynEdit一樣是可編輯內容的 不知PaintBox是否可以編輯內容 發表人 - yachu721 於 2005/12/10 22:37:54
RedSnow
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-12-11 01:00:44 IP:59.115.xxx.xxx 未訂閱
yachu721 您好:
引言:除了瀏覽以外 還需像Memo RichEdit SynEdit一樣是可編輯內容的 不知PaintBox是否可以編輯內容
PaintBox 是無法像 Edit 物件般直接進行編輯動作的,其實 Edit 物件的顯示動作也是使用著和我那個範例類同的方式,只不過它們都已經包裝了編輯的動作在內,您也可以另外再加上編輯的動作來配合我那個範例一起運作,不過這個工程可能就比較大了些 (差不多是等於另外做一個類似 SynEdit 的元件),我手邊沒有現成的範例,否則就可以提供給您參考了。 您不妨將兩個動作分開處理,顯示的歸顯示、編輯歸編輯,當您要顯示資料時,就使用我那個範例的方式來顯示,要編輯資料時,就叫出 Memo 或 RichEdit 來處理,編輯完畢之後仍交給 PaintBox 來顯示,參考看看吧。 7 天天敲鍵盤 v 時時按滑鼠 8
yachu721
初階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-12-11 07:43:36 IP:218.32.xxx.xxx 未訂閱
引言: 您不妨將兩個動作分開處理,顯示的歸顯示、編輯歸編輯,當您要顯示資料時,就使用我那個範例的方式來顯示,要編輯資料時,就叫出 Memo 或 RichEdit 來處理,編輯完畢之後仍交給 PaintBox 來顯示,參考看看吧。
感謝RedSnow前輩 能夠顯示這麼快 已經解決我長久以來顯示的問題了 兩個動作分開來做也是很不錯的建議 已經可以讓使用者一目了然又快速 那我就朝著這個方向去設計 再次感謝您又麻煩您了
系統時間:2024-04-20 12:52:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!