記事カテゴリ

ユーザー機能


 2022年8月17日(水) 09:35 JST

[Delphi] TMemoで、先頭行/最終行/指定行へ移動する

  • 投稿者:
  • 表示回数
    19,965

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で、先頭行/最終行/指定行へ移動する

トラックバック

このエントリのトラックバックURL:
https://www.blackcat.xyz/trackback.php/ProgramingFAQ_del0006

以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。