Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   TEdit - Readonly (https://www.clubdelphi.com/foros/showthread.php?t=78696)

Jose_Pérez 10-05-2012 13:11:12

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?

Casimiro Notevi 10-05-2012 13:54:20

Pero, ¿en qué evento pones ese código?
Ya lo he visto :)

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

Jose_Pérez 10-05-2012 14:29:54

Cita:

Empezado por Casimiro Notevi (Mensaje 432288)
Pon el edit2.readonly:=false en el onenter del edit2

Gracias Casimiro, pero eso tampoco funciona.

marcoszorrilla 10-05-2012 14:49:45

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.

Jose_Pérez 10-05-2012 15:12:26

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.

Casimiro Notevi 10-05-2012 15:16:01

Pues como no pongas todo el código fuente... porque adivinos ya no podemos ser :D

Jose_Pérez 10-05-2012 15:33:50

Cita:

Empezado por Casimiro Notevi (Mensaje 432300)
Pues como no pongas todo el código fuente... porque adivinos ya no podemos ser :D

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.

Casimiro Notevi 10-05-2012 15:41:10

Y cuando pulsas con el ratón en edit2 ¿está el foco en edit1?

Jose_Pérez 10-05-2012 15:52:40

Cita:

Empezado por Casimiro Notevi (Mensaje 432305)
Y cuando pulsas con el ratón en edit2 ¿está el foco en edit1?

Efectivamente. El foco está en Edit1

Casimiro Notevi 10-05-2012 16:17:01

Ciertamente, tiene un comportamiento extraño.

ecfisa 10-05-2012 18:08:16

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.

Casimiro Notevi 10-05-2012 18:22:34

Cita:

Empezado por ecfisa;432321 Pero de momento sacando el [I
ShowMessage[/i], asunto solucionado.

Sí, claro, sin el showmessage no hay problema.

marcoszorrilla 10-05-2012 19:35:34

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.

marcoszorrilla 10-05-2012 19:43:19

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.

Jose_Pérez 10-05-2012 20:40:50

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.

Jose_Pérez 11-05-2012 12:50:33

Cita:

Empezado por marcoszorrilla (Mensaje 432338)
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... ¿?

marcoszorrilla 11-05-2012 17:00:40

Cita:

Empezado por Jose_Pérez (Mensaje 432395)
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

ecfisa 12-05-2012 06:42:31

Cita:

Empezado por marcoszorrilla (Mensaje 432416)
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.

ecfisa 13-05-2012 21:35:13

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... :rolleyes:

Saludos.

Jose_Pérez 14-05-2012 08:58:24

Esta es la solución.

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

Muchas gracias.


La franja horaria es GMT +2. Ahora son las 17:39:30.

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