Para mostrar el cursor como un bloque se usa la función
CreateCaret para especificar el tamaño, y
ShowCaret para mostrar el nuevo cursor.
Lo malo es que el cursor tendría que crearse cada vez que se entra al control, para lo cual tenemos el evento OnEnter. Sin embargo, éste ocurre mientras la VCL está procesando el mensaje WM_SETFOCUS, y para cuando termina de hacerlo (despúes del OnEnter), el cursor vuelve a su forma original.
Entonces debemos manejar nosotros mismos dicho mensaje para asegurarnos de crear el cursor después de que el sistema termine de procesar WM_SETFOCUS. Para ello puede crearse un control derivado de TMemo, o bien, si es para un sólo memo, reemplazando
al vuelo su manejador de mensajes:
Código Delphi
[-]
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Memo1Exit(Sender: TObject);
private
OldMemoWndProc: TWndProc;
procedure MemoWndProc(var Msg: TMessage);
end;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
OldMemoWndProc := Memo1.WindowProc;
Memo1.WindowProc := MemoWndProc;
end;
procedure TForm1.Memo1Exit(Sender: TObject);
begin
DestroyCaret();
end;
procedure TForm1.MemoWndProc(var Msg: TMessage);
var
DC: HDC;
TM: TextMetric;
begin
OldMemoWndProc(Msg);
if Msg.Msg = WM_SETFOCUS then
begin
DC := GetDC(Handle);
GetTextMetrics(DC, TM);
ReleaseDC(Handle, DC);
CreateCaret(Memo1.Handle, 0, TM.tmAveCharWidth, TM.tmHeight);
ShowCaret(Memo1.Handle);
end;
end;
end.
// Saludos