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...
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése