Newsgroup: it.comp.lang.visual-basic
Titolo: Impedire il click sulla X pulsante di chiusura...

SAlve a tutti i frequentatori...
Ho da porvi un problemino stupido, ma, come spesso accade, più le cose sono
stupide più sono utili :-)
Ho la necessità di evitare che l'utente clicchi sul pulsante di chiusura del
form (la X in alto a destra) ma lo faccia su un mio command button che
esegue poi delle istruzioni particolari.
Ora, ho pensato di seguire 2 strade:
Nascondere o disabilitare il pulsante di chiusura del form (sempre se ciò è
possibile)
Intercettare da codice la chiusura del form e richiamare, in quell'evento,
la procedura dell'evento click del command button.
Solo che per entrambe le strade non so proprio dove iniziare :-(
Qualcuno che possa aiutarmi? (domanda retorica, questi saranno sicuramente
problemini da nulla per voi :-))
grazie mille!
Buona notte, o, per chi come me, buon lavoro ...

 Solo che per entrambe le strade non so proprio dove iniziare :-(
[CUT]
La pressione del pulsante di chiusura del form genera l'evento
Form_QueryUnload
in questa procedura puoi scrivere il codice che deve essere eseguito alla
chiusura del Form
Se vuoi semplicemente annullare la richiesta di chiusura da parte
dell'utente
basta assegnare un valore diverso da zero alla variabile Cancel
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
   Cancel = 1
End Sub
se vuoi eseguire del codice prima che il form venga chiuso basta inserirlo
qui
Es. richiesta se si voglia realmente chiudere o meno
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
   If MsgBox("si vuole chiudere?", vbDefaultButton2 Or vbQuestion Or
vbYesNo) = vbNo Then Cancel = 1
End Sub
se vuoi che la chiusura avvenga anche da un altro comando basta chiamare da
codice la routine relativa
Private Sub Command1_Click()
   Form_QueryUnload 0, vbFormCode
End Sub
oppure più elegantemente
Private Sub Command1_Click()
   Unload Me
End Sub
Se preferisci creare una routine apposita e richiamarla da tutti gli eventi
tu voglia
bada solo che sia una function (per poter restituire il valore della
variabile Cancel)
e che sia richiamata solo da Form_QueryUnload (perchè Cancel funzioni)
Private Sub Command1_Click()
   Unload Me
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)
   If KeyAscii = vbKeyEscape Then Unload Me
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
   Cancel = Uscita
End Sub
Private Function Uscita() As Integer
 If MsgBox("si vuole chiudere?", vbDefaultButton2 Or vbQuestion Or vbYesNo)
= vbNo Then
  Uscita = 1
 Else
  Uscita = 0
 End If
End Function
Spero di essere stato chiaro
--
Mauro Cerreto
www.cerretosoft.it

 End Sub
Per quanto detto prima, qui occorre verificare il valore di UnloadMode
(vedere la guida di QueryUnload per le costanti relative) per essere sicuri
di annullare la chiusura solo quando e' opportuno; il codice qui sopra
invece rende di fatto impossibile lo scaricamento della form, sia implicito
che esplicito
Le stesse considerazioni valgono per gli altri esempi riportati
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

vi ringrazio moltissimo...
ma non ho capito una cosa:
mi stai dicendo che se scrivo
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
   Cancel = 1
End Sub
il form non può più essere chiuso eh? dato che il query unload si verifica
in tutte le condizioni di chiusura del form... :-)

in tutte le condizioni di chiusura del form... :-)
Esatto, devi killare da task manager :-)
-- 
ciao, hal


Proprio cosi', come ha gia detto hal l'unico sistema e' stoppare VB se sei
in debug oppure chiudere il processo in maniera brutale con Task Manager se
usi il compilato.
Per quello che chiedi, va bene il QueryUnload ma devi semplicemente
aggiungere un controllo:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    'se la chiamata deriva dal menu' di sistema della form (o
all'equivalente
    'tasto 'X' ...
    If UnloadMode = vbFormControlMenu Then
        '[...] quello che devi fare
    End If
End Sub


 ciò è possibile)
Oltre alle risposte degli altri aggiungo che puoi impostare
ControlBox=False, ma in questo modo togli anche il minbutton e il maxbutton.
ciaociao

perfetto!! grazie mille!
penso comunque che sia più utile ai miei scopi controlBox = false, non
essendoci il pulsante di chiusura l'utente non può cliccarci e può uscire
dalla finestra solo cliccando sul commandButton (oppure killando il processo
dal task manager... ma in questo caso sono ben altri i problemi che devo
affrontare :-))


All'utente lasci veramente poche e drastiche scelte
ma tu da codice puoi terminare con l'istruzione end
la quale perň termina brutalmente tutto senza invocare alcuna routine
--
Mauro Cerreto
www.cerretosoft.it

 che esplicito
In effetti volevo solo mostrare la sintassi di come annullare la chiusura
senza analizzare le implicazioni della procedura nel contesto del programma.
Per eccesso di chiarezza ho finito per indurre in errore.
--
Mauro Cerreto
www.cerretosoft.it