Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - Utilizzo del controllo Image
Forum - Visual Basic 6 - Utilizzo del controllo Image

Avatar
Furion (Normal User)
Rookie


Messaggi: 51
Iscritto: 31/01/2008

Segnala al moderatore
Postato alle 18:31
Giovedì, 31/01/2008
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:

PM Quote
Avatar
Overflow (Normal User)
Expert


Messaggi: 334
Iscritto: 11/01/2008

Segnala al moderatore
Postato alle 18:39
Giovedì, 31/01/2008
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.
Codice sorgente - presumibilmente VB.NET

  1. 'dichiarazione dell'api sleep in generale
  2. Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
  3.  
  4. sub tuasub()
  5. clessidra.visible=true
  6. sleep(2000)
  7. 'esegui le istruzioni
  8. msgbox "sub terminata"
  9. end sub



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

Ciao

Ultima modifica effettuata da Overflow il 31/01/2008 alle 18:41
PM Quote
Avatar
Furion (Normal User)
Rookie


Messaggi: 51
Iscritto: 31/01/2008

Segnala al moderatore
Postato alle 18:48
Giovedì, 31/01/2008
Uhm... no purtroppo non sembra funzionare. Posto di seguito il codice della sub come mi avete detto:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Validate_cmd_Click()
  2. ' Visualizza la clessidra
  3. Clessidra.Visible = True
  4. ' Disabilita temporaneamente le funzioni del programma (previene la convalida con parametri corretti
  5. ' e l'uso con altri errati).
  6. CPT_Open_Source_cmd.Enabled = False
  7. DPT_Open_Source_cmd.Enabled = False
  8. ProfSave_Cmd.Enabled = False
  9. P = Q = E = N = D = -1
  10. vparams = False
  11. ' Verifica i dati immessi nella finestra "Impostazioni"
  12. ' 1 - Controlla che i tre campi non siano vuoti
  13. If (PrimeP_txt.Text = "" Or PrimeQ_txt.Text = "" Or NumE_txt.Text = "") Then
  14.    MsgBox ("Attenzione! Riempire tutti i campi, prego.")
  15.    GoTo USCITA
  16. End If
  17. ' 2 - Controlla che i numeri P e Q immessi siano primi e maggiori di 100.000
  18. ' 2.1 - Controllo Cifre
  19. If (CDbl(PrimeP_txt.Text) < 100000 Or CDbl(PrimeQ_txt.Text) < 100000) Then
  20.    MsgBox ("Attenzione! I numeri P e Q devono avere almeno 6 cifre.")
  21.    GoTo USCITA
  22. End If
  23. ' 2.2 - Primalità
  24. If isPrime(CDbl(PrimeP_txt.Text)) <> True Then
  25.    MsgBox ("Attenzione! Il numero P inserito, non è primo.")
  26.    GoTo USCITA
  27. End If
  28. If isPrime(CDbl(PrimeQ_txt.Text)) <> True Then
  29.    MsgBox ("Attenzione! Il numero Q inserito, non è primo.")
  30.    GoTo USCITA
  31. End If
  32. ' 3 - Controlla che (P - 1) e (Q - 1) siano coprimi con E e che E sia > 1
  33. If CDbl(NumE_txt.Text) <= 1 Then
  34.    MsgBox ("Attenzione! Il numero E deve essere maggiore di 1.")
  35.    GoTo USCITA
  36. End If
  37. 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
  38.    MsgBox ("Attenzione! Il numero E inserito non è coprimo con (P - 1) e/o (Q - 1).")
  39.    GoTo USCITA
  40. End If
  41. ' 4 - Verifica che non esista già un altro utente in rubrica con gli stessi parametri
  42. MsgBox ("verificare che non esiste già qualcuno con questi parametri")
  43. ' Informa l'utente dell'esito positivo del test
  44. MsgBox ("Parametri convalidati. È ora possibile salvare questo profilo ed utilizzare il programma.")
  45. ' Imposta i valori immessi come quelli correnti
  46. Dim i As Double
  47. i = 1
  48. P = CDbl(PrimeP_txt.Text)
  49. Q = CDbl(PrimeQ_txt.Text)
  50. E = CDbl(NumE_txt.Text)
  51. N = P * Q
  52. 'While (SecureMod(N * i + 1, SecureMod(E, N)) <> 0)
  53. '   i = i + 1
  54. 'Wend
  55. 'D = (N * i + 1) / SecureMod(E, N)
  56. ' Abilita le operazioni di Criptaggio, Decriptaggio e salvataggio del profilo
  57. CPT_Open_Source_cmd.Enabled = True
  58. DPT_Open_Source_cmd.Enabled = True
  59. ProfSave_Cmd.Enabled = True
  60. vparams = True
  61. USCITA:
  62. ' Nasconde la clessidra
  63. Clessidra.Visible = False
  64. End Sub


PM Quote
Avatar
gius (Ex-Member)
Expert


Messaggi: 294
Iscritto: 20/06/2007

Segnala al moderatore
Postato alle 19:20
Giovedì, 31/01/2008
Deve funz per forza,aumenta lo sleep da 2000 a 4000 e vediamo se funz:D

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 19:32
Giovedì, 31/01/2008
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

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Validate_cmd_Click()
  2. ' Visualizza la clessidra
  3. Clessidra.Visible = True
  4. ' Disabilita temporaneamente le funzioni del programma (previene la convalida con parametri corretti
  5. ' e l'uso con altri errati).
  6. CPT_Open_Source_cmd.Enabled = False
  7. DPT_Open_Source_cmd.Enabled = False
  8. ProfSave_Cmd.Enabled = False
  9. DoEvents
  10. ...



Leggendo il tuo codice, ho visto che scrivi

Codice sorgente - presumibilmente Plain Text

  1. 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.

PM Quote
Avatar
Furion (Normal User)
Rookie


Messaggi: 51
Iscritto: 31/01/2008

Segnala al moderatore
Postato alle 20:09
Giovedì, 31/01/2008
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 il 31/01/2008 alle 20:11
PM Quote