Autore Topic: [RISOLTO] Eliminare CASE da chiamate ripetitive  (Letto 1456 volte)

Offline aulin

  • Gambero
  • **
  • Post: 83
    • Mostra profilo
[RISOLTO] Eliminare CASE da chiamate ripetitive
« il: 28 Giugno 2010, 19:53:33 »
Codice: [Seleziona]
 Select Case ModComune.FormChiamante
                      Case "ObArchProgettiMod"
                                               ObArchProgettiMod.TB_CodiceProgetto.Text = Trim$(hRecProg!prog_codice)
                      Case "ObVisProgetti"
                                               ObVisProgetti.TB_CodiceProgetto.Text = Trim$(hRecProg!prog_codice)
                      Case "ObInsAzioni"
                                               ObInsAzioni.TB_CodiceProgetto.Text = Trim$(hRecProg!prog_codice)
                      Case "ObAnnAzioni"
                                               ObAnnAzioni.TB_CodiceProgetto.Text = Trim$(hRecProg!prog_codice)
                      Case "ObInsDatiMensili"
                                               ObInsDatiMensili.TB_CodiceProgetto.Text = Trim$(hRecProg!prog_codice)
                      Case "ObVisProgDati"
                                               ObVisProgDati.TB_CodiceProgetto.Text = Trim$(hRecProg!prog_codice)
                      Case "ObVisProgAzione"
                                               ObVisProgAzione.TB_CodiceProgetto.Text = Trim$(hRecProg!prog_codice)
               End Select
Avevo già postato la domanda formulata in maniera diversa.
Questa parte di codice viene richiamata da vari programmi/form.
Ogni programma chiamante ha una  textbox denominata TB_CodiceProgetto dove viene passato un codice letto da un db.
Esiste una formulazione elegante per eliminare questa sfilza di condizioni case.
Il nome del Form chiamante sta in un modulo comune ModComune.FormChiamante. E' possibile ?

« Ultima modifica: 30 Giugno 2010, 23:38:56 da aulin »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Eliminare CASE da chiamate ripetitive
« Risposta #1 il: 28 Giugno 2010, 20:04:30 »
ci sono vari modi, forse il più semplice è utilizzare una funzione che ti ritorna un valore

ad esempio nel form1 chiamante metti: (la variabile cod_prog deve essere pubblica)
Codice: gambas [Seleziona]




 ObArchProgettiMod.TB_CodiceProgetto.Text=trova_codice()


nella tua funzione invece:
Codice: gambas [Seleziona]

PUBLIC SUB trova_codice()as string

DIM risultato as string


risultato=Trim$(hRecProg!prog_codice)

RETURN risultato




Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Eliminare CASE da chiamate ripetitive
« Risposta #2 il: 28 Giugno 2010, 20:08:46 »
in alternativa puoi utilizzare gli oggetti,

ad esempio nel form chiamante richiami la funzione che ti serve dando il nome dell' oggetto in cui deve scrivere il risultato:



Codice: gambas [Seleziona]


trova_codice("ObArchProgettiMod.TB_CodiceProgetto")



Codice: gambas [Seleziona]


PUBLIC SUB trova_codice(oggetto as OBJECT)


     oggetto.text=Trim$(hRecProg!prog_codice)

END


« Ultima modifica: 28 Giugno 2010, 21:31:44 da fsurfing »

Offline aulin

  • Gambero
  • **
  • Post: 83
    • Mostra profilo
Re: Eliminare CASE da chiamate ripetitive
« Risposta #3 il: 30 Giugno 2010, 08:38:52 »
Scusami se rispondo con ritardo , ma ho capito il concetto ma mi risulta difficile l'applicazione. Non riesco a inserire opportunamente nel programma esistente le semplici istruzioni che hai postato.
il programma chiamante :
Codice: [Seleziona]
Public Sub BTN_SceltaProgetto_Click()
          ObElencoProgetti.Show
End

Public Sub TB_CodiceProgetto_Change()
Dim sTabella, sWhere, sCondizione As String
  ConnettiDB   
            sTabella = sFileProgetti
            sWhere = "prog_codice=&1"
            sCondizione = Trim(TB_CodiceProgetto.Text)
            hRecProg = $hConn.Find(sTabella, sWhere, sCondizione)
            Visualizza_Progetto()
            Visualizza_Azioni()
End



tramite il BTN_SceltaProgetto  richiama un programma che visualizza i progetti presenti in un DB, questo programma ripassa al programma chiamante il codice del progetto con Obxxxxx.TB_CodiceProgetto.Text(l'insieme delle CASE )  e a questo punto a fronte dell'evento change il programma chiamante mi visualizza i dati del Progetto. Dove inserire la chiamata alla funzione che mi dovrebbe ridare il codice del progetto? Il programma che mi visualizza l'elenco dei progetto devo sempre chiamarlo. Scusatemi ma la programmazione ad oggetti non è il mio forte.



Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Eliminare CASE da chiamate ripetitive
« Risposta #4 il: 30 Giugno 2010, 12:35:52 »
potrebbe essere qualcosa del genere:
Codice: gambas [Seleziona]


' da inserire nel form chiamante che presupponiamo si chiami Fpippo
PUBLIC SUB BTN_SceltaProgetto_Click()
          
          ObElencoProgetti.load
          ObElencoProgetti.Show
          ObElencoProgetti.destinatario="Fpippo.TB_CodiceProgetto"
END



PUBLIC SUB TB_CodiceProgetto_Change()

DIM sTabella, sWhere, sCondizione As String
  ConnettiDB    
            sTabella = sFileProgetti
            sWhere = "prog_codice=&1"
            sCondizione = Trim(TB_CodiceProgetto.Text)
            hRecProg = $hConn.Find(sTabella, sWhere, sCondizione)
            Visualizza_Progetto()
            Visualizza_Azioni()
End


'''''codice da inserire in ObElencoProgetti


'variabile pubblice che memorizza il destinatario
  
PUBLIC destinatario as object


PUBLIC SUB evento_di _selezione_progetto()



destinatario.text=Trim$(hRecProg!prog_codice)  


END








ps: un consiglio che non centra nulla con la tua richiesta:

con alcune combinazioni di gambas e gnome può capitare che avviando un form solamente con l' istruzione  nomeform.show,alla chiusura ti tale form questo crashi, per sicurezza io solitamente avvio un form con la doppia istruzione:

nomeform.load
nomeform.show
« Ultima modifica: 30 Giugno 2010, 12:44:25 da fsurfing »

Offline aulin

  • Gambero
  • **
  • Post: 83
    • Mostra profilo
Re: Eliminare CASE da chiamate ripetitive
« Risposta #5 il: 30 Giugno 2010, 13:56:14 »
ObElencoProgetti.Destinazione="ObVisProgAzioni.TB_CodiceProgetto"  - Messaggio di errore: Type mismatch : wanted Object, got string instead.
 

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Eliminare CASE da chiamate ripetitive
« Risposta #6 il: 30 Giugno 2010, 19:27:16 »
si giusto, non devi mettere le virgolette al nome del' oggetto:

ObElencoProgetti.Destinazione=ObVisProgAzioni.TB_CodiceProgetto

Offline aulin

  • Gambero
  • **
  • Post: 83
    • Mostra profilo
Re: [RISOLTO] Eliminare CASE da chiamate ripetitive
« Risposta #7 il: 30 Giugno 2010, 23:39:36 »
Grazie. Era proprio la soluzione che cercavo.