Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   salto entre campos (https://www.clubdelphi.com/foros/showthread.php?t=91855)

oscarac 19-05-2017 04:46:26

salto entre campos
 
tengo este codigo
Código Delphi [-]
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit1Exit(Sender: TObject);
begin
if Edit1.Text = '1' then
  Edit2.Enabled := False
else
  Edit2.Enabled := True;


end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #27 then
  begin
    key := #0;
    close;
  end;

  if key = #13 then
  begin
    Perform(WM_NEXTDLGCTL,0,0);
    key := #0;
  end;

end;

end.


prueben darle enter a los campos...
el keypreview esta en true

se dan cuenta que cuando el primer edit es 1, el control no pasa al edit 3, tengo que darle 2 veces enter para que recien el edit 3 tenga el foco???
a alguien mas le sucede esto?
o estoy haciendo algo mal??

como se puede controlar los saltos dependiendo de el enabled de un campo?

Ñuño Martínez 19-05-2017 12:17:54

Comprueba el "tab order" de tus componentes. Es posible que no sea el que esperas y que del Edit 1 pase a otro control o edit y después al 2. Aquí tienes un artículo en Stack Overflow que habla de ello.

ecfisa 19-05-2017 15:10:48

Hola.

La situación se produce por que el evento OnKeyPress se dispara antes que el evento OnExit y dentro del primer evento, se pasa a Edit2 antes de que este quede deshabilitado por el código del segundo.

Para obtener el comportamiento que deseas, tendrías que hacer algo como esto:
Código Delphi [-]
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  ...
  if key = #13 then
  begin
    Edit2.Enabled := Edit1.Text <> '1'; // si es = '1' -> deshabilitar
    Perform(WM_NEXTDLGCTL, 0, 0);  
    key := #0;
  end;
end;

Saludos :)

oscarac 19-05-2017 16:40:00

Gracias por la respuesta, pero seria un poco complejo validar los campos en ese evento
existe alguna otra opcion?

Cita:

Empezado por ecfisa (Mensaje 516866)
Hola.

La situación se produce por que el evento OnKeyPress se dispara antes que el evento OnExit y dentro del primer evento, se pasa a Edit2 antes de que este quede deshabilitado por el código del segundo.

Para obtener el comportamiento que deseas, tendrías que hacer algo como esto:
Código Delphi [-]
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  ...
  if key = #13 then
  begin
    Edit2.Enabled := Edit1.Text <> '1'; // si es = '1' -> deshabilitar
    Perform(WM_NEXTDLGCTL, 0, 0);  
    key := #0;
  end;
end;

Saludos :)


oscarac 19-05-2017 16:41:10

Cita:

Empezado por Ñuño Martínez (Mensaje 516860)
Comprueba el "tab order" de tus componentes. Es posible que no sea el que esperas y que del Edit 1 pase a otro control o edit y después al 2. Aquí tienes un artículo en Stack Overflow que habla de ello.

si, esta correcto, pero aun asi, estoy verificando lo que menciona ecfisa
parece que el keypress se activa primero que el exit

ecfisa 19-05-2017 17:13:21

Hola.
Cita:

Empezado por oscarac (Mensaje 516873)
Gracias por la respuesta, pero seria un poco complejo validar los campos en ese evento
existe alguna otra opcion?

En principio lo veo difícil tál como está planteado ya que al activar la propiedad KeyPreview, el formulario recibe los eventos de teclado antes que el control activo.

¿ Podrías poner algúna otra situación de ejemplo como para evaluar otras posibilidades ?

Saludos :)

oscarac 19-05-2017 17:20:11

tengo varios edit asi como en el ejemplo
la idea es que los edits siguientes se activen o desactiven dependiendo del valor del edit primario

estoy pensando en usar setfocus, o jugar con los OnEnter de cada edit

newtron 19-05-2017 19:12:35

Hola.

Yo uso este código en el FormKeyDown y no tengo ningún problema:

Código Delphi [-]
procedure Formulario.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin

  case Key of

    VK_UP: begin
      SelectNext(ActiveControl, False, True); 
      Key := 0;
    end;

    VK_DOWN: begin
      SelectNext(ActiveControl, True, True);
      Key := 0;
    end;

  end;

Saludos

oscarac 19-05-2017 19:26:02

Cita:

Empezado por newtron (Mensaje 516877)
Hola.

Yo uso este código en el FormKeyDown y no tengo ningún problema:

Código Delphi [-]
procedure Formulario.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin

  case Key of

    VK_UP: begin
      SelectNext(ActiveControl, False, True); 
      Key := 0;
    end;

    VK_DOWN: begin
      SelectNext(ActiveControl, True, True);
      Key := 0;
    end;

  end;

Saludos


De funcionar si funciona, pero me parece curioso que en el primer toque de tecla (Arriba o Abajo) el foco se pierde cuando se deshabilita un edit

chequea esto y miralo, te daras cuenta que presionas la tecla hacia abajo, los edits 2,3,4 se deshabilitan y el foco se pierde

Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    edt1: TEdit;
    edt2: TEdit;
    edt3: TEdit;
    edt4: TEdit;
    edt5: TEdit;
    edt6: TEdit;
    procedure edt1Exit(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.edt1Exit(Sender: TObject);
begin
  edt2.Enabled := edt1.Text = '2';
  edt3.Enabled := edt1.Text = '2';
  edt4.Enabled := edt1.Text = '3';
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case Key of

    VK_UP: begin
      SelectNext(ActiveControl, False, True);
      Key := 0;
    end;

    VK_DOWN: begin
      SelectNext(ActiveControl, True, True);
      Key := 0;
    end;
end;
end;

end.

oscarac 19-05-2017 19:44:22

https://www.clubdelphi.com/foros/sho...highlight=foco

desde este fecha estoy batallando con esto y no encuentro la solucion

newtron 19-05-2017 19:47:03

Cita:

Empezado por oscarac (Mensaje 516878)
De funcionar si funciona, pero me parece curioso que en el primer toque de tecla (Arriba o Abajo) el foco se pierde cuando se deshabilita un edit

chequea esto y miralo, te daras cuenta que presionas la tecla hacia abajo, los edits 2,3,4 se deshabilitan y el foco se pierde

Dependiendo del valor que tenga en ese momento edt1 ¿no?

oscarac 19-05-2017 19:51:10

Agregue un Label y un timer para que cada segundo me diga en que control estoy
cuando presiono la tecla 2 y enter
el foco cambia

pero cuando en el edit1 coloco el numero 1 y enter aparece un mensaje de error

medio loco si?

alguien puede corroborar que sucede?
no quiero tener un mal concepto de delphi.

Código Delphi [-]
procedure TForm1.tmr1Timer(Sender: TObject);
begin
  lbl1.caption := ActiveControl.Name;
end;

oscarac 19-05-2017 19:51:56

Cita:

Empezado por newtron (Mensaje 516880)
Dependiendo del valor que tenga en ese momento edt1 ¿no?

exacto !!!

newtron 19-05-2017 20:03:36

Entonces es correcto el funcionamiento, ¿no?

oscarac 19-05-2017 20:08:53

Cita:

Empezado por newtron (Mensaje 516883)
Entonces es correcto el funcionamiento, ¿no?

Si funciona pero el foco se pierde

oscarac 19-05-2017 20:56:27

Si hago esto me funciona a la perfeccion, si alguien pudiera optimizarlo o colocarlo en una libreria para invocarlo o ver una mejor forma estare muy atento

Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    edt1: TEdit;
    edt2: TEdit;
    edt3: TEdit;
    edt4: TEdit;
    edt5: TEdit;
    edt6: TEdit;
    procedure edt1Exit(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.edt1Exit(Sender: TObject);
begin
  edt2.Enabled := edt1.Text = '2';
  edt3.Enabled := edt1.Text = '2';
  edt4.Enabled := edt1.Text = '3';
  if edt2.Enabled then edt2.SetFocus
  else
    if edt3.Enabled then edt3.SetFocus
      else
        if edt4.Enabled then edt4.SetFocus
          else
            if edt5.Enabled then edt5.SetFocus
              else
                if edt6.Enabled then edt6.SetFocus;

end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case Key of

  VK_RETURN: begin
      SelectNext(ActiveControl, True, True);
      Key := 0;
    end;
        VK_UP: begin
      SelectNext(ActiveControl, False, True);
      Key := 0;
    end;

    VK_DOWN: begin
      SelectNext(ActiveControl, True, True);
      Key := 0;
    end;
end;
end;

end.

Ñuño Martínez 22-05-2017 09:21:15

No había caído en que los eventos de teclado pueden afectar a la respuesta por defecto de Intro y Tab. Siempre se aprende algo nuevo. ^\||/


La franja horaria es GMT +2. Ahora son las 01:45:32.

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