@leo72:
Ho fatto una prova banale, trasferendo tutto il codice contenuto nella FMain.Open, alla FMain.Activate. Ebbene ho potuto vedere finalmente comparire la form d'apertura del programma, con la sua barra di menù, però ...ho incontrato un ostacolo insuperabile, ostacolo che, utilizzando l'evento FMain.Open, non si presenta, in quanto, lo stesso codice va liscio come l'olio. Ma vediamo cosa succede:
PUBLIC SUB Form_Activate()
DIM $_NomeTbDb AS String
DIM $_X1 AS String
VerifDbExist 'verifica l'esistenza del Db "ContabFamdb" e se non esiste lo crea
IF b_SwErro = TRUE THEN
ME.Close
la routine chiamata contiene:
PUBLIC SUB VerifDbExist() 'verifica l'esistenza del Db "ContabFamdb" e se non esiste lo crea
DIM DB_Connection AS NEW Connection 'inizializza la nuova connessione
b_SwErro = FALSE
VarGlob.$_DbPath = Application.path & "/ContabFam_DB" 'Percorso di ricerca del Database ContabFam.db"
WITH DB_Connection
.Type = "sqlite3"
.Host = VarGlob.$_DbPath
.Login = ""
.Password = ""
.Open
END WITH
IF DB_Connection.Databases.Exist("ContabFamdb") THEN 'verifica l'esistenza del DB e se esiste viene aperto automaticamente
DB_Connection.Close 'chiude il DB
ELSE
SELECT Message.ERROR("Attenzione! -> Database 'ContabFam.db' inesistente" & Chr(10) & Chr(10) & "Cosa vuoi fare?", "CREA ora Database", " CHIUDI programma ")
CASE 1
DB_Connection.Close
CreDBContab = NEW CreaDBContab(b_SwErro) 'nome della classe dinamica di creazione del Database "ContabFamdb" con tutte le sue tabelle
CASE ELSE
b_SwErro = TRUE
END SELECT
ENDIF
END
La presenza dell'emissione del messaggio d'errore, per "non trovato", provoca l' errore message already displeied. Ho eseguito il debug del programma in quel punto ed ho potuto constatare che l'interprete esegue il codice bene fino alla "Select Message", perchè effettivamente il DB era stato cancellato da me manualmente prima della prova, però subito dopo quell'struzione ritorna a ripercorrere il codice della routine dalla sua prima riga ed a questo punto incappa nell'errore.
Tutto ciò mi ha costretto ad abbandonare l'uso della FMain.Activate, però, secondo me, è un'anomalia bella e buona. >:(
Ciao.
Mi accorgo di essere entrato in una strada senza uscita.
Ho modificato il programma togliendo tutto dalla Form_Open della FMain.class, trasferendo tutte le istruuzioni dentro la Form5.class che richiamo dalla Form_Open della FMain.class, in modo da potere ottenere intanto l'emissione dell'oggetto-immagine FMain.Form.
A parte ciò, riesco ad ottenere la giusta sequenza operativa delle varie combinazioni di Form5.Form, a seconda del contenuto del DB agganciato al programma.
Le istruzioni della Form_Open(Form5.class) sono:
1)VerifDbExist 'verifica l'esistenza del Db "ContabFamdb" e se non esiste lo crea
2)IF b_SwErro = FALSE THEN
3) VerifTbDbExist 'verifica l'esistenza delle Tabelle del Db "ContabFamdb" e se non esistono le crea
4)ENDIF
5)VerifTbDbVuote 'verifica che le Tabelle del Db "ContabFamdb" non siano vuote ed eventualmente ricarica quelle vuote col contenuto del file 'DumpDb.txt'
6)VerifTbDbDisord 'verifica che le Tabelle del Db "ContabFamdb" non contengano fuori sequenza e se le trova ne chiede il riordino
7)End
Fino all'esecuzione dell'istruzione 4), va tutto bene. I guai cominciano con le istruzioni 5) e 6), perchè, pur essendo contemplate dentro le subroutine, le condizioni di emissione della Form5.Form per permettere all'operatore di attivare le sue scelte, il programma procede fino alla "End" ed espone la Form5.Form con le attivazioni riferite alla linea 5), trascurando completamente il richiamo voluto nella riga 6)
Per maggiore chiarezza riporto qui il contenuto della subroutine VerifTbDbVuote:
PUBLIC SUB VerifTbDbVuote() 'verifica che le Tabelle del Db "ContabFamdb" non siano vuote ed eventualmente ricarica quelle vuote col contenuto del file 'DumpDb.txt'
DIM DB_Connection AS NEW Connection 'inizializza la nuova connessione
DIM b_Sw AS Boolean
DIM i AS Integer
DIM i_Conta AS Integer
DIM o_ElNmTbDb AS Object
DIM o_NomiTbDb AS NEW Object[]
DIM $_NomeTbDb AS String
DIM $_NomiTbDb AS NEW String[]
b_SwErro = TRUE
WITH DB_Connection
.Type = "sqlite3"
.Host = VarGlob.$_DbPath
.Name = VarGlob.$_DbNome
.Login = ""
.Password = ""
.Open
END WITH
o_NomiTbDb.Add(ME.causalifreq) 'carica i puntamenti a vari oggetti CheckBox della Form5 nella tabella o_NomiTbDb
o_NomiTbDb.Add(ME.componfam) 'carica i puntamenti a vari oggetti CheckBox della Form5 nella tabella o_NomiTbDb
o_NomiTbDb.Add(ME.ggaperte) 'carica i puntamenti a vari oggetti CheckBox della Form5 nella tabella o_NomiTbDb
o_NomiTbDb.Add(ME.movimgg) 'carica i puntamenti a vari oggetti CheckBox della Form5 nella tabella o_NomiTbDb
o_NomiTbDb.Add(ME.partmovv) 'carica i puntamenti a vari oggetti CheckBox della Form5 nella tabella o_NomiTbDb
o_NomiTbDb.Add(ME.piancont) 'carica i puntamenti a vari oggetti CheckBox della Form5 nella tabella o_NomiTbDb
o_NomiTbDb.Add(ME.prestmom) 'carica i puntamenti a vari oggetti CheckBox della Form5 nella tabella o_NomiTbDb
o_NomiTbDb.Add(ME.racodvoci) 'carica i puntamenti a vari oggetti CheckBox della Form5 nella tabella o_NomiTbDb
o_NomiTbDb.Add(ME.restacassagg) 'carica i puntamenti a vari oggetti CheckBox della Form5 nella tabella o_NomiTbDb
o_NomiTbDb.Add(ME.riepmovg) 'carica i puntamenti a vari oggetti CheckBox della Form5 nella tabella o_NomiTbDb
o_NomiTbDb.Add(ME.riepnewrecdb) 'carica i puntamenti a vari oggetti CheckBox della Form5 nella tabella o_NomiTbDb
FOR EACH o_ElNmTbDb IN o_NomiTbDb
$_NomiTbDb.Add(o_ElNmTbDb.Name)
NEXT
b_SwErro = FALSE 'predispone che tutte le tabelle del 'ContabFamdb' siano tutte popolate
i = 0
FOR EACH o_ElNmTbDb IN o_NomiTbDb
TRY RecTab = DB_Connection.edit($_NomiTbDb[i])
IF ERROR THEN
i_Conta = 0
ELSE
i_Conta = RecTab.Count 'estrae il n° di record presenti in ciascuna delle tabelle del 'ContabFamdb'
ENDIF
IF o_ElNmTbDb.Name = $_NomiTbDb[i] THEN
IF i_Conta = 0 THEN
o_ElNmTbDb.enabled = TRUE
o_ElNmTbDb.value = TRUE
b_SwErro = TRUE 'condizione attestante che almeno una tabella del 'ContabFamdb' è vuota
ENDIF
ENDIF
INC i
NEXT
DB_Connection.Close 'chiude il DB
IF b_SwErro = TRUE THEN 'almeno una tabella del 'ContabFamdb' è vuota
VarGlob.$_SW = "RiPopTb"
ME.Text = "Tabelle del DB " & Chr(34) & "ContabFam" & Chr(34) & " Vuote"
ME.Tag = "tabvuote"
ME.Panel1.Width = 293
ME.Label14.Visible = TRUE
ME.Puls_Ripopola.Enabled = TRUE
ME.Puls_Ripopola.Visible = TRUE
ME.Puls_CreaTab.Enabled = FALSE
ME.Puls_CreaTab.Visible = FALSE
ME.Puls_ViaOrdTab.Enabled = FALSE
ME.Puls_ViaOrdTab.Visible = FALSE
ME.Visible = TRUE
ME.Puls_Ripopola.SetFocus 'con questa istruzione pensavo di attivare lo status di "ATTESA OPERATORE"
ELSE
ME.Hide
ENDIF
END
???
Spero che qualcuno mi possa suggerire come obbligare il programma di andare, a questo punto, in attesa operatore
Ciao.