16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"TEditorオーナードローサンプル"
この発言に対し以下のコメントが寄せられています
#01277 H-Triton さん RE:TEditorオーナードローサンプル
本田勝彦さんのTEditorコンポーネントでオーナードローを利用して
キャレットがある行のテキストを強調表示するサンプルです。
マウスカーソルの下にある特定の文字を強調表示するなどの応用も
工夫すれば可能です。
// 再描画領域を計算して取得する
function GetInvalidRect(Editor: TEditor; aRow: Integer): TRect;
var
aTop: Integer;
begin
with Editor do
begin
aTop:= TopMargin + RowHeight * aRow;
Result:= Classes.Rect(
LeftMargin, aTop, ClientWidth, aTop + RowHeight - 1);
end;
end;
// キャレットが移動した時に呼び出されるイベント
procedure TForm1.Editor1CaretMoved(Sender: TObject);
const
OldRow: Integer = -1; // 型付定数は静的変数として利用できる
var
iRect: TRect;
begin
// キャレットが行を移動した時だけ処理する
if Editor1.Row <> OldRow then
begin
if OldRow > -1 then
begin
// 以前にキャレットがいた行を通常字体に戻す再描画
iRect:= GetInvalidRect(Editor1, OldRow);
// これはTEditorのメソッドではなくAPIです。
InvalidateRect(Editor1.Handle, @iRect, False);
end;
// 現在キャレットがいる行を強調する再描画
iRect:= GetInvalidRect(Editor1, Editor1.Row);
InvalidateRect(Editor1.Handle, @iRect, False);
OldRow:= Editor1.Row;
end;
end;
// 行単位でテキストをオーナードローするイベント
procedure TForm1.Editor1DrawLine(Sender: TObject; LineStr: String;
X, Y, Index: Integer; ARect: TRect; Selected: Boolean);
begin
// キャレット行が描画される時は Row = Index となる
with Editor1 do if Row = Index then
Canvas.Font.Style:= [fsBold] else Canvas.Font.Style:= [];
Editor1.DrawTextRect(ARect, X, Y, LineStr, ETO_CLIPPED or ETO_OPAQUE);
end;
http://member.nifty.ne.jp/h-triton/
○ 快速・大容量テキストエディタ「えるの〜と」公開中 ○
Avalon's Friendly Crew #80008 H-Triton (^^) since 1996
Original document by H-Triton 氏 ID:(QZV11422)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|