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月号より)