お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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