如何从TRichEdit控件中完全删除选择栏?

时间:2013-06-09 19:43:17

标签: delphi textselection richedit

TRichEdit控件的每一行的左侧,有一个不可见的空间,光标变为右上箭头,当您单击那里时,整个行被选中。当TRichEdit的文本对齐方式为中心或右侧时,很容易看到它。我相信这个空间被称为选择栏

TMemo控件中不存在此栏。

我的问题:

如何删除此选择栏,以便光标行为与TMemo中的相同?

我正在使用Delphi 7,并且没有TRichEdit属性来控制此行为。

您可以在ECO_SELECTIONBAR消息中使用EM_SETOPTIONS值,但它只会添加或删除选择栏的一小部分(仅当您要将选择栏添加到{时才有用) {1}}具有左对齐方式。)

3 个答案:

答案 0 :(得分: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.

它根本不优雅,但它完成了工作。

请注意,此代码不允许双击完整行选择,并且不会处理三击全文选择。为此,您可能必须使用拦截器类。

答案 1 :(得分:0)

尝试使用SetWindowLong()从RichEdit中删除ES_SELECTIONBAR窗口样式,例如:

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;

答案 2 :(得分:0)

没有记录的方法可以为富编辑控件禁用此行为。没有样式,消息或函数可以提供任何方法来禁用此行为。

您提到的ES_SELECTIONBAR样式允许在文本左对齐时添加小边距。丰富的编辑控件的Delphi包装器不包含ES_SELECTIONBAR样式,所以它不像你可以删除它,因为它从来没有在那里。

对于居中和右对齐的文本,无论ES_SELECTIONBAR样式的存在与否,选择区域始终存在。事实上,ES_SELECTIONBAR样式似乎对控件的居中和右对齐文本的行为没有任何影响。

我希望如果您反向设计此选择区域的实现,您可以通过修改富编辑控件的窗口过程来删除该行为。