Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


Delphi TMemoのカーソル位置の変更

TMemoにデータを追加するには、ファイルを読み込んだり、Addを行うなどの方法があります。

今回はこのタイミングでカーソル位置を調整するテクニックをご紹介いたします。


例えばMemo1にプログラム内でデータを追加する場合は以下のような
ロジックがありますが、このどちらの方法でも処理後にカーソルは最終行になります。

  //(ファイルの読み込み)
    Memo1.Lines.LoadFromFile('Test.txt');

  //(Add)
    Memo1.Lines.Add('AAA');
    Memo1.Lines.Add('BBB');
    Memo1.Lines.Add('CCC');

 

行位置の変更を行いたい場合ですが、
TMemoにはそのためのプロパティやメソッドが用意されていません。
しかし、Windowsメッセージを渡すことで可能です。

Performの引数の2番目が移動先の行番号になりますので、先頭であれば0を指定します。

もしスクロールバーがあるのであれば、そちらも先頭に位置づける必要があります。
それぞれ以下のように記述します。

  //(例)
    Memo1.SelStart := Memo1.Perform(EM_LINEINDEX, 0, 0); // 1:カーソルを先頭に
    Memo1.Perform(WM_VSCROLL,SB_TOP,0);                  // 2:スクロールを先頭に
    Memo1.SetFocus;                                      // 3:フォーカスセット

 

上記の例では先頭にカーソルをセットするロジックため、
「1:」の箇所で単純にSelStartに0を代入することでも同じ結果が得られます。

応用として、TEditと同じようにSelStartとSelLengthを組み合わせることで、
特定の位置を選択状態にすることも可能です。

例えば4行目の3~5文字目を選択状態にしたい場合は以下のように記述します。
行の途中にカーソルセットする場合は以下のように文字数を加算します。
(こちらも0始まりのため、3文字目であれば2を足します)

  //(例)
    Memo1.SelStart  := Memo1.Perform(EM_LINEINDEX, 3, 0) + 2; // 選択開始位置にカーソルセット
    Memo1.SelLength := 3;                                     // 3文字分を選択
    Memo1.Perform(WM_VSCROLL,SB_TOP,0);                       // スクロールを先頭に
    Memo1.SetFocus;                                           // フォーカスセット

※Delphi/400 V2007以前ではSelStart・SelLengthが文字数ではなくバイト数で計算されるため、
 バイト数単位で計算するよう記述する必要があります。

 

 

(ミガロ.情報マガジン「MIGARO News!!」Vol.133 2011年12月号より)