<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>RichEdit | じじぃの引出し</title>
	<atom:link href="https://www.kazuban.com/blog/tag/richedit/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.kazuban.com/blog</link>
	<description>なにかしら、皆さんの参考になれば幸いです！</description>
	<lastBuildDate>Tue, 24 Dec 2024 08:51:32 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://www.kazuban.com/blog/wp-content/uploads/2020/05/cropped-ICON-1-32x32.png</url>
	<title>RichEdit | じじぃの引出し</title>
	<link>https://www.kazuban.com/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>C++Builder TMemo の操作</title>
		<link>https://www.kazuban.com/blog/cbuilder-tmemo/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Wed, 01 Jan 2020 05:58:42 +0000</pubDate>
				<category><![CDATA[C++Builder]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[RichEdit]]></category>
		<category><![CDATA[TMemo]]></category>
		<category><![CDATA[カーソル操作]]></category>
		<category><![CDATA[行選択]]></category>
		<category><![CDATA[覚書]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=1606</guid>

					<description><![CDATA[&#160;C++Builder 10.3 Community Edition を使用して、趣味でプログラミングをしていますが、ＮＣデータを扱うソフトを作ってみようと計画しています。 &#160;C++Builderの「 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">&nbsp;C++Builder 10.3 Community Edition を使用して、趣味でプログラミングをしていますが、ＮＣデータを扱うソフトを作ってみようと計画しています。<br> &nbsp;C++Builderの「Memoコンポーメント」を利用すると、簡易なエディタ的な処理をさせる事ができますが、マウスを使わないでのカーソル操作や選択、検索などの処理をさせたかったので、調べてみたところある程度はできそうです。<br>関数化したので、覚書きとして、残しておきます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">EMBACADERO サポートサイト</a></li><li><a href="#toc2" tabindex="0">関数プロトタイプ</a></li><li><a href="#toc3" tabindex="0">関数の実装</a></li><li><a href="#toc4" tabindex="0">完成</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1"><a href="http://support.embarcadero.com/jp/article/35940"><span style="color:Blue">EMBACADERO サポートサイト</span></a></span></h2>



<p class="wp-block-paragraph"><a href="http://support.embarcadero.com/jp/article/35940">発売元のサポートサイト</a>に情報がありました。<br>C++Builderがサポートしていない機能は、 Performメソッド を使って、Windowsクラスへのメッセージを利用して実現させるようです。</p>



<h2 class="wp-block-heading"><span id="toc2">関数プロトタイプ</span></h2>



<p class="wp-block-paragraph">上記のメッセージを参考に、関数を作成しました。</p>



<pre class="wp-block-preformatted"> //-----------------------------------------------------------------
 // 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のカーソル行を指定行だけ下に移動する、省略＝１行
 void kMemoMoveDown(TCustomMemo *memo,int number=1);

 // Memoのカーソル行を指定行だけ上に移動する、省略＝１行
 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);
</pre>



<h2 class="wp-block-heading"><span id="toc3">関数の実装</span></h2>



<pre class="wp-block-preformatted"> //--------------------------------------------------------------
 //-------- Memo ------------------------
 //-------------------------------------------------------------
 // TMemo の行数
 int kMemoLineCount(TCustomMemo *memo)
 {
     int count = memo-&gt;Lines-&gt;Count;
     return count;
 }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 // Memoのカーソルより次へ文字列を検索します。
 void kMemoSearchNext(TCustomMemo *memo,UnicodeString Key,bool select)
 {
     int count = memo-&gt;Lines-&gt;Count;
     int current = kMemoCurrentRowNumber(memo);
     UnicodeString str;
     int pos;
     int len = Key.Length();
     for(int i= current;iLines-&gt;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-&gt;Lines-&gt;Count;
     int current = kMemoCurrentRowNumber(memo)-1;
     UnicodeString str;
     int pos;
     int len = Key.Length();
     for(int i= current;i&gt;=0;i--){
         str = memo-&gt;Lines-&gt;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-&gt;SelAttributes-&gt;Color;
     kMemoSelectRowNumber(redit,row);
     redit-&gt;SelAttributes-&gt;Color = color;
     redit-&gt;SelLength = 0;
   return cl;
 }</pre>



<h2 class="wp-block-heading"><span id="toc4">完成</span></h2>



<p class="wp-block-paragraph">とりあえず、作ってみましたが、簡単にしか検証していません。<br>もし、使用する場合には、ご注意ください。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
