Windows APIをいくつか使って移動行数を計算し移動しています。
- EM_LINEFROMCHAR 現在のカーソル位置を取得するのに使用
- EM_LINESCROLL 行を移動させるのに使用
- EM_GETLINECOUNT TMemoの行数を取得するのに使用
- EM_LINEINDEX 現在のカーソル位置を設定するのに使用
例として先頭行/最終行/指定行に移動するサンプルを示します。
// 先頭行へ procedure TForm1.Button1Click(Sender: TObject); var iLineNow: integer; begin with Memo1 do begin // 現在のカーソルのある行を得る iLineNow := SendMessage(Handle, EM_LINEFROMCHAR, SelStart, 0); // 先頭行へスクロール SendMessage(Handle, EM_LINESCROLL, 0, -iLineNow); // 現在の行数だけ戻る SelStart := 0; SetFocus; end; end; // 最終行へ procedure TForm1.Button2Click(Sender: TObject); var iLineNow: integer; iLineLast: integer; begin with Memo1 do begin iLineNow := SendMessage(Handle, EM_LINEFROMCHAR, SelStart, 0); iLineLast := SendMessage(Handle, EM_GETLINECOUNT, 0, 0); SendMessage(Handle, EM_LINESCROLL, 0, iLineLast - iLineNow); SelStart := SendMessage(Handle, EM_LINEINDEX, iLineLast-1, 0); end; end; // 指定行へ (指定行をEdit1で指定します。) procedure TForm1.Button3Click(Sender: TObject); var iLineNow: integer; iLineTo: integer; begin with Memo1 do begin iLineNow := SendMessage(Handle, EM_LINEFROMCHAR, SelStart, 0); iLineLast := SendMessage(Handle, EM_GETLINECOUNT, 0, 0); iLineTo := StrToInt(Edit1.Text); // 指定行が最終行以降の場合、最終行に移動 if (iLineTo <= iLineLast) then iLineTo := LineLast; SendMessage(Handle, EM_LINESCROLL, 0, iLineTo - iLineNow); SelStart := SendMessage(Handle, EM_LINEINDEX, iLineTo -1, 0); end; end;
サンプルプログラムのダウンロードは→[Delphi FAQ用サンプル] TMemoで、先頭行/最終行/指定行へ移動する
以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。