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