Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-05-2012
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 21
Jose_Pérez Va por buen camino
TEdit - Readonly

Hola a tod@s:

Después de muchos años programando en Delphi 5, me he llevado una sorpresa sobre el funcionamiento del component TEdit. Para verlo mejor, inicia un nuevo proyecto y coloca dos componentes TEdit sobre un form.

Al comopnente TEdit2 le asignamos la propiedad ReadIOnly a true.

Ahora, en el evento OnExit del TEdit1 escribimos el siguiente código:

Código Delphi [-]
ShowMessage('Hola');
Edit2.ReadOnly:=False;
Edit2.SetFocus;

Ahora ejecutamos el programa. Hay dos modos de pasar de un TEdit a otro: tecla tab, o ratón. Si utilizamos la tercla tab, todo funciona según lo esperado. Sin embargo, si utilizamos el ratón, después de responder a ShowMessage, no podemos ecribir en TEdit2. ¿Alguna solución?
Responder Con Cita
  #2  
Antiguo 10-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pero, ¿en qué evento pones ese código?
Ya lo he visto

Pon el edit2.readonly:=false en el onenter del edit2

Última edición por Casimiro Notevi fecha: 10-05-2012 a las 14:09:27.
Responder Con Cita
  #3  
Antiguo 10-05-2012
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 21
Jose_Pérez Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Pon el edit2.readonly:=false en el onenter del edit2
Gracias Casimiro, pero eso tampoco funciona.
Responder Con Cita
  #4  
Antiguo 10-05-2012
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Si en el OnExit del Edit1 pones el código que dices, por cierto Setfocus sobraría, te tiene que funcionar con el ratón y con la tecla TAb, por cierto acabo de hacer la prueba.

Revisa el código no tengas alguna cosa por ahí que no estés viendo.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #5  
Antiguo 10-05-2012
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 21
Jose_Pérez Va por buen camino
Marcos, insisto en el error. E incluso se produce sin tener la propiedad ReadOnly a True.

Mi sospecha es que al hacer click sobre el segundo TEdit se activa la seleción de texto. Posteriormente se hace la llamada a ShowMessage y, a partir de ahí, todo se lía.
Responder Con Cita
  #6  
Antiguo 10-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pues como no pongas todo el código fuente... porque adivinos ya no podemos ser
Responder Con Cita
  #7  
Antiguo 10-05-2012
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 21
Jose_Pérez Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Pues como no pongas todo el código fuente... porque adivinos ya no podemos ser
La propiedad ReadOnly del TEdit2 está a True.

Con la tecla tab funciona. El problema es cuando hago click con el ratón sobre TEdit2.

¡OJO! Para ver el fallo, hay que ejecutar el programa y probarlo con la tecla Tab, parar el programa (para resertear la propiedad ReadOnly de TEdit2 nuevamente a true), y volverlo a ejecutar y probarlo con el ratón.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Edit1Exit(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  ShowMessage('Hola');
  Edit2.ReadOnly:=False;
end;

end.
Responder Con Cita
  #8  
Antiguo 10-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Y cuando pulsas con el ratón en edit2 ¿está el foco en edit1?
Responder Con Cita
  #9  
Antiguo 10-05-2012
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 21
Jose_Pérez Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Y cuando pulsas con el ratón en edit2 ¿está el foco en edit1?
Efectivamente. El foco está en Edit1
Responder Con Cita
  #10  
Antiguo 10-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Ciertamente, tiene un comportamiento extraño.
Responder Con Cita
  #11  
Antiguo 10-05-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

El comportamiento se produce al llamar una ventana de forma modal en el evento OnExit, ni la propiedad ReadOnly ni el método SetFocus tienen que ver en el asunto.

Basta con hacer:
Código Delphi [-]
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  with TForm.Create(nil) do ShowModal;
end;
para obtener el mismo resultado.

Sin embargo, no sucede lo mismo si:
Código Delphi [-]
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  with TForm.Create(nil) do Show;
end;
En apariencia pasa cuando otra ventana acapara el foco... habrá que investigar un poco mas. Pero de momento sacando el ShowMessage, asunto solucionado.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #12  
Antiguo 10-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ecfisa;432321 Pero de momento sacando el [I
ShowMessage[/i], asunto solucionado.
Sí, claro, sin el showmessage no hay problema.
Responder Con Cita
  #13  
Antiguo 10-05-2012
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Curiosamente, con este código de prueba en el evento OnChange funciona si éste último se produce.

Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
begin
Keybd_Event(Vk_Tab,0,0,0);
end;
Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #14  
Antiguo 10-05-2012
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
También funciona saliendo con Enter, con KeyPreview activado y el siguiente código para habilitar Enter por Tab.

Código Delphi [-]
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
 If (key = #13) and (not (Activecontrol is Tbutton) ) then
  begin
  Perform(WM_NEXTDLGCTL, 0, 0 );
  Key:=#0;
  end;
end;

Es decir, funciona con teclas pero no con el ratón.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #15  
Antiguo 10-05-2012
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 21
Jose_Pérez Va por buen camino
Ciertamente puse como ejemplo ShowMessage. En cualquier caso en la aplicación en desarrollo el problema se produce con el componente TMessageDialog de la librería RX. Evidentemente el problema es el mismo: una llamada a una ventana de forma modal.

Mañana haré pruebas en la oficina y os diré algo.

Saludos y gracias a todos por vuestro interés.
Responder Con Cita
  #16  
Antiguo 11-05-2012
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 21
Jose_Pérez Va por buen camino
Cita:
Empezado por marcoszorrilla Ver Mensaje
Curiosamente, con este código de prueba en el evento OnChange funciona si éste último se produce.

Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
begin
Keybd_Event(Vk_Tab,0,0,0);
end;
Hmmm... no lo entiendo. Hasta donde yo sé, el evento OnChange se produce cuando hay una cambio en el TEdit, pero no es el caso... ¿?
Responder Con Cita
  #17  
Antiguo 11-05-2012
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Cita:
Empezado por Jose_Pérez Ver Mensaje
Hmmm... no lo entiendo. Hasta donde yo sé, el evento OnChange se produce cuando hay una cambio en el TEdit, pero no es el caso... ¿?
Símplemente era una prueba, lógicamente tienes que modificar el edit1 para que funcione. La idea final con la que hice la prueba era ver si enviándole un TAB al componente edit1 funcionaba Edit2, el problema es que como se utiliza el evento OnExit, ya no serviría de nada pues ya hemos abandonado el componente con el ratón y no con teclado, yo buscaba poner ese código en el OnLostFocus, pero el componente no tiene esa propiedad, por lo que la dejé a modo de idea...

Un Saludo
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #18  
Antiguo 12-05-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por marcoszorrilla Ver Mensaje
yo buscaba poner ese código en el OnLostFocus, pero el componente no tiene esa propiedad, por lo que la dejé a modo de idea...
Hola.

Y creo que no estás para nada desorientado. Estuve pensando en lo que explicabas arriba, me parece que cuando se llama a una ventana modal en el evento OnExit, y se fuerza la pérdida del foco, el mouse se despista de donde debe liberar el boton presionado.

Ese es el comportamiento extraño que nota José cuando dice:
Cita:
Mi sospecha es que al hacer click sobre el segundo TEdit se activa la seleción de texto.
Pero en ese punto ActiveControl ya apunta al siguiente control, entonces lo podemos usar.
Código Delphi [-]
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  ShowMessage(ActiveControl.Name); // demuestra que ActiveControl -> Edit2
  PostMessage(ActiveControl.Handle, WM_LBUTTONUP, 0, 0);
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #19  
Antiguo 13-05-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

De todos modos, aunque el código que te puse anteriormente soluciona la situación, no me parece buena idea llamar una ventana modal en el evento OnExit...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #20  
Antiguo 14-05-2012
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 21
Jose_Pérez Va por buen camino
Esta es la solución.

Código Delphi [-]
PostMessage(ActiveControl.Handle, WM_LBUTTONUP, 0, 0);

Muchas gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Hacer readonly una columna en stringgrid zcatzz Varios 5 26-09-2007 16:59:50
Contar Cantidad de ReadOnly brandolin OOP 4 23-01-2006 18:34:12
readonly dataset n0n3 SQL 13 27-04-2005 01:24:45
Pasar el valor de un TEdit dentro de un StringGrid a otro TEdit que está fuera atirado Varios 4 11-09-2004 19:13:48
IBDataSet readOnly???? Giniromero Conexión con bases de datos 2 01-10-2003 11:14:04


La franja horaria es GMT +2. Ahora son las 04:36:08.


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
Copyright 1996-2007 Club Delphi