Oppure

Loading
31/01/08 17:31
Furion
Salve ragazzi, è da tanto tempo che seguo questo sito con vivo interesse, per la qualità delle spiegazioni e dei sorgenti che postate. Ora è proprio un momento in cui mi serve questa qualità :k:

Ho scritto una sub avviata da un bottone che fa dei controlli sui valori numerici immessi dall'utente: dato che questi controlli possono prendere anche diversi secondi, vorrei far comparire l'immagine di una clessidra fintanto che la sub gira. A tal proposito ho inserito nel form un controllo image (chiamato Clessidra) e gli ho impostato l'immagine che voglio utilizzare con la proprietà Picture in fase di progettazione. Infine ho settato la proprietà Visible a False ed ho messo come prima istruzione di quella sub di cui prima che fa i controlli come segue:

Clessidra.Visible = True

Il fatto è che l'immagine viene visualizzata solo nel momento in cui la sub si ferma e comunica il risultato (negativo o positivo) dei controlli con una Message Box. Sapete dirmi cosa devo fare?

GRAZIE MILLE :k: :k:
aaa
31/01/08 17:39
Overflow
ciao, dovresti postare il codice che usi.

comunque posso cercare di dare una spiegazione, evidentemente la sub viene eseguita velocemente che sembra che l'immagine appaia quando la sub è terminata.prova ad usare l'api sleep, in questo modo.
'dichiarazione dell'api sleep in generale
Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

sub tuasub()
clessidra.visible=true
sleep(2000)
'esegui le istruzioni
msgbox "sub terminata"
end sub


prova in questo modo, l'immagine dovrebbe apparire circa 2s prima della messagebox.

Ciao
Ultima modifica effettuata da Overflow 31/01/08 17:41
aaa
31/01/08 17:48
Furion
Uhm... no purtroppo non sembra funzionare. Posto di seguito il codice della sub come mi avete detto:

Private Sub Validate_cmd_Click()
' Visualizza la clessidra
Clessidra.Visible = True
' Disabilita temporaneamente le funzioni del programma (previene la convalida con parametri corretti
' e l'uso con altri errati).
CPT_Open_Source_cmd.Enabled = False
DPT_Open_Source_cmd.Enabled = False
ProfSave_Cmd.Enabled = False
P = Q = E = N = D = -1
vparams = False
' Verifica i dati immessi nella finestra "Impostazioni"
' 1 - Controlla che i tre campi non siano vuoti
If (PrimeP_txt.Text = "" Or PrimeQ_txt.Text = "" Or NumE_txt.Text = "") Then
   MsgBox ("Attenzione! Riempire tutti i campi, prego.")
   GoTo USCITA
End If
' 2 - Controlla che i numeri P e Q immessi siano primi e maggiori di 100.000
' 2.1 - Controllo Cifre
If (CDbl(PrimeP_txt.Text) < 100000 Or CDbl(PrimeQ_txt.Text) < 100000) Then
   MsgBox ("Attenzione! I numeri P e Q devono avere almeno 6 cifre.")
   GoTo USCITA
End If
' 2.2 - Primalità
If isPrime(CDbl(PrimeP_txt.Text)) <> True Then
   MsgBox ("Attenzione! Il numero P inserito, non è primo.")
   GoTo USCITA
End If
If isPrime(CDbl(PrimeQ_txt.Text)) <> True Then
   MsgBox ("Attenzione! Il numero Q inserito, non è primo.")
   GoTo USCITA
End If
' 3 - Controlla che (P - 1) e (Q - 1) siano coprimi con E e che E sia > 1
If CDbl(NumE_txt.Text) <= 1 Then
   MsgBox ("Attenzione! Il numero E deve essere maggiore di 1.")
   GoTo USCITA
End If
If (MCD(CDbl(PrimeP_txt.Text) - 1, CDbl(NumE_txt.Text)) <> 1) Or (MCD(CDbl(PrimeQ_txt.Text) - 1, CDbl(NumE_txt.Text)) <> 1) Then
   MsgBox ("Attenzione! Il numero E inserito non è coprimo con (P - 1) e/o (Q - 1).")
   GoTo USCITA
End If
' 4 - Verifica che non esista già un altro utente in rubrica con gli stessi parametri
MsgBox ("verificare che non esiste già qualcuno con questi parametri")
' Informa l'utente dell'esito positivo del test
MsgBox ("Parametri convalidati. È ora possibile salvare questo profilo ed utilizzare il programma.")
' Imposta i valori immessi come quelli correnti
Dim i As Double
i = 1
P = CDbl(PrimeP_txt.Text)
Q = CDbl(PrimeQ_txt.Text)
E = CDbl(NumE_txt.Text)
N = P * Q
'While (SecureMod(N * i + 1, SecureMod(E, N)) <> 0)
'   i = i + 1
'Wend
'D = (N * i + 1) / SecureMod(E, N)
' Abilita le operazioni di Criptaggio, Decriptaggio e salvataggio del profilo
CPT_Open_Source_cmd.Enabled = True
DPT_Open_Source_cmd.Enabled = True
ProfSave_Cmd.Enabled = True
vparams = True
USCITA:
' Nasconde la clessidra
Clessidra.Visible = False
End Sub
aaa
31/01/08 18:20
gius
Deve funz per forza,aumenta lo sleep da 2000 a 4000 e vediamo se funz:D
aaa
31/01/08 18:32
gantonio
No ... il problema non si risolve con la Sleep (anzi, con questa istruzione peggiora ...) ...

Il fatto e' che il messaggio WM_PAINT di Windows per il ridisegno del form e' a basso livello e quindi viene preso in considerazione solamente dopo la fine della Sub.

Per fare in modo che la pompa dei messaggi di Windows si occupi del ridisegno prima che terminino le altre operazioni, bisogna attivarla esplicitamente. Per farlo puoi usare una istruzione

DoEvents

inserita in questo modo

Private Sub Validate_cmd_Click() 
' Visualizza la clessidra 
Clessidra.Visible = True 
' Disabilita temporaneamente le funzioni del programma (previene la convalida con parametri corretti 
' e l'uso con altri errati). 
CPT_Open_Source_cmd.Enabled = False 
DPT_Open_Source_cmd.Enabled = False 
ProfSave_Cmd.Enabled = False 
DoEvents
...


Leggendo il tuo codice, ho visto che scrivi

P = Q = E = N = D = -1 


ma il VB non e' mica come il C !

Queste scritture (che in C assegnano il valore -1 a tutte le variabili) non si comportano affatto cosi' in VB.

Devi assegnare il valore -1 alle singole variabili.
aaa
31/01/08 19:09
Furion
Oddio è vero, grazie! Il fatto è che a casa programmo in VB e all'uni in C. Ergo fo una confusione totale :asd:

P.S. : perfetto ragazzi, grandissimi come al solito! Ora la sub gira come una spada e la clessidra compare quando lo dico io.

GRAZIEEEEEEEEEEEEEEEEEEEEEE!!!!!
Ultima modifica effettuata da Furion 31/01/08 19:11
aaa