PDA

Ver la Versión Completa : TEdit selecciona todo al recibir el foco pero se pierde con el click


Sirkius
28-08-2005, 19:40:23
Hola, tengo un problema que no he sabido resolver despues de buscar mucho por la ayuda y estos foros. Os explico: tengo un TEdit que debe seleccionarse todo al recibir el foco pero si lo recibe a traves de un click, se selecciona todo pero se pierde por el click (me explico, tiene lugar antes el evento de seleccionar todo por recibir el foco que el del click, el cual hace que se deseleccione todo).

Creo que la solucion pasaria por ignorar el click una vez tenga el foco, pero solo deberia ignorarlo esa vez...

Muchas gracias por adelantado que siempre me habeis sido de gran ayuda :)

vtdeleon
28-08-2005, 20:56:30
Saludos

Tuve ese problemas y lo resolvi agregando el codigo de seleccionar todo en el eveno OnClick del edit.

roman
29-08-2005, 02:23:53
lo resolvi agregando el codigo de seleccionar todo en el eveno OnClick del edit.

El problema con esta solución es que nunca vas a poder deshacerte de la selección mediante clicks.

Cuando el edit no tiene el foco y das click en él, el texto queda seleccionado como es de esperarse. Pero ya teniendo el foco, lo que se espera es que si vuelves a dar click en él, se pierda la selección y el cursor se coloque donde diste el click.

Para resolver esto, en el evento OnClick deberías detectar si se tiene o no el foco, pero esto no es posible precisamente porque el evento OnEnter sucede antes del OnClick de manera que para cuando éste sucede ya se tiene el foco siempre.

La única manera en que yo he resuelto esto es derivando una componente de TEdit e interceptando directamente el mensaje WM_LBUTTONDOWN.

Para no tener que instalar una nueva componente coloca esta declaración antes de la declaración del formulario:



type
TEdit = class(StdCtrls.TEdit)
private
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
end;


e implementa WMLButtonDown así:



procedure TEdit.WMLButtonDown(var Message: TWMLButtonDown);
begin
if Focused then
inherited
else
begin
SelectAll;
SetFocus;
end;
end;


// Saludos

vtdeleon
29-08-2005, 02:35:47
Saludos

Gracias roman por el aclarandum

Sirkius
29-08-2005, 11:02:33
Muchas gracias roman, es justo lo que queria.