Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Controlar el foco al salir de un edit (https://www.clubdelphi.com/foros/showthread.php?t=25628)

ingel 28-09-2005 18:26:18

Controlar el foco al salir de un edit
 
Hola a todos .. .
tengo el sig. inconveniente ..Estoy en un edit y en el OnExit ejecuto cierto codigo que NO debe ejecutarse si se presiona un boton bCancelar
por lo que escribi un codigo parecido a :

if not bcancelar.focused then ejecutarcodigo
else bCancelarClick(self); /*o cualquier cosa ... pero no hace nada*/

o alguna variante mas ..pero no ejecuta el bCancelarClick (ni cualquier otro codigo que ponga) y me manda el foco a 'otro' edit del form ..
y como detalle si quiero ver el valor de bcancelar.focused con ctrl+f7
me da access violation ...
que estoy haciendo mal ?

Gracias a todos como siempre por su tiempo
Ingel

vtdeleon 28-09-2005 19:17:06

Saludos

1ro Al momento de dar click en el boton cancelar, este toma el foco y despues ejecuta tu codigo, por lo tanto nunca entrara en el Else. Trata de manejar esto de otra forma

2do Si te manda el foco a otro edit(cuando pulsas el boton supongo) es porque tienes algun codigo que hace esto.
Cita:

como detalle si quiero ver el valor de bcancelar.focused con ctrl+f7
3ro Como asi?

ingel 28-09-2005 21:34:35

no comprendo bien el orden de ejecucion
 
pues si pongo un showmessage en el else , me lo muestra , pero no me ejecuta si pongo el bcancelarclick() . Por mas que el foco este en el boton , primero deberia hacer lo que dice el Onexit del Edit .. o no ?
y si ahi pregunto por por boton.focused ..debiera ser true .. no ?
No comprendo porque decis que no va a pasar por el else , si esta evaluando el if ....
saludos
Gracias ..

roman 28-09-2005 21:44:22

Cita:

Empezado por ingel
No comprendo porque decis que no va a pasar por el else , si esta evaluando el if ....

Es que hay un pequeño error en lo que dice vtdeleon

Cita:

Empezado por vtdeleon
Al momento de dar click en el boton cancelar, este toma el foco y despues ejecuta tu codigo, por lo tanto nunca entrara en el Else. Trata de manejar esto de otra forma

Es al contrario. Al momento de dar click en el botón, primero se ejecuta el OnExit y luego el botón toma el foco. Por eso tu else no se ejecuta nunca pues en el momento del OnExit el foco sigue estando en el Edit.

// Saludos

vtdeleon 28-09-2005 21:56:53

Saludos
Cita:

Empezado por roman
Es que hay un pequeño error en lo que dice vtdeleon

Oops:rolleyes:. Creí que el codigo expuesto estaba en el evento Onclick del Boton Cancelar

ingel 29-09-2005 12:54:08

y como puedo solucionarlo ?
 
tengo forma de saber que me presioanron el boton cancelar aunque el foco siga en el edit?
Evidentemente la propiedad focused no me sirve?
Saludos
Gracias
Ingel

dec 29-09-2005 13:45:07

Hola,

Cita:

Empezado por ingel
tengo forma de saber que me presioanron el boton cancelar aunque el foco siga en el edit?

Creo que ahí hay una contradicción, puesto que, si se hace clic en el botón obviamente el foco estará en el botón y no en el "edit"... ¿no es así?

vtdeleon 29-09-2005 14:33:01

Saludos

que use Un TSpeedButton, que este no obtiene el foco.

Creo que debe haber un analisis mejor sobre el manejo del eventos

ingel 29-09-2005 15:26:48

no se donde estara el foco ...
 
pero lo primero que se ejecuta , al clickear el boton cancelar es el evento OnExit del EDIT ( o me equivoco ? ) . Debe haber una forma de saber que se presiono el boton cancelar ( voy a decir una antiguedad , pero tipo el Lastkey de clipper .. ) ..probe poniendo un showmessage en todos los eventos del boton .. pero siempre ejecuta el OnExit del Edit ...
(El foco sigue en el Edit.. edit.focused me da true en el evento onexit)
SAludos
Ingel

roman 29-09-2005 17:52:23

Vamos a recapitular.

Para empezar, cuando vtdleon dijo al principio:

Cita:

Empezado por vtdleon
Al momento de dar click en el boton cancelar, este toma el foco y despues ejecuta tu codigo, por lo tanto nunca entrara en el Else.

él tenía toda la razón, yo estaba equivocado, lo cual se puede verificar simplemente poniendo:

Código Delphi [-]
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  Assert(Button1.Focused);
end;

La aserción será cierta si se oprime el botón y falsa en cualquier otro caso.

Yo le propongo a ingel que exponga desde el comienzo lo que quiere hacer porque semánticamente es raro lo que originalmente puso:

Código Delphi [-]
if not bcancelar.focused then ejecutarcodigo
else bCancelarClick(self);

Esto está diciendo: "Si no se oprimió el botón Cancelar ejecútese algo, de lo contrario oprímase Cancelar" pero lo contrario es que sí se oprimió así que ¿para qué volver a hacerlo?

// Saludos

ingel 30-09-2005 13:40:52

recapitulando...
 
Lo que quiero hacer es en el ONEXIT de un EDIT ejecutar un codigo 'siempre', SALVO que se presione el boton CANCELAR.

- Con el foco en el TEDIT , si presiono el TBitBtn CANCELAR , lo priemro que ejecuta es el evento OnExit del Tedit y ahi dentro 'todo lo que pongo' que haga referencia al boton CANCELAR me da access violation
por lo tanto no encuentro forma de saber si se presiono o no dicho boton.

el codigo del OnExit seria asi

procedure TForm1.Edit1Exit(Sender: TObject);
begin
EjecutarCodigo;
end;

mi intencion era agregar algo como :

if not Cancelar.focused then EjecutarCodigo;

pero no funciona. El Assert(Cancelar.focused) tampoco me responde .
y si ahi pregunto por Edit1.focused SI ME DA TRUE ..por lo que presumo que el foco SIGUE en el EDIT (aun despues de haber presionado el boton CANCELAR)...

Saludos
Ingel

vtdeleon 30-09-2005 14:12:43

Saludos

Que extraño:confused:
Código Delphi [-]
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if Button1.Focused then
    ShowMessage('Boton con foco')
  else
    ShowMessage('OnExit');
end;
Hice esto con un solo botón y dos edit, y cada vez que doy click al boton éste presenta el 1er mensaje. Si el foco se va hacia el edit2 presenta el 2do mensaje

roman 30-09-2005 16:30:33

Cita:

Empezado por vtdeleon
Que extraño:confused:

Pue sí que es raro. Ya lo he probado con todas las versiones de la 3 a la 7 y obtengo los mismos resultados que vtdleon.

// Saludos

ingel 30-09-2005 17:48:01

hay algo que se me esta escapando ..
 
Reproduje tambien el ejemplo y si el foco esta en el primer edit y 'toco' el boton aparece el primer mensaje , si lo 'toco' el segundo edit ,sale el segundo mensaje y es correcto porque el foco no esta en el boton ...esta en el segundo edit ... no comprendo lo raro ..perdon :confused:
No se si es eso a lo que se referian ....

lo que si me parece raro es que si debugueo y activo el crtl+F7 en el onexit del primer edit para TODOS los EDITs (del form) la expresion edit.focused me da TRUE .. cuando en realidad el foco esta en el boton CANCELAR ... y el cancelar.focused me da acces violation . :(

me esta superando el tema ...
Lo solucioné mas o menos a los 'tirones' .. pero no me queda muy claro ..
Gracias...
saludos
Ingel

vtdeleon 30-09-2005 18:58:15

Saludos

Cita:

Empezado por roman
Ya lo he probado con todas las versiones de la 3 a la 7 y

Wow, tienes una colección:p


La franja horaria es GMT +2. Ahora son las 22:37:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi