2013-06-09 33 views
9

Ở bên trái của mỗi dòng trong điều khiển TRichEdit có một không gian ẩn mà con trỏ thay đổi thành mũi tên phải và khi bạn nhấp vào đó, toàn bộ dòng được chọn. Thật dễ dàng để nhìn thấy nó khi liên kết văn bản của TRichEdit là Trung tâm hoặc Phải. Tôi tin rằng không gian này được gọi là thanh lựa chọn.Làm thế nào để loại bỏ hoàn toàn thanh chọn từ điều khiển TRichEdit?

Thanh như vậy không tồn tại trong điều khiển TMemo.

Câu hỏi của tôi:

Làm thế nào để loại bỏ thanh lựa chọn này, vì vậy mà hành vi con trỏ sẽ giống như trong TMemo?

Tôi đang sử dụng Delphi 7 và không có TRichEdit thuộc tính nào để kiểm soát hành vi này.

Có một giá trị ECO_SELECTIONBAR bạn có thể sử dụng với thông điệp EM_SETOPTIONS, nhưng nó chỉ cho biết thêm hoặc loại bỏ một phần nhỏ của thanh lựa chọn (chỉ hữu ích khi bạn muốn thêm một thanh chọn đến một TRichEdit mà có một Alignment Left).

+4

+1 câu hỏi hay và tôi không nghĩ rằng bạn có bất kỳ cách nào để tắt hành vi này –

Trả lời

0

Hãy thử sử dụng SetWindowLong() để loại bỏ các phong cách ES_SELECTIONBAR cửa sổ từ RichEdit, ví dụ:

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

Ngoài ra, lấy được một thành phần mới từ TRichEdit, hoặc sử dụng một lớp đánh chặn, để ghi đè lên CreateParams() phương pháp ảo để loại bỏ các style:

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 không bao giờ được thêm vào kiểu để xóa nội dung không có gì thay đổi. –

0

Không có cách nào được tài liệu để tắt hành vi này cho điều khiển chỉnh sửa phong phú. Không có kiểu, thông báo hoặc chức năng cung cấp bất kỳ cách nào để vô hiệu hóa hành vi này.

Kiểu ES_SELECTIONBAR mà bạn đã đề cập cho phép một lề nhỏ được thêm vào khi văn bản được căn trái. Các wrapper Delphi để kiểm soát chỉnh sửa phong phú không bao gồm các phong cách ES_SELECTIONBAR vì vậy nó không phải là nếu bạn có thể loại bỏ nó vì nó không bao giờ có ở nơi đầu tiên.

Đối với văn bản căn giữa và bên phải, khu vực lựa chọn luôn xuất hiện, bất kể sự hiện diện hay cách khác của kiểu ES_SELECTIONBAR. Trong thực tế, phong cách ES_SELECTIONBAR dường như không có sự khác biệt nào đối với hành vi của điều khiển đối với văn bản căn giữa và bên phải.

Tôi hy vọng rằng nếu bạn đảo ngược thiết kế việc triển khai vùng chọn này, bạn có thể xóa hành vi bằng cách sửa đổi quy trình cửa sổ của điều khiển chỉnh sửa phong phú.

1

Cảm ơn mọi người vì câu trả lời của bạn.

Như có vẻ là không có cách nào "thích hợp" để làm điều này, tôi đã nghĩ ra giải pháp sau đây:

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. 

Nó không phải thanh lịch ở tất cả, nhưng nó được công việc làm.

Lưu ý rằng mã này không cho phép nhấp đúp vào lựa chọn hàng đầy đủ và nó không xử lý lựa chọn văn bản đầy đủ ba lần nhấp. Ví dụ, bạn có thể phải sử dụng một lớp đánh chặn.

Các vấn đề liên quan