[Delphi] メモの行数を取得で Delphi と Windows API で違いが?

通常 Memo1.Lines.Count というように処理すると思います。実際にデータが入っている行数を取得する分にはこれで十分だと思います。
しかし、最終行に改行コードが入っていると、見た目にはもう一行空行が存在することになります。

たとえば、新規にフォームに追加したTMemoは“Memo1[改行コード]”といったTextを持っています。このとき Memo1.Lines.Count では“1”が取得できますが、Windows API のEM_GETLINECOUNT を使えば、表示しているままの“2”が取得できます。
些細なことかもしれませんが、Memoの行数を制限したい場合などには有効に働きます。

そのほか、コントロールの横幅が内容よりも小さくワードラップする場合には、TMemo の Count プロパティは論理行(エディタ的、改行コード+1)を返すようですが、Windows API を用いると物理行(ワープロ的、見た目どおり)を返すようです。

unit UMemoLine;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
 
TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
   public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Linesで行数取得' + IntToStr(Memo1.Lines.Count));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowMessage('WinAPIで行数取得' + IntToStr(
    SendMessage(Memo1.Handle, EM_GETLINECOUNT, 0, 0)));
end;

end.

コメント (0件)


くろねこ研究所
https://www.blackcat.xyz/article.php/ProgramingFAQ_del0030