2013-06-09 4 views
9

Auf der linken Seite jeder Zeile in einem TRichEdit Steuerelement befindet sich ein unsichtbarer Bereich, in dem sich der Cursor in einen nach rechts weisenden Pfeil ändert. Wenn Sie darauf klicken, wird die gesamte Zeile ausgewählt. Es ist leicht zu sehen, wenn die Textausrichtung des TRichEdit Center oder Rechts ist. Ich glaube, dass dieser Raum eine Auswahlleiste genannt wird.Wie wird die Auswahlleiste von einem TRichEdit-Steuerelement vollständig entfernt?

Eine solche Leiste existiert in der TMemo Steuerung nicht.

Meine Frage:

Wie diese Auswahlleiste zu entfernen, so dass der Cursor Verhalten das gleiche wie in TMemo wäre?

Ich verwende Delphi 7 und es gibt keine TRichEdit Eigenschaften, um dieses Verhalten zu steuern.

Es gibt einen ECO_SELECTIONBAR Wert, den Sie mit der EM_SETOPTIONS Nachricht verwenden können, aber es fügt nur oder entfernt einen kleinen Teil der Auswahlleiste (nur sinnvoll, wenn Sie eine Auswahlleiste zu einem TRichEdit hinzufügen möchten, die eine linke Ausrichtung hat).

+4

+1 gute Frage und ich glaube nicht, Sie haben eine Möglichkeit, dieses Verhalten zu deaktivieren –

Antwort

0

mit SetWindowLong() Versuchen Sie, den ES_SELECTIONBAR Fensterstil aus dem RichEdit zu entfernen, zum Beispiel:

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

Alternativ eine neue Komponente von TRichEdit ableiten, oder eine Interceptor-Klasse verwenden, um die virtuelle CreateParams() Methode zu überschreiben die entfernen 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 wird nie zu den Stilen hinzugefügt, so dass Entfernen, was nicht da ist, ändert nichts. –

0

Es gibt keine dokumentierte Möglichkeit, dieses Verhalten für das Rich-Edit-Steuerelement zu deaktivieren. Es gibt keine Stile, Nachrichten oder Funktionen, die eine Möglichkeit bieten, dieses Verhalten zu deaktivieren.

Der von Ihnen erwähnte Stil ES_SELECTIONBAR ermöglicht eine kleine Marge, wenn der Text linksbündig ausgerichtet wird. Der Delphi-Wrapper für das Rich-Edit-Steuerelement enthält nicht den ES_SELECTIONBAR-Stil, sodass es nicht so ist, als ob Sie es entfernen könnten, da es nie an erster Stelle steht.

Bei zentriertem und rechtsbündigem Text ist der Auswahlbereich immer vorhanden, unabhängig davon, ob der ES_SELECTIONBAR Stil vorhanden ist oder nicht. Tatsächlich scheint der Stil ES_SELECTIONBAR überhaupt keinen Einfluss auf das Verhalten des Steuerelements für zentrierten und rechts ausgerichteten Text zu haben.

Ich erwarte, dass Sie, wenn Sie die Implementierung dieser Auswahlzone rückentwickeln, das Verhalten entfernen können, indem Sie die Fensterprozedur des Rich-Edit-Steuerelements ändern.

1

Vielen Dank für Ihre Antworten.

Da es scheint dies keine „richtigen“ Weg, um zu tun, entwickelte ich die folgende Lösung:

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. 

Es gar nicht elegant, aber es bekommt den Job getan.

Beachten Sie, dass dieser Code keine Doppelklick auf die vollständige Zeilenauswahl zulässt und keine Dreifachklick-Volltextauswahl unterstützt. Dafür wirst du wahrscheinlich zum Beispiel eine Interceptor-Klasse benutzen müssen.

Verwandte Themen