Newsgroup: it.comp.lang.visual-basic
Titolo: Funzione MsgBox con bottone personalizzato

Ciao a tutti,
come posso fare per impostare la funzione MsgBox in modo che abbia i 
seguenti tasti:
Si, No, Ignora
è possibile?
oppure come potrei raggirare il problema?
Grazie anticipatamente.

 è possibile?
Tu non hai mai premuto F1 sulla parola msgbox, vero?
Alberto
-- 
Il tuo stesso identico umore,
ma la divisa di un altro colore


Certo che l'ho premuto! lo faccio sempre prima di scrivere al NG!
ma non è specificata la combinazione di bottoni che voglio io...
Si avvicina "vbAbortRetryIgnore" ma non è esattamente lo stesso.
Io vorrei proprio "Si, No, Ignora" o meglio ancora "Si, No, Ignora Tutto"
Ciao 

 ha scritto nel messaggio 
news:g8ubmo$di5$1...@aioe.org...

x = msgbox(".......", vbYesNoCancel)
Select case x
    case vbYes
        ....
    case vbNo
        ...
    case vbCancel
        ...
End Select


Non voglio "Cancel" ma "Ignora" o "Ignora Tutto"...
Provo spiegarmi meglio:
La funzione č inserita all'interno di un ciclo While ed appare all'utente 
tante volte quante volte si verifica un determinato errore.
Io vorrei che l'utente potesse scegliere se:
- Interrompere del tutto l'operazione premendo "No"
- Continuare solo per l'attuale errore premendo "Si"
- Continuare ignorando tutti gli errori premendo "Ignora tutto"
spero di essere stato chiaro.
Grazie anticipatamente 

 Grazie anticipatamente
Secondo me la strada migliore è quella di creare una form su misura
che assomigli ad una msgbox

che assomigli ad una msgbox
Ci ho già provato, ma quando chiudo il form con MsgBoxForm.hide mi ricarica 
il FormPrincipale.Load facendomi un casino che non ti dico; cioè
1. Mi trovo in FormPrincipale
2. Avvio MsgBoxForm.Show e quindi seleziono uno delle possibilità "Si, No, 
Ignora" nelle quali è presente MsgBoxForm.Hide
3. Succede che viene avviato l'evento FormPrincipale.Load facendo casino
E' possibile ovviare a questo problema?
In molti software ho visto una finestra tipo MsgBox con "Si" e "No" e poi un 
checkbox con scritto ad es. "non visualizzare più questo messaggio"; a me 
serve proprio qualcosa di questo tipo!
Grazie ancora per eventuali suggerimenti. 

 Grazie anticipatamente
Come ti hanno già detto, una possibile soluzione è quella di creare un form 
ad immagine e somiglianza di un msgbox.
Un'alternativa è quella di utilizzare una tecnica un po' più complessa 
(hook) per intervenire sul msgbox standard di windows cambiandone gli 
elementi a tuo piacimento.
Un esempio lo trovi qui:
http://vbnet.mvps.org/code/hooks/messageboxhook.htm
Bye
Raf 

 casino
Form principale:
Private FormGiaAperto as boolean
Private Sub Form_Load
If FormGiaAperto = true then exit sub
FormGiaAperto = true
' tuo codice
end sub
Inoltre, cerca l'api


No, non puoi, purtroppo il commando in questione a questa grande
limitazione:
il non poter modificare le ettichette dei pulsanti.
Perň a tutto c'č rimedio, fai cosě:
'Metti quanto segue in un modulo
Public Const MB_ABORTRETRYIGNORE = &H2&
Public Const MB_OKCANCEL = &H1&
Public Const MB_RETRYCANCEL = &H5&
Public Const MB_YESNO = &H4&
Public Const MB_YESNOCANCEL = &H3&
Public Const MB_ICONASTERISK = &H40&
Public Const MB_ICONEXCLAMATION = &H30&
Public Const MB_ICONHAND = &H10&
Public Const MB_ICONINFORMATION = MB_ICONASTERISK
Public Const MB_ICONMASK = &HF0&
Public Const MB_ICONQUESTION = &H20&
Public Const MB_ICONSTOP = MB_ICONHAND
Public Const MB_OK = &H0&
Public Const MB_TASKMODAL = &H2000&
Public Const IDOK = 1
Public Const IDCANCEL = 2
Public Const IDABORT = 3
Public Const IDRETRY = 4
Public Const IDIGNORE = 5
Public Const IDYES = 6
Public Const IDNO = 7
Public Type MB
    Ok As String
    Cancel As String
    Hook As Long
    Retry As String
    Ignore As String
    Yes As String
    No As String
End Type
Public Declare Function GetCurrentThreadId& Lib "kernel32" ()
Public Declare Function UnhookWindowsHookEx& Lib "user32" (ByVal hHook&)
Public Declare Function SetWindowsHookEx& Lib "user32" Alias
"SetWindowsHookExA" (ByVal idHook&, ByVal lpfn&, ByVal hmod&, ByVal
dwThreadId&)
Public Declare Function SetDlgItemText& Lib "user32" Alias "SetDlgItemTextA"
(ByVal hDlg&, ByVal nIDDlgItem&, ByVal lpString As String)
Public Declare Function MessageBox& Lib "user32" Alias "MessageBoxA" (ByVal
hwnd&, ByVal lpText As String, ByVal lpCaption As String, ByVal wType&)
Public Declare Function GetWindowLong& Lib "user32" Alias "GetWindowLongA"
(ByVal hwnd&, ByVal nIndex&)
Dim MT As MB
Public Function MsgBoxA(Optional ByVal strCap As String, Optional ByVal
strMsg As String, Optional ByVal Flags As Long = MB_OK, Optional ByVal OkB
As String = "Ok", Optional ByVal RetryB As String = "Riprova", Optional
ByVal CancelB As String = "Cancella", Optional ByVal YesB As String = "Sě",
Optional ByVal NoB As String = "No", Optional ByVal IgnoreB As String =
"Ignora") As Long
    On Error Resume Next
    MT.Hook = SetWindowsHookEx(5, AddressOf MsgBoxP, GetWindowLong(0, (-6)),
GetCurrentThreadId)
    MT.Ok = OkB
    MT.Cancel = CancelB
    MT.Ignore = IgnoreB
    MT.No = NoB
    MT.Retry = RetryB
    MT.Yes = YesB
    MsgBoxA = MessageBox(0, strMsg, strCap, Flags Or MB_TASKMODAL)
End Function
Public Function MsgBoxP(ByVal UINT As Long, ByVal wParam As Long, ByVal
lParam As Long) As Long
    If UINT = 5 Then
        SetDlgItemText wParam, IDOK, MT.Ok
        SetDlgItemText wParam, IDCANCEL, MT.Cancel
        SetDlgItemText wParam, IDIGNORE, MT.Ignore
        SetDlgItemText wParam, IDNO, MT.No
        SetDlgItemText wParam, IDYES, MT.Yes
        SetDlgItemText wParam, IDRETRY, MT.Retry
        UnhookWindowsHookEx MT.Hook
        MsgBoxP = 0
    End If
End Function
'e questo in un Form di prova
Private Sub Form_Load()
    Prova
End Sub
Private Sub Prova()
    Select Case MsgBoxA("Prova Controllo", "Premi un pulsante...", MB_YESNO)
        Case vbYes: s = "Sě"
        Case vbNo: s = "No"
    End Select
    Select Case MsgBoxA("Prova Controllo", "Hai premuto " & s & vbCrLf &
"Vuoi riprovare?", MB_YESNO)
        Case vbYes: Prova
    End Select
End Sub
--
Ciao Fede
By Chicco Production
http://bcp.freetools.it


Per i messaggi e bottoni personalizzati, devi per forza costruirti tu
una form.
Per caricarla, la procedura IMHO corretta e':
- ipotizziamo che la tua form si chiami frmMyMsgBox
Al suo interno
- avrai una variabile privata chiamata iEsito, e una proprieta'
pubblica di tipo Get chiamata Esito, che restituisce il valore di
iEsito
- Alla pressione di ogni bottone / check, valorizzerai iEsito con un
valore particolate, e poi chiamerai Unload Me
Nella maschera principale, avrai una cosa del tipo:
dim fTmp as form
dim iEsito as integer
..
set fTmp = new frmMyMsgBox
with fTmp
  .show vbModal
  iEsito = .Esito
end With
set fTmp = nothing
' A questo punto, in iEsito hai il codice relativo al bottone premuto,
e te lo potrai gestire come vuoi.
Saluti
Bye by SixaM 8-]
iesito = frmMyMsgBox.

 Perň a tutto c'č rimedio, fai cosě:
Scusami ma perchč inserire tutto quel codice in un modulo?
Nel tuo esempio potrei benissimo utilizzare la normale funzione MsgBox! 
giusto?
Non mi piacciono i due messaggi, vorrei un unico messaggio con i bottoni 
personalizzati.
Mi sa proprio che devo rinunciare... 

 Mi sa proprio che devo rinunciare...
Ma no, come ti hanno detto non hai bisogno di nient'altro che di una
banale form da visualizzare in vbModal... il problema che descrivevi
prima, della form principale che ripartiva dal load, è dovuto
sen'altro a qualche altro errore di logica, perchè tra questo
[... codice del chiamante]
MsgBox.Show
[... codice del chiamante]
e questo
[... codice del chiamante]
MiaFormMsgBox.Show vbModal
[... continua codice del chiamante]
a livello di rientro nel codice principale non ci *deve* essere
nessuna differenza.
la tua form MsgBox ovviamente deve essere assolutamente "neutra", cioè
non deve far nessun riferimento alla form principale e deve prendere
tutto l'input che serve, e restituire l'output (= la risposta scelta)
tramite property/metodi pubblici da definire secondo necessità; in
sostanza deve essere autosufficente in modo da evitare appunto
problemi di quel genere e da renderla anche facilmente riutilizzabile.

 Mi sa proprio che devo rinunciare...
Ti ho servito la soluzione su un piatto d'argento,
e non te ne sei neanche accorto.


il FormPrincipale.Load facendomi un casino che non ti dico; cioè
attenzione che con hide non chiudi il form ma lo nascondi solo. Per
chiuderlo devi usare .close