C++Builder TMemo の操作

C++Builder

 C++Builder 10.3 Community Edition を使用して、趣味でプログラミングをしていますが、NCデータを扱うソフトを作ってみようと計画しています。
 C++Builderの「Memoコンポーメント」を利用すると、簡易なエディタ的な処理をさせる事ができますが、マウスを使わないでのカーソル操作や選択、検索などの処理をさせたかったので、調べてみたところある程度はできそうです。
関数化したので、覚書きとして、残しておきます。

EMBACADERO サポートサイト

発売元のサポートサイトに情報がありました。
C++Builderがサポートしていない機能は、 Performメソッド を使って、Windowsクラスへのメッセージを利用して実現させるようです。

関数プロトタイプ

上記のメッセージを参考に、関数を作成しました。

 //-----------------------------------------------------------------
 // Memo
 // http://support.embarcadero.com/jp/article/35940
 //---------------------------------------------------------------
 // Memoの行数を返す
 int kMemoLineCount(TCustomMemo *memo);

 // Memoのカーソル行番号を返す
 int kMemoCurrentRowNumber(TCustomMemo *memo);

 // Memoの先頭にカーソルを移動する
 void kMemoMoveTop(TCustomMemo *memo);

 // Memoの指定行番号にカーソルを移動する、省略=トップ
 void kMemoMoveRowNumber(TCustomMemo *memo,int row=1);

 // Memoのカーソル行を指定行だけ下に移動する、省略=1行
 void kMemoMoveDown(TCustomMemo *memo,int number=1);

 // Memoのカーソル行を指定行だけ上に移動する、省略=1行
 void kMemoMoveUp(TCustomMemo *memo,int number=1);

 // Memoの指定行を選択する、省略=トップ
 void kMemoSelectRowNumber(TCustomMemo *memo,int row=1);

 // Memoの指定行の文字数、省略=カレント行
 int kMemoGetCharCount(TCustomMemo *memo,int row=0);

 // Memoのカーソル行の指定位置から指定文字数を選択する、省略=すべて
 void kMemoSelectCurrentRow(TCustomMemo *memo,int start=0,int length=0);

 // Memoの1行下が見えるようにスクロールします。
 void kMemoScrollLineDown(TCustomMemo *memo);

 // Memoの1行下が見えるようにスクロールします。
 void kMemoScrollLineDown(TCustomMemo *memo);

 // Memoの1行上が見えるようにスクロールします
 void kMemoScrollLineUp(TCustomMemo *memo);

 // Memoの1ページ下が見えるようにスクロールします。
 void kMemoScrollPageDown(TCustomMemo *memo);

 // Memoの1ページ上が見えるようにスクロールします。
 void kMemoScrollPageUp(TCustomMemo *memo)
;
 // Memoの左右上下にスクロールさせます。
 void kMemoScrollRowCol(TCustomMemo *memo,int col,int row);

 // Memoのカーソルより次へ文字列を検索します。
 void kMemoSearchNext(TCustomMemo *memo,UnicodeString Key,bool select=true);

 // Memoのカーソルより前方向に文字列を検索します。
 void kMemoSearchPrevious(TCustomMemo *memo,UnicodeString Key,bool select=true);

 // Memoの実際に目にみえている最初の行の行番号を返します(最初の行は0)
 int kMemoGetPageTopRow(TCustomMemo *memo);

 // RichEditの指定行の色を変更する
 TColor kRichEditChangeColor(TRichEdit *richedit,TColor color,int row=1);

関数の実装

 //--------------------------------------------------------------
 //-------- Memo ------------------------
 //-------------------------------------------------------------
 // TMemo の行数
 int kMemoLineCount(TCustomMemo *memo)
 {
     int count = memo->Lines->Count;
     return count;
 }

 // TMemo の現在のカーソル行位置(最初は1)
 int kMemoCurrentRowNumber(TCustomMemo *memo)
 {
     int row = memo->Perform(EM_LINEFROMCHAR,-1,0)+1;
     return row;
 }

 // Memoの先頭にカーソルを移動する
 void kMemoMoveTop(TCustomMemo *memo)
 {
     memo->SelStart = memo->Perform(EM_LINEINDEX,0,0);
 }

 // Memoの指定行番号にカーソルを移動する、省略=トップ
 void kMemoMoveRowNumber(TCustomMemo *memo,int row)
 {
     memo->SelStart = memo->Perform(EM_LINEINDEX,row-1,0);
     memo->SetFocus();
 }

 // Memoのカーソル行を指定行だけ下に移動する、省略=1行
 void kMemoMoveDown(TCustomMemo *memo,int number)
 {
     int current = kMemoCurrentRowNumber(memo);
     kMemoMoveRowNumber(memo,current+number);
 }

 // Memoのカーソル行を指定行だけ上に移動する、省略=1行
 void kMemoMoveUp(TCustomMemo *memo,int number)
 {
     int current = kMemoCurrentRowNumber(memo);
     kMemoMoveRowNumber(memo,current-number);
 }

 // Memoの指定行を選択する、省略=トップ
 void kMemoSelectRowNumber(TCustomMemo *memo,int row)
 {
     int count = memo->Lines->Count;
     if(count<1) return;    
     UnicodeString str = memo->Lines->Strings[row-1];
     int len = str.Length();
     kMemoMoveRowNumber(memo,row);
     memo->SelLength = len;
 }

 // Memoの指定行の文字数、省略=カレント行
 int kMemoGetCharCount(TCustomMemo *memo,int row)
 {
     int rength = 0;
     if(row == 0){
         row = kMemoCurrentRowNumber(memo);
     }
     if(row>0){
         rength = memo->Lines->Strings[row-1].Length();
     }
     return rength;
 }

 // Memoのカーソル行の指定位置から指定文字数を選択する、省略=すべて
 void kMemoSelectCurrentRow(TCustomMemo *memo,int start,int length)
 {
     if(start==0 && length==0){
         kMemoSelectRowNumber(memo);
         return;
     }
     int row = kMemoCurrentRowNumber(memo);
     int len = kMemoGetCharCount(memo,row);
     kMemoMoveRowNumber(memo,row);
     if((start+length)>len){
         length = len-start+1;
     }
     memo->SelStart += (start-1);
     memo->SelLength = length;
 }

 // Memoの1行下が見えるようにスクロールします。
 void kMemoScrollLineDown(TCustomMemo *memo)
 {
     memo->Perform(EM_SCROLL, SB_LINEDOWN, 0);
 }

 // Memoの1行上が見えるようにスクロールします
 void kMemoScrollLineUp(TCustomMemo *memo)
 {
     memo->Perform(EM_SCROLL, SB_LINEUP, 0);
 }

 // Memoの1ページ下が見えるようにスクロールします。
 void kMemoScrollPageDown(TCustomMemo *memo)
 {
     memo->Perform(EM_SCROLL, SB_PAGEDOWN, 0);
 }

 // Memoの1ページ上が見えるようにスクロールします。
 void kMemoScrollPageUp(TCustomMemo *memo)
 {
     memo->Perform(EM_SCROLL, SB_PAGEUP, 0);
 }

 // Memoの上下左右にスクロールさせます。
 void kMemoScrollRowCol(TCustomMemo *memo,int row,int col)
 {
     memo->Perform(EM_LINESCROLL, row, col);
 }

 // Memoの実際に目にみえている最初の行の行番号を返します(最初の行は1)
 int kMemoGetPageTopRow(TCustomMemo *memo)
 {
     int row = memo->Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
     return row+1;
 }

 // Memoのカーソルより次へ文字列を検索します。
 void kMemoSearchNext(TCustomMemo *memo,UnicodeString Key,bool select)
 {
     int count = memo->Lines->Count;
     int current = kMemoCurrentRowNumber(memo);
     UnicodeString str;
     int pos;
     int len = Key.Length();
     for(int i= current;iLines->Strings[i];
         pos = str.Pos(Key);
         if(pos){
             kMemoMoveRowNumber(memo,i+1);
             if(select){
                 kMemoSelectCurrentRow(memo,pos,len);
             }
             break;
         }
     }
 }

 // Memoのカーソルより手前に文字列を検索します。
 void kMemoSearchPrevious(TCustomMemo *memo,UnicodeString Key,bool select)
 {
     int count = memo->Lines->Count;
     int current = kMemoCurrentRowNumber(memo)-1;
     UnicodeString str;
     int pos;
     int len = Key.Length();
     for(int i= current;i>=0;i--){
         str = memo->Lines->Strings[i-1];
         pos = str.Pos(Key);
         if(pos){
             kMemoMoveRowNumber(memo,i);
             if(select){
                 kMemoSelectCurrentRow(memo,pos,len);
             }
             break;
         }
     }
 }

 // RichEditの指定行の色を変更する
 TColor kRichEditChangeColor(TRichEdit *redit,TColor color,int row)
 {
     TColor cl = redit->SelAttributes->Color;
     kMemoSelectRowNumber(redit,row);
     redit->SelAttributes->Color = color;
     redit->SelLength = 0;
   return cl;
 }

完成

とりあえず、作ってみましたが、簡単にしか検証していません。
もし、使用する場合には、ご注意ください。

コメント

タイトルとURLをコピーしました