Newsgroup: it.comp.appl.access
Titolo: Come inibire la "X" della finestra principale di Access

Cioa a tutti sono Dino.Ho necessita' di nibire la finestra principale
di Access(o meglio la cosidetta x).Come posso fare???'E l'eventuale
routina va inserita in un nuovo modulo o no (scusate la domanda
banale)
Saluti e grazie in anticipo Dino...

 banale)
Vai nella form principale della tua applicazione e intercetta l'evento
"su scaricamento": se annulli l'evento con docmd.cancelevent, diventa
impossibile chiudere quella form, di conseguenza chiudere access.
(naturalmente prevederai un sistema per chiudere la form quando
dovuto...)
MA
sappi che il primo scemo che passa premera' ctrl-alt-canc, aprira'
task manager e buttera' giu' il processo di Access, quindi non dare
per scontato che il db venga chiuso sempre come TU hai previsto.
Ho conosciuto utenti talmente idioti da *TOGLIERE L'ALIMENTAZIONE* al
computer per non stare a fare la "noiosa prodedura di chiusura"...
cia'
Max

 computer per non stare a fare la "noiosa prodedura di chiusura"...
Roccia e tu li chiami "idioti"? A me sembra piu' idiota chi non li 
facilita e prevede "noiose" procedure di chiusura.
Personalmente sono talmente "scemo" che talvolta alt+del+canc mi ha 
risparmiato un sacco di noiose seccature.
Scusami per la tirata ma quando sento parlare di "utonti" ho un riflesso 
condizionato. Sara' la sindrome da utente?
"attaccare" e soprattutto "togliere" la spina e' il fondamento della 
societa' tecnologica.
-- 
ac
y-1=x

 facilita e prevede "noiose" procedure di chiusura.
Li chiamo "idioti" perche' se tu gli spieghi per filo e per segno che
al termine della sessione sono necessarie alcune operazioni (tipo 15
secondi di cronometro, mica 20 minuti! Oh, quando si ereditano sistemi
nati 50 anni fa e tenuti insieme con lo scotch e lo sputo, certe
limitazioni non si possono necessariamente aggirare), loro se ne
sbattono e chiudono alla cazzo di cane, si trovano con DB
inconsistenti e ti chiamano dicendoti che sei un cretino e il tuo db
non funziona, "In che senso non funziona?" "Non funziona! Aiuto! La
fine del mondo! L'armageddon! Corri! Paura!", scusa, ma SONO degli
idioti.
E continuo a pensarlo anche ora che ho saltato la staccionata e sono
dal lato "utonto" del sistema....
cia'
Max


Grazie a tutti per la risposta e....condivido la definizione su alcuni
utenti...
Per quanto riguarda l'inibizione della famosa X io parlavo della
finestra principale di Access.
Infatti disabilitando lo shift il mio DB  mostra solo la form
principale(nella quale ho gia' inibito la X).
A volte l'utente .....(chiamato come sopra) mi clicca proprio l' e mi
esce dal software.
L'esigenza e' di inibile tale possibilita'(compreso alt F4)
Ciao a tutti e grazie per le risposte

 L'esigenza e' di inibile tale possibilita'(compreso alt F4)
Se chiudi "ordinatamente" Access (quindi non buttando giu' il
processo), lui cerca prima di chiudere tutte le form aperte... se
intercetti la chiusura di una form, access non si chiude.
cia'
Max


Ciao Max scusa se forse non riesco a capire.Il problema e' proprio
quando si tenta (con la X della finestra centrale di Access) di
chiudere in maniera non corretta Access che nasce il problema.Io devo
togliere all'utyente la possibilita' di uscire da access con la famosa
X.Se l'utente esce correttamente con i pulsanti che ho creato
ovviamente non c'e' il problema.
Ciao e grazie in anticipo
Dino


Ciao Dino.
Nel modulo inserisci le seguenti function e sub:
Private Declare Function SendMessage Lib "user32" _
 Alias "SendMessageA" _
 (ByVal hWnd As Long, ByVal wMsg As Long, _
 ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" _
 Alias "SetWindowLongA" (ByVal hWnd As Long, _
 ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" _
 Alias "GetWindowLongA" (ByVal hWnd As Long, _
 ByVal nIndex As Long) As Long
Private Const GWL_STYLE = -16
Private Const WS_SYSMENU = &H80000
Private Const WM_NCPAINT = &H85
Public Sub PulsanteChiusura(ShowIt As Boolean, FrmHwnd As Long)
    On Error GoTo Errors
    Dim lngOldStyle As Long
    Dim lngNewStyle As Long
    Dim mhWnd As Long
    mhWnd = FrmHwnd
    lngOldStyle = GetWindowLong(mhWnd, GWL_STYLE)
    If ShowIt Then
        lngNewStyle = lngOldStyle Or WS_SYSMENU
    Else
        lngNewStyle = lngOldStyle And Not WS_SYSMENU
    End If
    Call SetWindowLong(mhWnd, GWL_STYLE, lngNewStyle)
    Call SendMessage(mhWnd, WM_NCPAINT, 1, 0)
ExitHere:
    Exit Sub
Errors:
    MsgBox Err.Description, vbCritical, "Errore n° = " & Err.Number
  Resume ExitHere
End Sub
poi dove vuoi, anche all'interno di una casella di testo le richiami
in questo modo:
' per eliminare i pulsanti di chiusura, ingrandimento, riduzione della
form
PulsanteChiusura False, Forms("Inserimento dati").hWnd
' per inibire l'uscita generale da Access
ShowAccessBtn PulsantiChiusura = True
DisabilitaChiusura = True
per riportare tutto alla normalità:
PulsanteChiusura True, Forms("Inserimento dati").hWnd
ShowAccessBtn PulsantiChiusura = False
DisabilitaChiusura = False
Ciao Vladimiro.

 - Mostra testo tra virgolette -
Ops mi è sfuggito.
Al posto della Forms"Inserimento dati", naturalmente dovrai inserire
il nome della tua Forms.
Di nuovo Vladimiro.

 ovviamente non c'e' il problema.
Chiudere Access con la "X" o con Alt-F4 non e' necessariamente
"chiudere ad minchiam", perche' Access chiudera' ordinatamente tutte
le form, una per una, attivando la solita sequela di eventi deactivate-
unload-close e aspettera' la conclusione di eventuali routine prima di
chiudersi del tutto. Di conseguenza, puoi eseguire le operazioni
necessarie sull'evento deactivate della form interessata, o se
preferisci puoi intercettare l'evento ed annullarlo- in questo modo
Access NON si chiudera'.
cia'
Max


Cioa Max grazie per la risposta.Devi avere pazienza ancora un attimo
con me!!
Dopo aver annullato l'evento con docmd.cancelevent, come posso
impostare come dici tu la possibilita' di chiusura regolare???
Attualmente nella form principale ho dei pulsanti di comando che
permettono all'utente di passare da una forma all'altra.
Se ad esempio devo passare alla form "a" pigiando il pulsante "A" il
db chiude la form principale e apre la form "a".Se io inibisco la sua
chiusura mi rimarrann oa perte le due form giusto??'.Come posso
fare???
Ciao e grazie ancora
Dino

 - Mostra testo tra virgolette -
Ciao Vladimiro grazie per la routina.
Volevo chiederti un esempio di come poterle attivare quello della
casella di testo non l'ho ben capito.
Io ho gia' inserito le routine in un modulo.Adesso pero' lo devo
attivare.Nno e' meglio creare una macro che lanci il codice
piuttosto della casella di testo??O forse non riesco a capire.
Aspetto tue notizie e grazie ancora
Dino

 fare???
Usa una variabile globale per determinare se l'utente ha premuto un
pulsante di chiusura o sta cercando di chiudere in maniera scorretta:
private sub P_Chiudi_Click()
OkChiusura=True
docmd.close acform, 
me.name
end sub
private sub Form_Unload(Cancel as integer)
If not OkChiusura then docmd.cancelevent
eccetera
Comunque, anziche' bloccare la chiusura della form, io sarei per
eseguire automaticamente quello che va eseguito alla chiusura
dell'applicazione, indipendentemente da *come* viene chiusa. In
pratica, quello che normalmente viene eseguito quando chiudi il
pulsante di chiusura, viene invece eseguito su scaricamento della
maschera.
cia'
Max


cioa Max quindi Inibire ancora su scaricamento vero???
Cioa Dino

 - Mostra testo tra virgolette -
Max sono sempre io.Ho provato con la variabile globale.
funziona .Nella form principale pero' ho anche altri pulsanti che
servono pr aprire altre form (e allo stesso modo chiudere la form
princ) come posso inserirli nella funzione globale in modo tale da far
chiudere la form correttamente laciand osempre inibita la X.
Fammi un esempio grazie
Cioa Dino

 chiudere la form correttamente laciand osempre inibita la X.
In ogni form:
private sub form_unload(cancel as integer)
if not OkToClose then docmd.cancelevent
OkToClose=false
end sub
in tutti i pulsanti per cambiare form:
OkToClose=true
docmd.openform eccetera eccetera
cia'
Max

 - Mostra testo tra virgolette -
Ciao Dino, quello che ti ho proposto è di una semplicità unica.
Ti faccio un esempio:
Se vuoi inserire il codice all'apertura della "TuaMaschera":
Private Sub Form_Open(Cancel As Integer)
PulsanteChiusura False, Forms("Inserimento dati").hWnd
ShowAccessBtn PulsantiChiusura = True
DisabilitaChiusura = True
End Sub
e ripristinare il tutto all'uscita di una casella ti testo
("TuaCasella") della "TuaMaschera":
Private Sub TuaCasella_GotFocus()
PulsanteChiusura True, Forms("Inserimento dati").hWnd
ShowAccessBtn PulsantiChiusura = False
DisabilitaChiusura = False
End Sub
al posto di "TuaMaschera" metti il nome vero della tua maschera ed al
posto di "TuaCasella" metti il nome vero della casella di testo
inserita all'interno della maschera in questione.
Questi sono solo due esempi banali, ma con un pò di fantasia il codice
lo puoi inserire dove vuoi.
Ciao Vladimiro.


Grazie Vladimiro provo e poi ti faccio sapere.Voglio provare anche il
consiglio di max


Ciao Max provo e ti faccio sapere.Voglio provare anche il consiglio di
Vladimiro.

 - Mostra testo tra virgolette -
Ciao Max sul sito comune ho trovato questa routine cosa ne pensi e
soprattutto come faccio
a mandarla in esecuzione.L'ho inserita in un modulo ma sembra non
funzionare
Ciao Dino.
PS.Per il tuo suggerimento quando mi dici di inserire in ogni pulsante
che apre le form il codice....
intendi nell'evento clik o dove????
Ciao grazie in anticipo Dino

(Ho cancellato tutto per comodità)
-------------------------------------------------------
Ciao Dino, oggi purtroppo è stata una giornata movimentata e non ho
avuto il tempo di spiegarti in maniera più dettagliata quello che ho
cercato di suggerirti.
Premetto però una cosa e cioè che è sempre bene per un programmatore
non estremizzare (come nel mio esempio) gli eventi di Access.
Se ho capito bene, il tuo problema è quello di non far chiudere
l'applicazione se non prima che tutti i dati siano stati inseriti
correttamente per poi passare tramite svariati pulsanti all'apertura
di altre maschere. Bene, poniamo che l'ultima casella di testo della
maschera principale si chiami "txtData" e che tu abbia deciso che non
venga lasciata vuota; sull'evento "Prima di aggiornare" della maschera
principale inserisci la seguente routine e vedrai che anche volendo
chiudere completamente Access facendo naturalmente clic sul pulsante
di chiusura, questo non sarà possibile:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me.txtData) Then
    MsgBox "Attenzione!" & vbCrLf & "Non è stata inserita la data." &
vbCrLf & "" & vbCrLf & "(Per annullare i dati inseriti, premere -Esc-
sulla tastiera)", vbCritical
    Me.txtData.SetFocus
    Cancel = True
    Exit Sub
    End If
End Sub
volendo, la stessa routine la puoi inserire anche sull'evento clic dei
pulsanti posti all'interno della maschera principale.
Detto ciò ti ripeto dettagliatamente l'altra opzione più estrema.
Tralasciamo il codice da inserire all'interno del modulo, perchè credo
lo hai capito bene e passiamo direttamente ad inserire l'evento dove
più conviene.
Nome della tua maschera principale ad es. "Archivio" , nome di una
casella di testo ad es. "Prodotto" nome di un pulsante ad es.
"Apri_Inventario".
Inibire la chiusura all'apertura della maschera non va bene in quanto
anche per curiosità uno potrebbe aprirla solo per il gusto di vedere
come è fatta; mentre è dove si incominciano ad inserire i dati che
bisogna "intervenire".
Sull'evento uscita della casella di testo "Prodotto" inserita
all'interno della maschera principale "Archivio" inserisci:
Private Sub Prodotto_Exit(Cancel As Integer)
PulsanteChiusura False, Forms("Archivio").hWnd
ShowAccessBtn PulsantiChiusura = True
DisabilitaChiusura = True
End Sub
mentre sull'evento clic dei pulsanti (nel nostro esempio
"Apri_Inventario") inserisci:
Private Sub Apri_Inventario_Click()
If ...(condizione)
PulsanteChiusura True, Forms("Archivio").hWnd
ShowAccessBtn PulsantiChiusura = False
DisabilitaChiusura = False
Else
MsgBox "Attenzione, ecc...
DoCmd.CancelEvent
End If
End Sub
Ciao Vladimiro.


Grazie Vladimiro per la risposta e.... mi dispiace farti fare le
nottate per aiutarmi (ho visto l'ora di risposta).Non sono il solo a
lavorare fino a tardi.
Ho provato il tutto ma non funziona(sicuramente ho sbagliato qualcosa)
Volevo pero' sottolineare alculne cose:
1) La maschera principale del mio DB(ma penso di tutti i DB) e' solo
un pannello di comando costituito da pulsanti (di comando) che
permettono all'utente di spostarsi da una parte all'altra del DB.
Tu mi dici di inserire una casella di testo in questa maschera.Ma tale
casella secondo il mio parere non ha senso di esistere in questa form.
2) La mia esigenza (spero di non stancarti) e' di inibire la finestra
principale di Access.L'utente in qualsiasi oggetto di possa trovare
non deve assolutamente uscire cliccando sulla famosa "X".
3) Questa e' forse la domanda piu' banale per te...Ma il codice che mi
hai scritto nell'ultimo post e' completamente staccato dal codice che
mi avevi suggerito precedentemente (codice da inserire in un modulo) o
no???
Grazie e porta pazienza
Dino

 - Mostra testo tra virgolette -
Ciao Vladimiro sono sempre io.Ho risolto inquesto modo:
Nella form princ sull'evento scaricamento ho inserito il seguente
codice
 If not OkChiusura then docmd.cancelevent
Poi quando apro (sempre dalla princ) quasiasi altra form,la maschera
princ la impodto in modalita' nascosta.Praticamente non la chiudo mai
se non quando si esce dal DB correttamente.
Facendo cosi' non solo si inibisce la famosa "X"ma anche "ALT F4"
Fammi sapere cosa ne pensi
Dino


Ciao Max sono sempre io.Ho risolto inquesto modo:
Nella form princ sull'evento scaricamento ho inserito il seguente
codice
 If not OkChiusura then docmd.cancelevent
Poi quando apro (sempre dalla princ) quasiasi altra form,la maschera


 ha scritto nel messaggio
news:bc4ce19e-aca0-45c3...@i12g2000prf.googlegroups.com...

io ho risolto in questo modo:
crei una macro di nome autoexec che apre una maschera da te creata in modo
nascosto
questa maschera serve per non far chiuder il db quando cliccano sulla X in
alto a destra
dichiari una variabile e su evento "apertura" della maschera in questione la 
imposti
a no
PossoUscire = "No"
nel codice "scaricamento" della mascheda metti questo
Dim intScelta As Integer
Dim UnloadMode As Integer
If PossoUscire = "No" Then
    Dim response
    response = MsgBox("SEI SICURO DI VOLER USCIRE DAL PROGRAMMA?", vbYesNo,
"")
    If response = vbYes Then
        DoCmd.Quit acQuitSaveAll
    Else
        If UnloadMode = vbFormControlMenu Then
            Cancel = True
            Exit Sub
        End If
    End If
End If

 ha scritto nel messaggionews:bc4ce19e-aca0-45c3...@i12g2000prf.googlegroups.com...

Ciao Nicolas'73.grazie per la risposta.
Anche io utilizzo una macro autoexec ma per altre maschere
La mia maschera principale parte i automatico dal menu' avvio. Poi
come scritto sopra realizzo il tutto risparmiando sel codice.
Se vuoi provare poi fammi saper.
Grazie comunque provo anche la tua soluzione
Dion

 se non quando si esce dal DB correttamente.
Fattibile, ammesso che il DB non possa essere aperto da altri utenti
(ipotesi orrida, ma c'e' chi lo fa).
Per il resto...
If mgbox("Funziona?",vbyesno)=vbYes AND msgbox("Da'
problemi?",vbyesno)=vbNo then msgbox("Allora non pastrugnarla
ulteriormente", vbexclamation)
cia'
Max

 ha scritto nel messaggionews:bc4ce19e-aca0-45c3...@i12g2000prf.googlegroups.com...

Ciao Nicolas73 sono Dno.Grazie per la risposta.Ho risolto inquesto
modo:
Nella form princ sull'evento scaricamento ho inserito il seguente
codice
 If not OkChiusura then docmd.cancelevent
Poi quando apro (sempre dalla princ) quasiasi altra form,la maschera
princ la imposto in modalita' nascosta.Praticamente non la chiudo mai
se non quando si esce dal DB correttamente.


 Grazie e porta pazienza
Prego
Ciao Vladimiro.