16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE:TEditorオーナードロー(新)"
この発言は #01378 H-Triton さんのTEditorオーナードロー(新) に対するコメントです
拡張コンポーネントのコードです。説明は親発言を見て下さい。
----------- ここから ----------------
{ TEditor拡張コンポーネント 文字列強調表示 }
unit EditorHt;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
HEditor;
type
TEditorHt = class(TEditor)
private
{ Private 宣言 }
FHiliteWordList: TStrings;
procedure SetHiliteWordList(Value: TStrings);
procedure DrawHiliteWords(S: string; X, Y: Integer; ARect: TRect;
SelectedArea: Boolean);
protected
{ Protected 宣言 }
procedure DoDrawLine(ARect: TRect; X, Y: Integer; LineStr: String;
Index: Integer; SelectedArea: Boolean); override;
public
{ Public 宣言 }
constructor Create( AOwner : TComponent ); override;
destructor Destroy; override;
published
{ Published 宣言 }
property HiliteWordList: TStrings read FHiliteWordList write SetHiliteWordList;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('MyCompo', [TEditorHt]);
end;
// コンストラクタ
constructor TEditorHt.Create(AOwner: TComponent);
begin
inherited Create( AOwner );
FHiliteWordList:= TStringList.Create;
end;
// デストラクタ
destructor TEditorHt.Destroy;
begin
FHiliteWordList.Free;
inherited Destroy;
end;
// プロパティアクセスメソッド
procedure TEditorHt.SetHiliteWordList(Value: TStrings);
begin
if not FHiliteWordList.Equals(Value) then FHiliteWordList.Assign(Value);
end;
// ---------- オーバーライドメソット ------------
// 1行描画・・今後の拡張を考慮してここには実装ルーチンの呼び出し部分のみ
// を記述する。
procedure TEditorHt.DoDrawLine(ARect: TRect; X, Y: Integer; LineStr: String;
Index: Integer; SelectedArea: Boolean);
begin
inherited DoDrawLine(ARect, X, Y, LineStr, Index, SelectedArea);
if FHiliteWordList.Count > 0 then
DrawHiliteWords(LineStr, X, Y, ARect, SelectedArea);
end;
// ---------- 内部処理メソット ------------
// 文字列Sに含まれる部分文字列Strを引数Pが示す位置から
// 検索して最初にヒットした位置を P に再代入する。ヒットがない場合は
// 0 を P に代入する。
procedure PosEx(Str, S: string; var P: Integer);
var
i: Integer;
begin
for i:= P to Length(S) - Length(Str) + 1 do
if Pos(Str, Copy(S, i, Length(S))) = 1 then
begin
P:= i;
Exit;
end;
P:= 0;
end;
// 強調語句の描画(実装ルーチン)
procedure TEditorHt.DrawHiliteWords(S: string; X, Y: Integer; ARect: TRect;
SelectedArea: Boolean);
var
i, n, HX: Integer;
begin
Canvas.Font.Style:= View.Colors.Reserve.Style;
if SelectedArea then
Canvas.Font.Color:= View.Colors.Select.Color else
Canvas.Font.Color:= View.Colors.Reserve.Color;
for i:= 0 to FHiliteWordList.Count - 1 do
begin
n:= 1;
repeat
PosEx(FHiliteWordList[i], S, n);
if n = 0 then Break;
HX:= X + (n - 1) * (ColWidth + Margin.Character);
DrawTextRect(ARect, HX, Y, FHiliteWordList[i], ETO_CLIPPED);
n:= n + Length(FHiliteWordList[i]);
until False;
end;
end;
end.
---------------- ここまで --------------
http://member.nifty.ne.jp/h-triton/
○ 快速・大容量テキストエディタ「えるの〜と」公開中 ○
Avalon's Friendly Crew #80008 H-Triton (^^) since 1996
- FDELPHI MES(16):玉石混淆みんなで作るSample蔵【見本蓄積】 01/08/20 -
Original document by H-Triton 氏 ID:(QZV11422)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|