Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-05-2017
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.733
Poder: 13
oscarac Va por buen camino
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?
__________________
Dulce Regalo que Satanas manda para mi.....

Última edición por oscarac fecha: 19-05-2017 a las 04:51:29. Razón: mas explicacion
Responder Con Cita
  #2  
Antiguo 19-05-2017
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 5.620
Poder: 18
Ñuño Martínez Va camino a la famaÑuño Martínez Va camino a la fama
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.
__________________
Proyectos actuales --> Burdjia Components|http://gesbit.sf.net/
Responder Con Cita
  #3  
Antiguo 19-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.773
Poder: 27
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 behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 19-05-2017
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.733
Poder: 13
oscarac Va por buen camino
Gracias por la respuesta, pero seria un poco complejo validar los campos en ese evento
existe alguna otra opcion?

Cita:
Empezado por ecfisa Ver Mensaje
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
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #5  
Antiguo 19-05-2017
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.733
Poder: 13
oscarac Va por buen camino
Cita:
Empezado por Ñuño Martínez Ver Mensaje
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
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #6  
Antiguo 19-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.773
Poder: 27
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 behold
Hola.
Cita:
Empezado por oscarac Ver Mensaje
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 19-05-2017
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.733
Poder: 13
oscarac Va por buen camino
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
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #8  
Antiguo 19-05-2017
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 2.851
Poder: 13
newtron Va camino a la fama
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
__________________
Be water my friend.
Responder Con Cita
  #9  
Antiguo 19-05-2017
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.733
Poder: 13
oscarac Va por buen camino
Cita:
Empezado por newtron Ver Mensaje
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.
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #10  
Antiguo 19-05-2017
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.733
Poder: 13
oscarac Va por buen camino
https://www.clubdelphi.com/foros/sho...highlight=foco

desde este fecha estoy batallando con esto y no encuentro la solucion
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #11  
Antiguo 19-05-2017
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 2.851
Poder: 13
newtron Va camino a la fama
Cita:
Empezado por oscarac Ver Mensaje
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?
__________________
Be water my friend.
Responder Con Cita
  #12  
Antiguo 19-05-2017
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.733
Poder: 13
oscarac Va por buen camino
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;
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #13  
Antiguo 19-05-2017
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.733
Poder: 13
oscarac Va por buen camino
Cita:
Empezado por newtron Ver Mensaje
Dependiendo del valor que tenga en ese momento edt1 ¿no?
exacto !!!
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #14  
Antiguo 19-05-2017
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 2.851
Poder: 13
newtron Va camino a la fama
Entonces es correcto el funcionamiento, ¿no?
__________________
Be water my friend.
Responder Con Cita
  #15  
Antiguo 19-05-2017
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.733
Poder: 13
oscarac Va por buen camino
Cita:
Empezado por newtron Ver Mensaje
Entonces es correcto el funcionamiento, ¿no?
Si funciona pero el foco se pierde
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #16  
Antiguo 19-05-2017
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.733
Poder: 13
oscarac Va por buen camino
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.
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #17  
Antiguo 22-05-2017
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 5.620
Poder: 18
Ñuño Martínez Va camino a la famaÑuño Martínez Va camino a la fama
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.
__________________
Proyectos actuales --> Burdjia Components|http://gesbit.sf.net/
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
Resta entre Campos shoulder MySQL 3 16-01-2013 20:00:38
como obtener un unico valor entre dos campos de folio de sql server uper MS SQL Server 7 23-05-2011 22:05:45
Salto del Cursor entre Paneles Er0s Varios 5 01-10-2010 18:30:42
Conexion entre campos de distintas tablas eudy.net Conexión con bases de datos 3 09-12-2007 07:36:56
Resta entre campos datetime ale_metall Varios 3 22-10-2007 20:15:19


La franja horaria es GMT +2. Ahora son las 18:26:08.


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