Autore Topic: [RISOLTO]Sarà capitato anche a voi  (Letto 1077 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
[RISOLTO]Sarà capitato anche a voi
« il: 13 Marzo 2010, 19:55:29 »
Quando, all'interno dell'editor di Gambas, clicco sul pulsantino Esegui, il programma si avvia senza mostrare però la propria FMain.Form e se, come può capitare, nel corso dell'esecuzione del codice, viene esploso un messaggio del tipo .Info o .Error, la suddetta finestra si apre nel bel mezzo della finestra di editor di Gambas, mentre io me l'aspetto dentro la finestra contenente la mia FMain.Form.
Pertanto, vorrei dire al sig. Gnome (almeno credo) nella prima istruzione della FMain.class di rendere immediatamente visibile la finestra che mi interessa. Credo che dovrei scrivere un comando "Shell", ma sono abbastanza scarso in materia per arrivarci da solo. ::)
Ciao a tutti.
« Ultima modifica: 22 Marzo 2010, 10:43:48 da Picavbg »
:ciao:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Sarà capitato anche a voi
« Risposta #1 il: 13 Marzo 2010, 19:58:07 »
Non ho capito..ti riferisci al fatto che certe volte non parte il progetto?

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Sarà capitato anche a voi
« Risposta #2 il: 13 Marzo 2010, 22:02:21 »
Non ho capito..ti riferisci al fatto che certe volte non parte il progetto?
Mi dispiace essere stato infelice nell'esoposizione della mia necessità.
Allora: apro Gambas ed il suo editor indicando il programma che che voglio modificare e possibilmente provare.
Dopo avere modificato ed eventualmente aggiunto del codice, clicco sul pulsantino di "Esegui" della barra degli strumenti, oppure attraverso il Menu Debug-->Esegui.
Il programma viene eseguito dall'interprete, dopo i soliti controlli preliminari sulla sintassi del codice. In queste condizioni, se, nel corso dell'esecuzione viene incontrata un'istruzione "Message.Info", per Es., la relativa finestra si apre al centro dello schermo, davanti alla finestra dell'editor di Gambas; per cui piuttosto che vedere la finestra del messaggio sovrapposta alla finestra della FMai.Form del programma avviato, la vedo sovrapposta alla finestra dell'editor di Gambas, riportante la pagina di istruzioni che avevo davanti al momento del "RunTime".
Spero di avere ora chiarito quello che volevo dire.
La domanda è: posso fare in modo di fare comparire un'eventauale finestra "Message.info/error/..." che dovesse aprirsi subito dopo l'avvio, sulla FMain.Form del programma?
Ora dovrei inserire un faccina grondante sudore dalla fronte, ma non cel'ho. ;)
Ciao.
:ciao:

Offline Berserker79

  • Grande Gambero
  • ***
  • Post: 201
    • Mostra profilo
Re: Sarà capitato anche a voi
« Risposta #3 il: 14 Marzo 2010, 00:48:01 »
Se l'errore viene generato prima che il form main venga mostrato credo sia normale. comunque mi sono accorto pure io che eseguendo il programma dall'editor, questo non venga mostrato in primo piano, ma dietro la finestra dell'editor. la cosa comunque varia a seconda delle versioni di gambas. dovresti provare generando l'eseguibile e verificare così cosa succede.

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Sarà capitato anche a voi
« Risposta #4 il: 14 Marzo 2010, 11:37:22 »
Se l'errore viene generato prima che il form main venga mostrato credo sia normale.
Essendo la FMain.Form e la FMain.class sempre i primi oggetti ad essere referenziati nell'esecuzione di un programma, sembra che la FMain.class svolga il suo compito anticipando la formazione della FMain.Form, mentre essendo la sua classe, dovrebbe svolgere il suo lavoro dopo avere avviato la composizione dell'oggetto immagine. Insomma è come se in una manifestazioone teatrale, l'inizio dello spettacolo avvenisse col sipario ancora chiuso e gli attori cominciassero la recita; lo spegttatore sentirebbe solo le voci, senza vedere la scena, coi personaggi che ne fanno parte.
Tu tici che sia normale? Non so, può darsi; però tu dici anche:
Citazione
la cosa comunque varia a seconda delle versioni di gambas
. Ma allora, qual'è la normalità?
A prescindere da tutto ciò, la mia domanda è: È possibile da programma comandare l'emissione di una Form istantaneamente, come si fa per un "Message.info/Errore/Question"? Spero che lo sia e che basti solo imparare come.
Ciao.
:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Sarà capitato anche a voi
« Risposta #5 il: 16 Marzo 2010, 13:11:54 »
Un form è una finestra che ha una "vita" propria.
Il codice inserito nell'evento Form_Open viene eseguito "prima" che il form risulti visibile anche se in realtà dovrebbe essere il contrario.

Se invece inserisci il codice nell'evento Form_Activate esso verrà eseguito dopo che il form è stato mostrato e mentre diventa attivo, cioè diventa la finestra con il focus.... ma! Ma c'è un ma: se in questo codice si genera un errore, la visualizzazione del form potrebbe risultare incompleta perché il disegno del form potrebbe essere bloccato dall'errore che si genera in Activate.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Sarà capitato anche a voi
« Risposta #6 il: 17 Marzo 2010, 01:32:34 »
@ Leo:
Ecco finalmente la risposta che aspettavo. Leo, sei super, anzi superissimo!
Avevo intuito che Form_Open agisse prima ancora che l'immagine della Form venisse disegnata sullo schermo, ma pensavo che esistesse il modo per svegliare la form prima che fosse eseguito il codice dell'evento Open.
Prima di scrivere il post n°1 di questa discussione, avevo cercato l'evento activate, ma gli occhi mi hanno tradito, e scorrendo gli eventi disponibili per la form non mi sono accorto di averla lì a portata di mano.  :-X
Ora tu aggiungi che, in caso di un errore qualsiasi incontrato dal processore nell'esecuzione del codice interno alla Form_Activate, intanto che viene compilata la form, blocca il completamento del disegno. Va bene, tanto se l'errore si verifica durante l'esecuzione del codice scritto nella Form_Open, la Form non compare proprio. Mi pare che tutto sommato l'eventuale errore dia sempre noia, in ogni caso.
Ma stando così le cose, significa che:
1) se voglio eseguire del codice in una Form, in modo da modificare le proprietà degli oggetti interni alla Form stessa, prima che  essa venga disegnata, devo scrivere il codice nella Form_Open;
2) se invece voglio fare apparire sullo schermo una Form prima di eseguirne il codice devo scrivere il codice nella Form_Activate;
3) e se, ancora, volessi eseguire del codice richiamando una Form, senza però farla comparire mai, e proseguire poi, dopo avere ripreso il controllo del focus? Cioè farla lavorare senza mostrarla assolutamente sullo schermo? Dovrei semplicemente utilizzare la proprietà Formx.visibile=false o esiste un qualche altro evento capace di svolgere tale funzione?
Scusa se approfitto delle tue conoscenze, ma ho tanta voglia di imparare e, siccome per imparare bisogna prima capire, aspetto un ulteriore cenno di scienza. :D  Grazie!
Ciao.
:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Sarà capitato anche a voi
« Risposta #7 il: 17 Marzo 2010, 10:32:52 »
Poniamo un esempio molto semplice. Non far apparire la finestra se si verifica una condizione, ad esempio l'esecuzione di 2 istanze del programma. Perciò all'avvio del programma esso controlla di essere già in esecuzione (sul come ti rimando ad un'altra discussione, non fa parte della problematica che stiamo trattando) e si chiude in caso affermativo.

Se tu metti il controllo nell'evento Activate avrai la finestra che compare e scompare perché essa viene disegnata dall'evento Open e poi l'esecuzione viene passata ad Activate. Se invece metti il controllo in Open, nel caso in cui il programma venga chiuso prima del termine dell'esecuzione del codice contenuto nell'evento il form non verrà mai disegnato e la finestra non comparirà a video. Puoi fare un semplicissimo test inserendo ME.Close sia in Form_Activate che in Form_Open per vedere cosa succede.

Ovviamente dipende anche dalle esigenze: ad esempio potresti volere un test prima che il controllo passi all'utente ma da eseguire a finestra disegnata. Allora ti serve l'evento Activate.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Sarà capitato anche a voi
« Risposta #8 il: 18 Marzo 2010, 23:19:18 »
@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:
Codice: [Seleziona]
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:
Codice: [Seleziona]
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.
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Sarà capitato anche a voi
« Risposta #9 il: 22 Marzo 2010, 00:13:28 »
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:
Codice: [Seleziona]
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:
Codice: [Seleziona]
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.
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Sarà capitato anche a voi
« Risposta #10 il: 22 Marzo 2010, 10:43:18 »
Ce l'ho fatta. Ho spostato il richiamo delle subroutine all'interno di quei pulsanti che di volta ion volta, a seconda delle condizioni incontrate, vengono attivati ed ho ottenutopil funzionamento desiderato. ;D ;D
Ciao.
:ciao: