« ☆メモ上でマウス下のテキスト取得 | トップページ | ☆入力間違いを知らせる一つの方法 »

☆行単位でテキストを取得する。

Memoのテキストをマウス位置で行単位に取得するために、EM_CHARFROMPOS、EM_GETLINEを使えばいいことは知っていました。でもいざ使うとなると、EM_GETLINE部分で、文字化けしたりして、なかなかうまくいかなったので、今更ですが、メモしておきますね。
(Memo1.Linesを行番号で取得しようかと思ったほど、はまっていました。)

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    procedure Memo1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  I, J: Integer;
  Text : array[0..4095] of Char;
  S: String;
begin
   I := HiWord(SendMessage(Memo1.Handle, EM_CHARFROMPOS, 0, MakeLParam(X, Y)));
   Word((@Text)^) := SizeOf(Text);  //←これに注意!
   J := SendMessage(Memo1.Handle, EM_GETLINE, I, Longint(@Text));
   SetString(S, Text, J);
   Edit1.Text := S;
end;

end.

|

« ☆メモ上でマウス下のテキスト取得 | トップページ | ☆入力間違いを知らせる一つの方法 »