Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-04-2007
Avatar de casacham
casacham casacham is offline
Miembro
 
Registrado: abr 2006
Ubicación: Cordoba->Argentina. Arboleas->Almeria->España
Posts: 184
Poder: 19
casacham Va por buen camino
Facilitando el cargado de datos

En el detalle de nuestras aplicaciones esta la diferencia que podemos hacer a la hora que nos elijan como diseñadores de bases de datos para empresas y ser reconocidos como serios programadores. Simplemente hay que prestarle atencion al usuario final y sus necesidades.
El siguiente truco esta diseñado para facilitar el ingreso de datos desde el formulario. La diferencia la nota el usuario final en aquellos formularios con grandes cantidades de objetos TDBEdit (mas de 7 al menos). Por ejemplo piensese en un formulario donde deben ser anotados los parametros de analisis de laboratorios de pacientes. Se trata de que al terminar de ingresar el dato, al presionar la tecla Enter el foco cambie al siguiente TDBEdit agilizando la tediosa tarea de cargar una base de datos. Normalmente el cambio de foco de un TDBEdit a otro se realiza con la tecla Tab, pero a veces esto resulta incomodo. Asi, para facilitar el ingreso debemos seguir estos pasos.

1) Echele un vistazo al formulario que va a transcribir. Fijese en el orden en que se presentan los datos en el papel escrito asi puede reproducir el mismo en su formulario en pantalla.
2) Coloque los TDBEdit necesarios para tal fin, con sus respectivos TLabel que describen el campo o tipo y estilo de dato que ingresaran.
3) El primer ordenamiento: Ahora va a ordenar la secuencia en que deben tomar foco cada casillero TDBEdit en su propiedad TabOrder del inspector de objetos poniendo el numero 0 para el primero, el 1 para el segundo y asi susecivamente hasta el ultimo TDBedit
4) Seleccione todos sus objetos TDBEdit y coloque True en la porpiedad TabStop del inspector de objetos.
5) Si tiene otros objetos en el formulario que no necesiten recibir foco, coloque el valor False a la propiedad TabStop.
6) Corra el formulario y chequee el orden presionando la tecla Tab.
7) Una vez hecho esto debera escribir muy poco codigo, como el siguiente.
8) Seleccione nuevamente todos sus objetos TDBEdit y en la pagina Events del inspector de objetos busque el evento OnKeyUp y haga doble click en el.

Fundamentos: Utilizamos este evento para capturar, no cuando el usuario presiona la tecla, sino cuando la libera tras presionarla. Una vez activado el evento debemos testear que tecla presiono; en nuestro caso nos interesa la tecla Enter o VK_RETURN. Si es afirmativa nuestra condicion haremos que de forma programatica se presione la tecla Tab. Esto hara que cambie de foco al siguiente TDBEdit siguiendo el orden arbritario definido en el Object Inspector segun la propiedad TabOrder. Para presionar teclas a traves del Delphi utilizamos el procedimiento "SendKeyDown" y luego inmediatamente para liberar la 'presion' "SendKeyUp". El procedimiento predefinido es el siguiente: SendKeyDown (AReceiver:TWinControl;Key: Word; Shift: TShiftState);Donde "AReceiver" es la variable que contiene el objeto en el cual deseamos que sea presionada la tecla, "Key" la tecla que deseamos presionar y "shift" el estado de la tecla shift al momento de presionar key. Luego utilizamos "SendKeyUp" en el mismo sentido, pero simplemente para decir que solo presionamos una sola vez la tecla. A veces la utilizacion de "SendKeyUp" puede ser alternativa. Ya lo que queda es pues ver el codigo escrito.
Código Delphi [-]
procedure TForm1.DBEdit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
   procedure Apriete(Objeto:TWinControl; Tecla:Word; Estado:TShiftState);
     begin
        SendKeyDown(Objeto,Tecla,Estado);
        SendKeyUp  (Objeto,Tecla,Estado);
     end;
begin
  If (sender is TEdit) and (Key=VK_RETURN) Then Apriete((Sender AS TcxDBTextEdit),VK_TAB,Shift);
  If (sender is TEdit) and (Key=VK_DOWN)   Then Apriete((Sender AS TcxDBTextEdit),VK_TAB,Shift);
end;

Podemos hacer un agregado final, si es que esto facilitaria mucho mas el ingreso. Suponiendo que nuestra secretaria deba ingresar varios registros de analisis de laboratorio del mismo paciente. Podriamos hacer que al llegar al ultimo TDBedit se desencadene el evento metodo POST de nuestra tabla y seguidamente la pongamos en el estado de dsInsert. Para ello simplemente agregamos el siguiente codigo a nuestro event comunitario, suponiento que DBEdit28 es nuestro ultimo TDBEdit.
Código Delphi [-]
procedure TForm1.DBEdit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
   procedure Apriete(Objeto:TWinControl; Tecla:Word; Estado:TShiftState);
     begin
        SendKeyDown(Objeto,Tecla,Estado);
        SendKeyUp  (Objeto,Tecla,Estado);
     end;
begin
  If (sender is TDBEdit) and (Key=VK_RETURN) Then Apriete((Sender AS TDBEdit),VK_TAB,Shift);
  If (sender is TDBEdit) and (Key=VK_DOWN)   Then Apriete((Sender AS TDBEdit),VK_TAB,Shift);
  If Sender=DBEDit28 then begin
     Table1.Post;
     Table1.Insert;
     end;
end;

ACLARACIONES PARA NOVATOS: Sender es una variable del tipo TOBject que puede convertirse con la ayuda del operador as en cualquier objeto. Cuando un objeto responde ante un evento en el cual esta implicada la variable Sender, como en la mayoria de los eventos; Sender adquiere todas las propiedades del objeto en cuestion (name, parent, classtype, etc.). Asi, antes de convertirlo en el, debemos testear a que clase pertence y es alli cuando entra en juego la palabra reservada "is" que nos sirve para dicho fin. Si sender es de la clase TMaskEdit, se generara un RuntimeError (solo cuando corra el programa) si intentamos convertirlo a TDBEdit utilizamdo "as".
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 20:10:51.


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