Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Nascondere un form...stò impazzendo!!!

Oggi decisamente non è giornata, dopo la bella figura fatta con gli
oggetti adesso problemi anche con i form...riapriamo il circo, altro
post.
Scrivo questo in un modulo:
Option Explicit
Public frmSplash As frmSplash
Sub main()
    Dim frmPrincipale As frmPrincipale
 
    Set frmSplash = New frmSplash
    Set frmPrincipale = New frmPrincipale
 
    Load frmPrincipale
 
    frmSplash.Show vbModal
    ......
    ..
    ....
eseguo la riga, si apre il form e salto qua:
Private Sub Timer1_Timer()
    frmSplash.Hide
    ......
    ..
    ....
all' esecuzione di:
    frmSplash.Hide
stò ca**o di errore, ma che è????
È innanzitutto necessario chiudere o nascondere il form a scelta
obbligatoria principale (Errore 402)
La guida:
Il form a scelta obbligatoria che si sta cercando di chiudere o
nascondere non è il primo nell'ordine z. Causa e soluzione
dell'errore: 
Esiste un form a scelta obbligatoria che nell'ordine z precede quello
che si sta cercando di chiudere o nascondere.
Utilizzare l'istruzione Unload o il metodo Hide sui form a scelta
obbligatoria precedenti nell'ordine z. Un form a scelta obbligatoria è
un form visualizzato dal metodo Show, con l'argomento stile impostato
su 1 - vbModal.
Io non capisco...mi stò urtando oggi!!!!
Saluti... >:-(  ) AHHHHH!!!!

 su 1 - vbModal.
Beh, ti sei già risposto :-)
Che senso ha bloccare un'applicazione con un form Modale, nasconderlo e
lasciare l'applicazione bloccata?
Quindi: ho fai lo show non modale... O scarichi del tutto la form facendone
l'unload...
    Ciao
                Allanon

 post.
[SNIP]
Ma il timer in che form e'?
Se e' in frmPrincipale forse e' partito l'evento timer *prima* che terminasse il
Form_Load di frmSplash. o qualche inghippo del genere.
Comunque, se l'esigenza č solo quella di mostrare una finestra di avvio, puoi
farlo in maniera molto piů semplice, senza timer e form globali, ad esempio
cosě:
Sub main()
    Dim frmSplash As frmSplash
    Dim frmPrincipale As frmPrincipale
    Set frmSplash = New frmSplash
    Set frmPrincipale = New frmPrincipale
    'Visualizzi la finestra di avvio *non modale* e fai
    'un Refresh (o un Doevents) per assicurarti che sia visibile
    'prima di cominciare le procedure di caricamento.
    frmSplash.Show
    frmSplash.Refresh
    'carichi la finestra principale (non visibile)
    Load frmPrincipale
    'eventuali inizializzazioni varie
    '[...]
    'finito tutto quanto scarichi la splash form e visualizzi la principale
    Unload frmSplash
    Set frmSplash = Nothing
    frmPrincipale.Show
End Sub
Ciao
--
Luca Dormio
luca....@tin.it

 facendone l'unload...
Prova, continuerà a darti errore
finchè...lo dico? :)) Okz...finchè il form e la mia variabile si chiamano
allo stesso modo. Io non lo sapevo mica ma...il problema è proprio quello!!
Ricapitolando:
io ho do chiarato una variabile con lo stesso none del
mio form
    Public frmForm1 As frmForm1
ho poi eseguito:
    Sub
main()
        Set frmForm1 = New frmForm1
 
        frmForm1.Show
vbModal
    End Sub
visualizzo il form in modo modale e salto nell'
evento generetao dal Timer, fin qui nessun errore.
    Private Sub
Timer1_Timer()
        frmForm1.Hide
 
        Unload Me
    End Sub
qua dentro all' esecuzione di:
        frmForm1.Hide
errore del
cavolo. Il problema deriva dal fatto che la mia variabile e il form hanno
lo stesso nome. Scrivendo così io davo per scontato che vb si riferisse
alla variabile, come io intendevo fare, invece che al form!! Mentre credo
che accada proprio il contrario...è come se lui cercassi di creare una
nuova istanza di frmForm1, ma mi blocca perchè mi dice che c'è lo stesso
form visualizzato ed è modale!!!! E' quello il problema :)
Ho fatto delle
prove poco fa, la prima cambiando il nome al Form, e la cosa va senza
probleami, la seconda volta invece ho lasciato lo stesso nome ai due ma ho
modificato questa parte di codice:
    Private Sub Timer1_Timer()
'frmForm1.Hide
        Hide
 
        Unload Me
    End Sub
secondo te così che succede?? Funziona :))
Spiegazione logica:
Io posso
dichirare una variabile con lo stesso nome di un oggetto da me creato, e
non ho nessun problema (non ho provato ma sono quasi sicuro al 100% che
funzioni), mentre la stessa cosa non posso farla se creo una varibile
oggetto come un form (come stavo facendo io). Quando visualizzi un form vb
fa un istanza nascota del form appena visualizzato, per questo motivo di un
form puoi fare in qualunque parte di codice form. e vederne/usarne le
proprietà senza dover fare te un istanziamento del form stesso. Questo
accade perchè vb fa una parte del lavoro per te.
La stessa cosa invece,
non puoi farla per un tuo oggetto che, se non scrivi un set a manina,
nessuno creerà un istanza del tuo oggetto.
Morale della favola: 
- se
creo un oggetto come un form, nome_varibile MUST BE DIVERSO dal nome del
form :)
- se creo un mio oggetto, secondo me i nomi posso anche essere
gli stessi.
Problema risolto :))
Saluti ragassuoli...
PS: per il
problema dell' oggetto parameter dopo ti scrivo una mail :))
--------------------------------
Inviato via 
http://usenet.iol.it
 

puoi farlo in
maniera molto piů semplice, senza timer e form globali
Si si, ma si puň
fare anche in altri modi ancora...considera che lo splash nel mio caso si
preccupa solo di tirare su una stupida connessione ad un db access locale e
di leggere tre fessata dal regedit...il tutto fattibile im neno di un
secondo e lo splash non me lo vedrebbe nessuno. Lo scopo del timer era
quello di far vedere lo splash!!! E siccome ho perso tempo per disegnarlo
carino :P chi usa il programma lo deve vedere, e basta :))
La soluzione
al mio problema č nel post di risposta a quello di Allanon, leggi li.
Saluti...


 nessuno creerà un istanza del tuo oggetto.
Secondo me questa spiegazione logica non è molto logica :-)
Casomai questa è una descrizione logica!
La spiegazione è questa:
Visibilità delle variabili. E' possibile dichiarare variabili con lo stesso
nome, ma esistono delle regole che stabiliscono quale variabile prevalga
sull'altra nel caso si trovino ad essere "vive" entrambe. Nel tuo caso,
poichè la variabile globale prevale, tu accedi alla form (che altro non è
che una variabile globale dichiarata d aVb) e non alla variabile. Putroppo
le regole di visibilità non me le ricordo bene, e non le ho trovate
sull'help, comunque il motivo è questo.
[...]

 Visibilità delle variabili. E' possibile dichiarare variabili con lo
stesso nome, ma esistono delle regole che stabiliscono quale variabile
prevalga sull'altra nel caso si trovino ad essere "vive" entrambe. Nel tuo
caso, poichè la variabile globale prevale, tu accedi alla form (che altro
non è che una variabile globale dichiarata d aVb) e non alla variabile.
Putroppo le regole di visibilità non me le ricordo bene, e non le ho trovate
sull'help, comunque il motivo è questo.
Visual Basic - Riferimento al linguaggio
    Argomenti concettuali di Visual Basic
        Area di validita` e visibilita`
        Vita utile delle variabili
HTH
---
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

     frmSplash.Hide
Ma il Timer1 dov'è ?
Bye, G.

 > Visibilità delle variabili. E' possibile dichiarare variabili con lo
[...]

 Non mi riferivo a quello; quello l'avevo trovato anch'io. Io parlavo delle
regole di precedenza tra variabili con lo stesso nome che condividono un
certo scope.
Allora:
Visual Basic - Riferimento al linguaggio
    Argomenti concettuali di Visual Basic
        Risoluzione dei conflitti di nome
A questo proposito mi piacerebbe approfondire un argomento che non ho mai
affrontato: i progetti con riferimenti diretti ad altri progetti.


 [...]
[...]

 > > > Visibilità delle variabili.
[...]
Variazioni sul tema. Due piccoli esperimenti:
' *** PRIMO ESPERIMENTO ***
'
' Module1
'
Option Explicit
Public myVar
Sub Main( _
)
  Debug.Print "*** Main (Enter) ***"
  Debug.Print "Main.myVar="; myVar
  myVar = "Main"
  Form1.Show
  Debug.Print "*** Main (Exit) ***"
  Debug.Print "Main.myVar="; myVar
  Debug.Print "Form1.myVar="; Form1.myVar
End Sub
' Form1
'
Option Explicit
Public myVar
Private Sub Init( _
)
  Debug.Print "*** Init (Enter) ***"
  Debug.Print "Main.myVar="; Module1.myVar
  Debug.Print "Form1.myVar="; myVar
  myVar = "Form1"
  Debug.Print "*** Init (Exit) ***"
  Debug.Print "Main.myVar="; Module1.myVar
  Debug.Print "Form1.myVar="; myVar
End Sub
Private Sub Form_Load( _
)
Dim myVar
  Debug.Print "*** Form_Load (Enter) ***"
  Debug.Print "Main.myVar="; Module1.myVar
  Debug.Print "Form1.myVar="; Me.myVar
  Debug.Print "Form_Load.myVar="; myVar
  Init
  myVar = "Form_Load"
  Debug.Print "*** Form_Load (Exit) ***"
  Debug.Print "Main.myVar="; Module1.myVar
  Debug.Print "Form1.myVar="; Me.myVar
  Debug.Print "Form_Load.myVar="; myVar
End Sub
' *** SECONDO ESPERIMENTO ***
'
' Module1
'
Option Explicit
Public myVar
Sub Main( _
)
  Debug.Print "*** Main (Enter) ***"
  Debug.Print "Main.myVar="; myVar
  myVar = "Main"
  Form1.Show
  Debug.Print "*** Main (Exit) ***"
  Debug.Print "Main.myVar="; myVar
  ' Compile error:
  ' Method or data member not found
  ' Debug.Print "Form1.myVar="; Form1.myVar
End Sub
' Form1
'
Option Explicit
Private myVar
Private Sub Init( _
)
  Debug.Print "*** Init (Enter) ***"
  Debug.Print "Main.myVar="; Module1.myVar
  Debug.Print "Form1.myVar="; myVar
  myVar = "Form1"
  Debug.Print "*** Init (Exit) ***"
  Debug.Print "Main.myVar="; Module1.myVar
  Debug.Print "Form1.myVar="; myVar
End Sub
Private Sub Form_Load( _
)
Dim myVar
  Debug.Print "*** Form_Load (Enter) ***"
  Debug.Print "Main.myVar="; Module1.myVar
  ' Compile error:
  ' Method or data member not found
  ' Debug.Print "Form1.myVar="; Me.myVar
  Debug.Print "Form_Load.myVar="; myVar
  Init
  myVar = "Form_Load"
  Debug.Print "*** Form_Load (Exit) ***"
  Debug.Print "Main.myVar="; Module1.myVar
  ' Compile error:
  ' Method or data member not found
  ' Debug.Print "Form1.myVar="; Me.myVar
  Debug.Print "Form_Load.myVar="; myVar
End Sub
Questa e`, ovviamente, una pratica da sconsigliare. Io, per esempio, uso
sistematicamente i prefissi "g_" per l'area di validita` globale (a livello
di progetto) e "m_" per quella a livello di modulo (o form) e mi trovo bene.
Per esempio:
    Public g_strNome         As String
    Public Const gc_strNome  As String = "Pippo"
    Private m_strNome        As String
    Private Const mc_strNome As String = "Pluto"
mentre non ho deciso come identificare le variabili pubbliche dichiarate nei
Form e nei Moduli di classe ma, invero, non le uso praticamente mai
preferendo ad esse le proprieta`. Per dirla tutta, sto anche
progressivamente abolendo l'uso di variabili globali.


 Non ho mai fatto un progetto con riferimento diretto ad un'altro progetto,
ma sono sempre curioso delle cose che non so...
Idem. Mi e` tornato in mente proprio scorrendo la pagina che ti ho segnalato
nel precedente post:
Visual Basic - Riferimento al linguaggio
    Argomenti concettuali di Visual Basic
        Risoluzione dei conflitti di nome
dove c'e` appunto il link "_progetto con riferimento_ diretto". E nell'IDE
di vb c'e` l'opzione del menu` File:
    Add Project...
Immagino le due cose siano legate.



[...]

 affrontato: i progetti con riferimenti diretti ad altri progetti.
Ciao Maurizio,
non so se è proprio quello che intendi tu ma...
quando faccio qualcosa che richiede l'uso di un nutrito numero di classi
strutturate realizzo un progetto per ogni "argomento", poi lavoro
direttamente con un gruppo di progetti: ogni volta che aggiungi un progetto
nuovo te lo ritrovi nelle reference e da tutti gli altri puoi utilizzarne le
classi che vi sono definite.
Non sono sicuro però che questo c'entri con la tua curiosità.
Ciao.
--
Princi, 
princ...@programmer.net
---------------------------------------------------------------------
"Tutti sanno che una cosa è impossibile da realizzare,
finché arriva uno sprovveduto che non lo sa e la inventa." A.E.

 Non sono sicuro però che questo c'entri con la tua curiosità.
Mi pare proprio di si`, invece. Sono da pochi mesi passato a vb6 da vb4 e
non ho ancora affrontato determinate problematiche "nuove". E non ho nemmeno
molto tempo di sperimentare, in questo periodo, purtroppo.
Una volta che ho aggiunto progetti al progetto, che eseguibile ottengo?


 Una volta che ho aggiunto progetti al progetto, che eseguibile ottengo?
Ciao,
anche io (non pretendo che te lo ricordi) lavoro in VB4 e sono passato al 6
solo da pochi mesi proprio per realizzare un progetto diciamo un po'
elaborato. In effetti sono ancora in piena fase di sperimentazione e sto
realizzando solo dei prototipi che per ora interagiscono nell'IDE allargata
di Interdev (mando in esecuzione un progetto "master" dal VB e poi richiamo
tutto via ASP - non ho ancora compilato proprio niente).
L'idea finale è quella di realizzare singole DLL dai singoli progetti per
poi creare oggetti COM da far girare in MTS (sto ancora studiando la
tecnologia). La possibilità di creare un gruppo di progetti mi serve solo
per fare tutte le prove e verificare la corretta interazione tra tutti gli
oggetti senza dover per forza ricompilare le DLL ad ogni modifica. (Forse
poi verrà addirittura convertito tutto in C++)
Di più... non so. Tra le altre cose è più di un mese che ho problemi con gli
HD e ora non ho neanche installato VB6 per togliermi la curiosità (anche se
mi pare strano che si possa ottenere un eseguibile unico: in un gruppo di
progetti, ogni progetto mantiene delle reference indipendenti).
Ciao.
--
Princi, 
princ...@programmer.net
----------------------------------------------------------------------


 Di più... non so. Tra le altre cose è più di un mese che ho problemi con
gli HD e ora non ho neanche installato VB6 per togliermi la curiosità (anche
se mi pare strano che si possa ottenere un eseguibile unico: in un gruppo di
progetti, ogni progetto mantiene delle reference indipendenti).
Come sospettavo. :-)
Molto interessante tutto il discorso che hai fatto. Certe volte nel ng ci si
trova a parlare di una sola linea di codice e si perde di vista l'insieme,
proprio dove vb esprime tutta la sua potenza, non elaborativa ma di
"supporto" (non mi viene un termine migliore) nei progetti di largo respiro.


 "supporto" (non mi viene un termine migliore) nei progetti di largo
respiro.
Quando si tratta di "fare prove" il VB è insuperabile! In più l'ottima
strutturazione multiprogetto messa a disposizione dal nuovo IDE è
comodissima per organizzare grossi lavori senza perdere tempo inutilmente
(mi sto abituando così in fretta che non credo di potervi più rinunciare).
Mandare in esecuzione un progetto dall'IDE e poter usare tutti i tuoi
oggetti da Interdev senza bisogno di compilare (anzi, potendo eseguire il
debug mentre le chiamte saltano da un ambiente all'altro e tra vari progetti
nel VB è letteralmente fantastico).
P.S. E' proprio sulle singole linee di codice che il VB putroppo mostra il
fianco e dà adito a feroci discussioni ;-))
