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 28-09-2014
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
Como reconocer ONExit hacia arriba o hacia abajo

buenas noches
Quiza el titulo no sea muy claro, la pregunta es la siguiente, como puedo identificar hacia donde va el control despues del ONExit cuando sale del Edit, quisiera saber si es que el control va al siguiente Edit o al anterior Edit

puedo salir con enter o con tab y el control pasa al siguiente edit, pero si presiono Shift+Tab el control va al Edit anterior, hay una forma de saberlo?

para que en el onexit solo valide el campo (en caso tenga algo que validar) cuando pase al siguiente y no cuando regrese al edit anterior
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #2  
Antiguo 28-09-2014
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 Oscar.

Fijate si te puede servir el modo que uso en este ejemplo para cualquier TWinControl o descendiente:
Código Delphi [-]
type
  TForm1 = class(TForm)
    ...
    Edit1: TEdit;
    Edit2: TEdit;
    ...
    procedure FormCreate(Sender: TObject);
  private
    FPrevFocusCtrl: TWinControl;
    procedure CMFocusChanged(var Msg: TCMFocusChanged); message CM_FOCUSCHANGED;
    procedure ActiveControlChange(Sender: TObject);
  public
  end;

var
  Form1: TForm1;

implementation 

uses TypInfo;

type
  TSentido = (seAnterior, seSiguiente);

var
  SentidoTab: TSentido; // (anterior/siguiente)

// Obtener sentido (anterior/siguiente)
procedure TForm1.CMFocusChanged(var Msg: TCMFocusChanged);
begin
  if Assigned(FPrevFocusCtrl) then
  begin
    if Msg.Sender.TabOrder > FPrevFocusCtrl.TabOrder then
      SentidoTab:= seSiguiente
    else
      SentidoTab:= seAnterior;
    FPrevFocusCtrl:= Self.ActiveControl;
  end;
  inherited;
end;

// Mostrar sentido (el valor ya se encuentra en SentidoTab)
procedure TForm1.ActiveControlChange(Sender: TObject);
begin
  Caption:= Copy(GetEnumName(TypeInfo(TSentido), Ord(SentidoTab)), 3, MaxInt);
  FPrevFocusCtrl:= Screen.ActiveControl;
end;

// Iniciar
procedure TForm1.FormCreate(Sender: TObject);
begin
  FPrevFocusCtrl:= Screen.ActiveControl;
  Screen.OnActiveControlChange:= ActiveControlChange;
end;
...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 29-09-2014 a las 02:30:31.
Responder Con Cita
  #3  
Antiguo 28-09-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
oscarac,

Cita:
Empezado por oscarac
...puedo salir con Tab y el control pasa al siguiente Edit...si presiono Shift + Tab el control va al Edit anterior...quisiera saber si es que el control va al siguiente Edit o al anterior Edit...¿Hay una forma de saberlo?...


Revisa este código:
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;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
  private
    { Private declarations }
    procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Detecta si se presiono la(s) tecla(s) Tab ó Shift + Tab hacia ó desde un Control TEdit
procedure TForm1.CMDialogKey(var Message: TCMDialogKey);
var
   State : TKeyboardState;

begin

   inherited;

   if (Screen.ActiveControl is TEdit) then
   begin

      GetKeyboardState(State);

      if ((State[VK_Shift] and 128) <> 0) and (Message.CharCode = VK_Tab) then
         ShowMessage('VK_Shift + VK_Tab ha sido presionada');

      if ((State[VK_Shift] and 128) = 0) and (Message.CharCode = VK_Tab) then
         ShowMessage('VK_Tab ha sido presionada');

   end;

end;

end.
El código anterior en Delphi 7 sobre Windows 7 Profesional x32, detecta si se presiono la(s) tecla(s) Tab ó Shift + Tab hacia ó desde un Control TEdit, ignorando dicho evento en el resto de los controles del formulario.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 28-09-2014 a las 23:29:36.
Responder Con Cita
  #4  
Antiguo 29-09-2014
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 Oscar.

Ajustando el bosquejo anterior para su uso con los edits, quedaría:
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    ...
  private
    procedure ActiveControlChange(Sender: TObject);
  end;
...

implementation

uses TypInfo;

var
  PrevFocusCtrl: TWinControl;
  MaxTO: Integer = -2;

procedure TForm1.ActiveControlChange(Sender: TObject);
begin
  PrevFocusCtrl:= Screen.ActiveControl;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i, tbo:integer;
  PInfo: PPropInfo;
begin
  for i:= 0 to ControlCount-1 do
    if Assigned(GetPropInfo(Controls[i].ClassInfo, 'TabOrder')) then
    begin
      // Obtener máximo TabOrder
      tbo:= GetOrdProp(Controls[i], 'TabOrder');
      if tbo > MaxTO then MaxTO:= tbo;
      // Asignar evento a los edits
      if Controls[i].ClassType = TEdit then
        TEdit(Controls[i]).OnExit:= EditsExit;
    end;
  PrevFocusCtrl:= Screen.ActiveControl;
  Screen.OnActiveControlChange:= ActiveControlChange;
end;

procedure TForm1.EditsExit(Sender: TObject);
begin
  if (ActiveControl.TabOrder > PrevFocusCtrl.TabOrder) then
  begin
    // Aqui podes poner el proceso de validación, por ejemplo:
    try
      StrToFloat(TEdit(PrevFocusCtrl).Text);
    except
      PrevFocusCtrl.SetFocus;
      MessageBox(0,PChar('Error validando '+PrevFocusCtrl.Name),'',MB_ICONERROR);
    end;
  end;
end;
Excepto que no tengas en mente permitir el uso del mouse en la pantalla de ingreso... En cuyo caso bastaría con evaluar las combinaciones de teclas que indicas en tu mensaje.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
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
Busqueda con FindDialog hacia arriba Arkaz OOP 3 20-04-2010 17:58:00
Mostrar los datos por n columnas hacia abajo enecumene PHP 5 20-11-2008 21:59:36
Arrastrar documento hacia icono ¿Cómo? rafadf Varios 3 25-01-2007 12:20:56
arriba o abajo del Interface elcigarra Varios 1 18-01-2006 17:27:32
Como Capturar Las Flechas Arriba/abajo Presionadas MITOPE Varios 3 17-05-2004 20:51:55


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


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