Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Come ignorare se una finestra é "modale" ?

Ciao a tutti !
Forse questa domanda e' già stata fatta e non mi ricordo la risposta... :-)
Se ho attivo una finestra in modo "vbmodal" , il caro Vb non mi lascia
mostrare un altra finestra SOPRA quella gia' modale.
Mi spiego meglio, ho un form con una griglia e un paio di bottoni, uno di
questi esegue una query. Vorrei che quando l'utente preme il bottone per la
query, mi appaia un altro form con la scritta "Lettura dati, attendere
prego..."  (ricordate il nonno multimediale su Italia1 ?).
Solo che quando indico al programma :  Avviso.show   , questo mi risponde
"non si puo' mostrare un form non modale su uno modale" (ovviamente in
inglese).
Purtroppo non posso rendere modale il form  -Avviso- , perché vorrei che
sparisse da solo al momento che la query ha finito la transazione, e non
voglio che sia l'utente a dover chiudere la finestra.
C'e' qualche "trucchetto" per fregare VB a parte obbligare il form -Avviso-
a restare "on top" con le opportune API ?
Ciao e grazie di aver letto il mio messaggio fino in fondo :-)
DaVe

-> Dave <- <daveg...@ticino.moc> wrote






io devo aver fatto qc tipo:
nel form della query, un bel label nascosto "attendere prego" (capisci di
internette tu ? e allora che parli a fare ? -- lui, eh)
quando la procedura e' attivata, disabilito il cmd di avvio procedura ed
event altri, e mostro il label.
fine procedura -> rinascondo label, riabilito cmd vari.
pro: -1 frm. nessuna particolare api.
contro. qualche rottura a controllare che l'utente in caso di errori strani
non rimanga li' con un cmd che non puo' premere e un avviso "attendere
prego"...
se qualcuno di questi consigli ti sara' utile, quando prima o poi vengo a
lugano e mi fai una visita guidata dei posti meritevoli. mi dicono sia molto
bella, e molto cara... (cioe': non dear, ma expensive :)

 Ciao a tutti !





 d'estate perché e' pieno di gente. In questi periodi e' un po'... grigia..
sapessi qui... come forse saprai, san geminiano salvo' la citta' dagli unni
alzando un velo di nebbia, siamo intorno al 400 dC...
...solo poi che si e' dimenticato di abbassarlo... e siamo nel 2k dC...
se al ng va bene, allego un bel jpg di 200k completamente grigio: panorama
di modena a gennaio.

Ho problemi ad inviare allegati, quindi ti riporto il codice qui sotto
(scusate se è un po lungo ma ... ):
Crea un form con due CommandButton(lascia i nomi di default) ed incolla
questa parte di codice:
' INIZIO CODICE FORM1
***************************************************************************
Option Explicit
'ops! ... il FormMDI non serve a nulla, lo uso solo come appoggio
'per lanciare il Form1(mente contorta non ci far caso).
'INFORMAZIONI:
'   L' API ShowWindow ti permette di visualizzare la Form2 anche se non è in
modalità VbModal
'   non ho gestito l' UnLoad in automatico, ma mi sembra a questo punto
semplice, data che non sei nuovo
'   nella programmazione VB (ho già letto più volte il tuo nome sulla NG)
'   E' fondamentale però (quando si usano le API è così) rilasciare i legami
di hWnd che hai gestito
'   (per così dire) a mano; quindi, ciò che io ho scritto nell' UnLaod di
questo Form, tu dovrai farlo
'   alla fine della procedura dell' SQL
'
'   Poi ho usato SetWindowWord che è un po più appropriata della forzata API
SetWindowPos. Questa API permette,
'   a differenza di quest' ultima, di indicare anche quale Form parente deve
sottostare alla regola di PrimoPiano.
'   Se ho scritto cose fin troppo ovvie scusa.... il senso non era
offenderti .....
'   Se sono stato poco chiaro(niente di più facile), postami a
'   
ara...@libero.it
'   Luigi ......
'   bye!   bye!   .....
'DA QUI ......
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal
nCmdShow As Long) As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As
Long
Const SW_HIDE = 0
Const SW_SHOWNORMAL = 1
Const SW_SHOW = 5
Private Declare Function SetWindowWord Lib "user32" (ByVal hwnd As Long,
ByVal nIndex As Long, ByVal wNewWord As Long) As Long
Const SWW_HPARENT = -8
Private Sub SetFloating(HwndChild As Long, HwndParent As Long)
    'IMPORTANTE - Richiamare SetNoFloating prima della chiusura della form
    Call SetWindowWord(HwndChild, SWW_HPARENT, HwndParent)
End Sub
Private Sub SetNoFloating(hwnd As Long)
    Call SetWindowWord(hwnd, SWW_HPARENT, 0&)
End Sub
'A QUI .......   ti consiglio di inserirlo in un bel modulo
Private Sub Command1_Click()
    ShowWindow Form2.hwnd, SW_SHOWNORMAL
    SetFloating Form2.hwnd, Form1.hwnd
End Sub
Private Sub Command2_Click()
    ShowWindow Form2.hwnd, SW_HIDE
    SetNoFloating Form2.hwnd   'Non indispensabile, Cmq non gli fa male
End Sub
Private Sub Form_Unload(Cancel As Integer)
    SetNoFloating Form2.hwnd
    'Se vuoi fare il figo sino in fondo, puoi usare un altra API
    'al posto di Unload Form2, che si chiama DestroyWindows
    DestroyWindow Form2.hwnd
    Unload Form2
End Sub
' FINE CODICE
FORM1***********************************************************************
****
Crea un form (Form2) con una Label dove scriverai il tuo messaggio d' attesa
per l' utente
' INIZIO CODICE FORM2
***************************************************************************
Option Explicit
'Serve solo per spostare il Form senza la barra.
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As
Any) As Long
Const HTCAPTION = 2
Const WM_NCLBUTTONDOWN = &HA1
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
Dim Dummy As Long
    X = ReleaseCapture()
    Dummy = SendMessage(Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
End Sub
' FINE CODICE
FORM2***********************************************************************
****
Crea un form MdiForm ed inserisci nel menu la chiamata per l' apertura del
Form1, che rappresenta per te il tuo form in VbModal
' INIZIO CODICE MDIFORM1
***************************************************************************
Option Explicit
Private Sub PrimoForm_Click()
    Form1.Show vbModal
End Sub
' FINE CODICE
MDIFORM1********************************************************************
*******
Bene , io ho finito, ma se c'è qualcosa da chiarire postami
a: 
ara...@libero.it


Anch'io ho un problema simile e ho provato a risolverlo in questo
modo,ma purtroppo il label dovrebbe apparire sopra un file list box,
ma questo appare impossibile. Se invece uso un altra form questa non
mi appare in tempo, ovvero l'esecuzione del programma finisce prima
che faccia in tempo ad apparire la form.
-----------------------------
Ciao a tutti da FEliX 73
EMail:f.fas...@NOSPAMflashnet.it

 che faccia in tempo ad apparire la form.
intanto, grazie del carissimo :)
non sono sicuro di capire la storia del label e del filebox.
ma se finisce prima di caricare il form, non c'e' neanche da attendere,
direi :)
ciao, pal
ps - qualche volta io uso anche la caption del form, tipo "scheda n. +
contatore" sparati direttamente in caption durante un ciclo.
fa venire un po' il mal di mare, ma dalla via che e' disponibile mi scoccia
non usarla, e non appesantisce.
se poi uno non soffre il mal di mare e' pure comodo.