Simplificar codigo.

Ariel Nardelli pan_python en yahoo.com.ar
Mie Ago 31 07:05:30 CEST 2005


Hola!
Estoy haciendo un sistema de gestion (wx + python2.3) que tiene muchos 
textbox que "levantan" info desde pantalla para grabar todos esos datos 
en la base de datos.

Haciendo el programa y tratando de afinar mas el codigo (sobre todo 
sacar el codigo repetitivo) veo que una rutina sobre todo se me repite 
constantemente solo me cambia 2 lineas pero los demas es siempre el 
mismo y entonces se me ocurrio simplificar todo y tratar de usar solo 
una rutina.

Les explico con ejemplos, tengo dentro de programa los armados de 
pantalla y despues los eventos, aca un ejemplo de 2 eventos...

        # p_apno -3-  (Razon Social)
        EVT_TEXT_ENTER(self, 3,self.evt_get)
        EVT_TEXT(self, 3,self.evt_get)
        EVT_CHAR(self.tb_apno, self.p_apno_ev_char)
        EVT_SET_FOCUS(self.tb_apno,self.evt_skip) # toma foco... 
        EVT_KILL_FOCUS(self.tb_apno,self.p_apno_ev_df) # deja el foco...

        # p_dire -4-  (Direccion)
        EVT_TEXT_ENTER(self, 4,self.evt_get)
        EVT_TEXT(self, 4,self.evt_get)
        EVT_CHAR(self.tb_dire, self.p_dire_ev_char)
        EVT_SET_FOCUS(self.tb_dire,self.evt_skip) # toma foco... 
        EVT_KILL_FOCUS(self.tb_dire,self.p_dire_ev_df) # deja el foco...

Toman el evento de apno y dire y ejecutan segun lo que se pulsa las 
rutinas, tengo 2 generales que solo sacan el enter y esas cosas que son 
la evt_get y el evt_skip que ya lo tengo simplificado en una rutina, 
despues tengo las otras dos, una donde asigno variables y verifico que 
los datos cargados sea lo que quiero (fechas correctas y demases) que 
esta siempre cuando pierdo el foco o sea verifico los datos y asigno 
variables siempre que pierdo el foco no antes, por lo tanto esta rutina 
siempre va a ser unica por cada texbox pero la que quiero "simplificar" 
es la de evt_char, la que va verificando cada tecla pulsada, esto lo 
hago porque en algunos casos necesito solo poner numeros o xx cosas 
filtradas y uso estas rutinas para filtrar lo que me pulsan del teclado.
Pero una de las cosas por lo que mas la uso es que dependiendo lo que 
pulse del teclado fuerzo a pasar al foco, para lograr que pulsando F12 
se pase el foco al proximo texbox y pulsando F11 pase el foco al textbox 
anterior, ese es el uso fundamental de las dos rutinas, aca las pongo:

    # Eventos p_apno -3-
    def  p_apno_ev_df(self,event):  # Deja Foco.
        if len(self.tb_apno.GetValue()) <> 0:
            self.tm_apno = self.tb_apno.GetValue()
        else:
            self.tm_apno = ''
        event.Skip()
    def p_apno_ev_char(self,event):
       # 353 es F12 y 352 es F11  (f12 avanza, f11 retrocede)
        key = event.GetKeyCode()
        if key == 9 or key == 353 or key == 13: # Tecla TAB o F12 Pasa foco.
            self.tb_dire.SetFocus()
            event.Skip()
        if key == 352: # F11 retrocede
            self.tb_ncli.SetFocus()
            event.Skip()
        if key < WXK_SPACE or key == WXK_DELETE or key > 255:
            event.Skip()
            return
        event.Skip()

    # Eventos p_dire -4-
    def  p_dire_ev_df(self,event):  # Deja Foco.
        if len(self.tb_dire.GetValue()) <> 0:
            self.tm_dire = self.tb_dire.GetValue()
        else:
            self.tm_dire = ''
        event.Skip()
    def p_dire_ev_char(self,event):
       # 353 es F12 y 352 es F11  (f12 avanza, f11 retrocede)
        key = event.GetKeyCode()
        if key == 9 or key == 353 or key == 13: # Tecla TAB o F12 Pasa foco.
            self.tb_copo.SetFocus()
            event.Skip()
        if key == 352: # F11 retrocede
            self.tb_apno.SetFocus()
            event.Skip()
        if key < WXK_SPACE or key == WXK_DELETE or key > 255:
            event.Skip()
            return
        event.Skip()

Si la miran, lo unico que varia es si pulso tab, F12 o enter paso el 
evento al siguiente tb o si pulso F11 paso el foco al tb anterior.
Esta rutina se repite en todos los tb salvo la parte que marca donde ir 
segun estas teclas, entonces se me ocurrio simplificar todo y dejar una 
sola rutina que lo haga.
Tengo ordenado todo por orden si se fijan al asignar los tb yo no uso -1 
sino que pongo un numero asi puedo mantener un orden cuando cargo los 
datos y "marcar" el orden con que voy tomando la informacion.
La cosa es, hay alguna manera en esta rutina de "detectar" en que orden 
estoy? asi, simplemente cuando tengo que pasar el foco al orden 
siguiente seria un setfocus +1 y cuando quiero pasar el orden al tb 
anterior seria un setfocus -1 :).
Lo que necesitaria saber es como detectar en que orden estoy y ademas 
como hacer para pasar el foco no como lo estoy haciendo aca 
(sef.tb.SetFocus()) sino hacerlo directamente sobre el orden algo asi 
como self.orden.SetFocus().

Bueno, Agradezco la ayuda y ademas si alguien tiene una mejor idea de 
hacer esto y me lo cuenta le estare muy agradecido.

Gracias!
Ariel

-- 
Saludos
Panflin

NO al limite de adsl de TELECOM
Firma YA el petitorio NACIONAL para que TELECOM no nos estafe con el limite del ADSL, la direccion es:
http://peticionbandaancha.com/

www.reconquista.com.ar




Más información sobre la lista de distribución Python-es