Newsgroup: it.comp.lang.visual-basic
Titolo: Form Modali

Salve, ho un piccolo problemino, diciamo "estetico", causato dai cosiddetti
form modali.
Aperto un form modale, esiste un metodo che restituisca il controllo al
codice principale senza chiudere o nascondere lo stesso?
Mi spiego meglio: ho un grosso form con una bitmap e diversi controlli, il
programma è un gioco strategico a turni con giocatori umani e
computerizzati. Mi serve aprire questo form in maniera modale in maniera che
i giocatori umani compiano le loro azioni sulla bitmap e poi il controllo
venga restituito al processo principale che gestisce i giocatori
computerizzati. Ma dato che anche le azioni di questi hanno effetto sulla
bitmap, l'ideale sarebbe che il form non venisse nascosto o chiuso. Se lo
riapro ad ogni giocatore computerizzato si causa un fastidioso effetto
flashing del form... esiste una soluzione o è un'utopia? Oppure dovrei
impostare diversamente il tutto? Grazie a tutti per le risposte... se ve ne
saranno. Ciao!
Gianfranco

 ha scritto nel messaggio
news:_nw%5.5360$5k3.1...@twister2.tin.it...

Se non ho capito male puoi usare la funzione API SetWindowsPos che mantiene
il Form in primo piano anche se questo non è attivo.
Declare Sub SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal
hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal Cx As Long,
ByVal cy As Long, ByVal wFlags As Long)
Global Const HWND_TOPMOST = -1
Global Const HWND_NOTOPMOST = -2
Call SetWindowPos(Form1.hWnd, HWND_TOPMOST, 0, 0, 0, 0, &H3) 'Rimane in
primo piano
Call SetWindowPos(Form1.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, &H3) 'Ripristina
Ciao VB

 ha scritto nel messaggio
news:91m4mr$1qd$1...@serv1.albacom.net...

D'accordo Valter, la funzione da te indicata riporta il form in primo
piano... sta di fatto che per restituire il controllo al programma
principale devo per forza di cose nascondere il form (oppure chiuderlo) e
poi chiamare la funzione da te indicata, ma a questo punto potrei usare la
stessa form1.show con identico risultato... o no? Forse le mie indicazioni
sono state poco chiare o forse non ho compreso il suggerimento che intendevi
darmi. In ogni caso grazie della risposta :-). Ciao!

 >



Ciao Alessandro...
Forse il problema non č cosě semplice da risolvere (per lo meno dal mio
punto di vista):
se apro il form come non modale ottengo che le azioni dei giocatori umani su
di esso non vengono attese. Mi spiego meglio:
form1.show vbModal
' ciclo di gioco
do
    for giocatore=1 to numero_giocatori
        if =tipo(giocatore)="umano" then
            ' esegue le procedure che controllano l'input sul form da parte
del giocatore umano
        else
            ' esegue le procedure dei giocatori computerizzati che hanno
comunque effetto sul form in questione
        end if
    next giocatore
loop until vittoria=true
questo in maniera molto sintetica. Se il form non č modale, l'input da parte
dei giocatori umani non viene atteso, creando l'anarchia piů totale. Essendo
un gioco a turni le azioni del giocatore seguente sono in stretta dipendenza
con quelle del giocatore precedente. Invece aprendo il form come modale
ottengo che il turno viene rispettato, ma il prezzo da pagare č che per
tornare al codice principale (una volta che il giocatore umano ha eseguito
il suo input) sono costretto a nascondere il form.
Spero di aver reso l'idea del problema che mi tormenta... comunque grazie a
tutti voi per le risposte ed i suggerimenti :-)

 wrote in message
news:nBG%5.5288$ag5.3...@twister1.tin.it...


tutti voi per le risposte ed i suggerimenti :-)
Ed invece aggiungere una variabile pubblica che determina se il giocatore ha preso il controllo o
meno? In questo modo la variabile è false fino alla fine del turno del giocatore, true quando il
turno è completato; il "codice principle" aspetta che la variabile sia True prima di passare al
giocatore successivo...
Forse non ho capito bene il problema, ma potrebbe essere una soluzione...
Altrimenti, perché non ci posti uno spezzone del codice? Può essere che strutturando l'appl. in
maniera leggermente diversa si riesca a riolvere il poblema indipendentemente dalla modalità di
visualizzazione del form.
Ciao,
Moreno
#sirri#@#morenosoft#.com
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.morenosoft.com/MSVBSite/
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------

Grazie Alessandro e Moreno,
seguirņ i vostri preziosi consigli :-) ... complicato abbandonare la
mentalitą programmativa sincrona in luogo di quella asinicrona ;-) cmq ci
proverņ. Grazie ancora ragazzi!


Ciao, come da te proposto ti allego parte del codice del gioco che sto
scrivendo, dato che non sono riuscito a sfruttare i vostri suggerimenti :-(
Private Sub Dispone()
    Do
        For giocatore = 1 To giocatori
            If tipo_giocatore(giocatore) = "umano" Then
                ' giocatore di tipo umano
                disposizione_iniziale_umano
            Else
                ' giocatore di tipo computerizzato
                disposizione_iniziale_pc
            End If
        Next giocatore
    Loop Until finita_disposizione=true
End Sub
Private Sub disposizione_iniziale_umano()
    ........ ' serie di azioni preliminari
    ' mostra il form in modalità obbligatoria
    form1.Show vbModal
End Sub
------------------------------
lo spezzone seguente fa parte del codice del form1, gestisce il tasto ok,
quello che mette fine all'input del giocatore umano
Private Sub ok_Click()
    ' premuto il tasto ok, passa al giocatore successivo
    ' nasconde il form restituendo il controllo al codice principale
    form1.Hide
End Sub
------------------------------------------------------
Ho provato ad eliminare la modalità del form, aggiungendo la variabile
pubblica come da te suggerito: questa veniva impostata nella routine Private
Sub ok_click() (ovviamente eliminando l'istruzione form1.hide) ed inserendo
un ciclo do...loop (che controllava lo stato di questa variabile) nella
routine disposizione_iniziale_umano() subito dopo l'apertura del form... ma
il solo risultato era un loop continuo che faceva piantare gioco e editor...
domanda: se il form non viene aperto in modalità obbligatoria, il codice x
il controllo dello stesso, ed il codice da cui il form è stato chiamato, non
dovrebbero procedere in maniera asincrona? La risposta dovrebbe essere si...
ma allora perchè la variabile che inserisco nel loop non viene aggiornata
(pur essendo pubblica)? Boh... spero sappiate indicarmi qualche mezzo per
aggirare questo dilemma. Ciao... spero in voi!!!:-)

End Sub
Attenzione: il form è stato solo nascosto, non chiuso!
Prova con
Unload Form1


 Moreno
Ciao Moreno,
grazie ancora per le tue risposte. Per quanto riguarda l'hide del form1,
anche nascondendolo viene restituito il controllo al codice principale (come
riportato dall'help Form - Metodo Show : "...Quando viene visualizzato un
form a scelta obbligatoria, il codice successivo non viene eseguito finché
il form non viene nascosto o chiuso...".
Per quanto riguarda il mio problema invece ho trovato una soluzione :-) che
parte dai tuoi consigli e da quelli di Alessandro... la soluzione l'ho
trovata :-) subito dopo aver postato il messaggio del 20/12/00 delle 0.21 e
si basava sulle mie stesse considerazioni (circa la variabile pubblica usata
come semaforo che non veniva aggiornata). Volevo postarla ma ero insicuro
sul dove avrei dovuto inviarla, se all'NG o al sito comune, ho anche provato
a scriverla ma mi sono un pò perso nei meandri del mio (scarso) italiano
:-(. Comunque, la soluzione è: impostare una variabile pubblica che funzioni
da semaforo (come dicevi tu ed Alessandro), aprire il form in maniera non
modale, e inserire un ciclo di controllo della stessa.... il ciclo da me
inserito non funzionava per il semplice motivo che si trovava nel codice
principale, e non in quello del form. In questo caso è bastato inserire
all'interno del ciclo il comando DoEvents:
' ciclo di attesa della fine dell'input da parte del giocatore umano
Do
    DoEvents
Loop Until fine_turno_umano = True
Il DoEvents fa in modo che il flag fine_turno_umano venga aggiornato
(altrimenti si generava un loop continuo a causa della perenne condizione di
False).
Forse è una soluzione poco ortodossa.... ma ottengo il risultato desiderato,
ovvero mantenere aperto il form dopo l'input (obbligatorio) del giocatore
umano :-).
Se questa soluzione può interessare altri frequentanti l'NG non lo so... a
me ha risolto un grosso problema! Grazie dell'aiuto, ciao!:-))))

 wrote in message
news:kaG06.9204$ag5.5...@twister1.tin.it...


 ha scritto nel messaggio
news:91vdlp$59qc$1...@stargate1.inet.it...

Ciao Alessandro e Buon Natale innanzitutto! Dunque, ho letto attentamente
l'esempio da te scritto e credo ci sia un particolare di fondamentale
importanza che forse ti è sfuggito: giocatore umano e computerizzato
interagiscono sullo stesso form, mentre la soluzione da te proposta
presuppone form diversi (o sbaglio?). In ogni caso grazie ancora degli
esempi e delle dritte :-)), la soluzione al problema l'ho trovata, sarà poco
ortodossa ma funziona come io desideravo. Ciao!