2013-06-09 7 views
9

TRichEditコントロールの各行の左側には、カーソルが右上の矢印に変わる非表示のスペースがあります。そこをクリックすると、行全体が選択されます。 TRichEditのテキストの配置が中央または右の場合、それを見るのは簡単です。このスペースは選択バーと呼ばれています。TRichEditコントロールから選択バーを完全に削除する方法は?

このようなバーは、TMemoコントロールには存在しません。

私の質問:カーソルの動作がTMemoと同じになるように

、この選択バーを削除する方法?

私はDelphi 7を使用しており、この動作を制御するためのプロパティはTRichEditではありません。

あなたはEM_SETOPTIONSメッセージで使用することができますECO_SELECTIONBAR値ありますが、それが唯一の追加または(あなたが左揃えを持ってTRichEditに選択バーを追加したいときのみ有用)選択バーのわずかな部分を削除します。

+4

+1良い質問ですが、この動作を無効にする方法がないと思われます。 –

答えて

0

例えば、リッチエディットからES_SELECTIONBARウィンドウスタイルを削除するSetWindowLong()を使用してみてください:

dwStyle := GetWindowLong(RichEdit1.Handle, GWL_STYLE); 
SetWindowLong(RichEdit1.Handle, GWL_STYLE, dwStyle and not ES_SELECTIONBAR); 

また、TRichEditから新しいコンポーネントを派生、または削除する仮想CreateParams()メソッドをオーバーライドするために、インターセプタクラスを使用しますスタイル:

type 
    TMyRichEdit = class(TRichEdit) 
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    end; 

Procedure TMyRichEdit.CreateParams(var Params: TCreateParams); 
Begin 
    inherited; 
    Params.Style := Params.Style and not ES_SELECTIONBAR; 
End; 
+3

ES_SELECTIONBARはスタイルに追加されないので、何も変更されずに何も変更されません。 –

0

リッチエディットコントロールのこの動作を無効にする方法は記載されていません。この動作を無効にする方法、スタイル、メッセージ、機能はありません。

上記のES_SELECTIONBARスタイルでは、テキストを左揃えにすると小さな余白を追加できます。リッチエディットコントロールのDelphiラッパーにはES_SELECTIONBARスタイルが含まれていないので、最初にそこには存在しないので、削除することはできません。

中央揃えと右揃えのテキストの場合、ES_SELECTIONBARスタイルの有無にかかわらず選択領域は常に存在します。実際には、ES_SELECTIONBARのスタイルでは、中央揃えと右揃えのテキストのコントロールの振る舞いに全く違いはありません。

この選択ゾーンの実装をリバースエンジニアリングすると、リッチエディットコントロールのウィンドウプロシージャを変更することでその動作を削除できると思います。

1

お返事ありがとうございます。

これを行うには「正しい」方法がないように思えるとして、私は以下のソリューションを考案:それはすべてでエレガントではないのですが、それは仕事を取得します

unit TRichEditRemoveSelectionBar; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, ComCtrls; 

type 
    TForm1 = class(TForm) 
    RichEdit1: TRichEdit; 
    procedure RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X, 
     Y: Integer); 
    procedure RichEdit1MouseDown(Sender: TObject; Button: TMouseButton; 
     Shift: TShiftState; X, Y: Integer); 
    procedure RichEdit1MouseUp(Sender: TObject; Button: TMouseButton; 
     Shift: TShiftState; X, Y: Integer); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 
    B: Boolean = False; 

implementation 

{$R *.dfm} 

// ------------------------------------------------------------------------- // 

procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X, 
    Y: Integer); 
begin 
    if (GetCursor <> Screen.Cursors[crDefault]) and 
    (GetCursor <> Screen.Cursors[crIBeam]) then 
    begin 
    SetCursor(Screen.Cursors[crIBeam]); 
    B := True; 
    end else 
    B := False; 
end; 

procedure TForm1.RichEdit1MouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    if B then 
    begin 
    SetCursor(Screen.Cursors[crIBeam]); 
    RichEdit1.SelLength := 0; 
    end; 
end; 

procedure TForm1.RichEdit1MouseUp(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    if B then 
    SetCursor(Screen.Cursors[crIBeam]); 
end; 

// ------------------------------------------------------------------------- // 

end. 

を。

このコードでは、ダブルクリック完全行選択が許可されておらず、トリプルクリックのフルテキスト選択を処理しないことに注意してください。そのためには、おそらくインターセプタクラスを使用する必要があります。

関連する問題