2009. október 11., vasárnap

How to hide the caret in a TEdit


Problem/Question/Abstract:

Does anyone know how I might be able to suppress the text cursor in a TEdit, so it's not visible?

Answer:

For that you need to call the HideCaret API function after the control has processed the WM_SETFOCUS message. The OnEnter event is a tad too early for that, so if you do not want to create a TEdit descendent with an overriden message handler for WM_SETFOCUS you need to delay the action by posting a message to the form and have the handler for that message do the HideCaret.

The three edits on this example form share the same OnEnter handler (AllEditEnter), have ReadOnly = true and AutoSelect = false.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, stdctrls, jpeg;

const
  UM_HIDECARET = WM_USER + 101;
type
  TUMHideCaret = packed record
    msg: Cardinal;
    control: TWinControl;
  end;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure AllEditEnter(Sender: TObject);
  private
    { Private declarations }
    procedure UMHideCaret(var msg: TUMHideCaret); message UM_HIDECARET;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.AllEditEnter(Sender: TObject);
begin
  PostMessage(handle, UM_HIDECARET, wparam(sender), 0);
end;

procedure TForm1.UMHideCaret(var msg: TUMHideCaret);
begin
  HideCaret(msg.control.Handle);
end;

end.

Of course this is an excellent way to confuse the user, since there will be no indication where the focus is anymore when the user tabs into one of the edits...

Nincsenek megjegyzések:

Megjegyzés küldése