Как полностью удалить полосу выбора из элемента управления TRichEdit?

Слева от каждой строки в TRichEdit элементе управления есть невидимое пространство, где курсор меняется на стрелку вправо, и когда вы щелкаете там, выделяется вся строка. Это легко увидеть, когда текст TRichEdit выравнивается по центру или по правому краю. Я считаю, что это пространство называется полосой выбора.

Такой полосы нет в элементе управления TMemo.

Мой вопрос:

Как убрать эту полосу выбора, чтобы поведение курсора было таким же, как в TMemo?

Я использую Delphi 7, и нет TRichEdit свойств для управления этим поведением.

Есть значение ECO_SELECTIONBAR, которое вы можете использовать с сообщением EM_SETOPTIONS, но оно добавляет или удаляет только небольшую часть полосы выбора (полезно только тогда, когда вы хотите добавить полосу выбора к TRichEdit, имеющему выравнивание по левому краю).


person jedivader    schedule 09.06.2013    source источник
comment
+1 хороший вопрос, и я не думаю, что у вас есть способ отключить это поведение   -  person David Heffernan    schedule 10.06.2013


Ответы (3)


Спасибо всем за ответы.

Поскольку, кажется, нет "правильного" способа сделать это, я разработал следующее решение:

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.

Это совсем не элегантно, но выполняет свою работу.

Обратите внимание, что этот код не позволяет выбрать полную строку двойным щелчком и не обрабатывает полный текстовый выбор тройным щелчком. Для этого вам, вероятно, придется использовать, например, класс-перехватчик.

person jedivader    schedule 12.06.2013

Попробуйте использовать SetWindowLong(), чтобы удалить ES_SELECTIONBAR стиль окна из RichEdit, например:

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;
person Remy Lebeau    schedule 10.06.2013
comment
ES_SELECTIONBAR никогда не добавляется в стили, поэтому удаление того, чего там нет, ничего не меняет. - person David Heffernan; 10.06.2013

Не существует документированного способа отключить это поведение для элемента управления Rich Edit. Нет стилей, сообщений или функций, которые предлагают какой-либо способ отключить это поведение.

Упомянутый вами стиль ES_SELECTIONBAR позволяет добавить небольшой запас при выравнивании текста по левому краю. Оболочка Delphi для элемента управления Rich Edit не включает стиль ES_SELECTIONBAR, поэтому его нельзя удалить, поскольку его вообще нет.

Для текста с выравниванием по центру и по правому краю область выбора всегда присутствует, независимо от наличия или отсутствия стиля ES_SELECTIONBAR. Фактически, стиль ES_SELECTIONBAR, похоже, не имеет никакого значения для поведения элемента управления для текста, выровненного по центру и по правому краю.

Я ожидаю, что если вы реконструируете реализацию этой зоны выбора, вы сможете удалить такое поведение, изменив процедуру окна элемента управления Rich Edit.

person David Heffernan    schedule 10.06.2013