Try&Error 付箋アプリを作ってみる stickies (7)

WordWrap:=Trueの時に、カーソルのある行の文字列(行頭から改行まで)を取り出すのはどうするんでしょうか?
Memo1.Lines[カーソル行] だと、画面表示上の1行分の文字列になってしまいます。

URLをメモってたけど関係あるかな。
Delphi Tips - メモコンポーネントとメッセージ:[2012/05/07]
旧Delphi FAQ:[2012/05/07]
くだすれDelphi(超初心者用)その24:[2012/05/08]
>73 :デフォルトの名無しさん:2005/05/11(水) 22:51:51
>>>70
>この問題と関係あるか分らないけど、TMemo.Lines.Strings[i] は
>呼ばれるたびにメッセージ送って取得してるから、文字列の実体が静的に存在してない。
>だからポインタだけ取って置くのは危険。
>ローカル変数に移してからやったほうがイイ。

***
今気づいたけど、画面のサイズ変更とかそんなのより、入力した時のチラツキがかなり鬱陶しい。
原因判明です。
procedure TMemoEx.Change;
begin
//Invalidate;
inherited;
end;

Changeイベントで、Invalidate;してたのをコメントアウトしたら一気に解決。強調表示とかしてるといるのかもしれないけど、今のところ不要でした。

あと、constructorでCreateして、destructorでFreeするFCanvas: TCanvas; を用意して
procedure TMemoEx.WMPaint(var Message: TWMPaint);
begin
Brush.Color := clSkyBlue;
FCanvas.Handle := Message.DC;
FCanvas.FillRect(ClientRect);
inherited;
end;

としてやると、ちらつきも悪化するわけでもなく、周囲の塗り残しが少し減ります。幸せ。

ついでに、いくつかのメッセージイベントで、Invalidate;してるのを全部やめてみた。inherited;のみにしたけど、特に関係無し。そりゃそうだ。自前で何にもしてないんだから。
    procedure WMKeyDown (var Message: TWMKeyDown); message WM_KeyDown;
procedure WMHScroll(var Message: TWMScroll); message WM_HSCROLL;
procedure WMVScroll(var Message: TWMScroll); message WM_VSCROLL;
procedure WMSize(var Message: TWMSize); message WM_SIZE;
procedure WMMove(var Message: TWMMove); message WM_MOVE;
procedure WMMousewheel(var Message: TWMMove); message WM_MOUSEWHEEL;


もう、TMemoEx = class(TMemo) などと継承クラスを作る意味があまりなくなってきたわけですけど、現在行とかを取得するメソッドがあるといえばあるので、このまま行くことにします。


付箋アプリに関係ある話とは思えないけど、アプリに使うテキスト表示部分にTMemoを使うということで。
関連記事
スポンサーサイト