Newsgroup: it.comp.lang.visual-basic
Titolo: [vb6] Routine in esecuzione

In una applicazione MDI ho bisogno di poter gestire la seguente
situazione:
1 - L'utente lancia una routine che puň essere anche lunghetta.
2 - Lo stato di avanzamento viene rappresentato da una progress bar.
3 - L'utente o aspetta o preme un cancel e la interrompe.
4 - Se la routine č in esecuzione, l'utente non deve poter fare altro
che premere cancel.
Insomma, una situazione abbastanza comune negli applicativi, ma di cui
non vengo a capo.
Il problema č al punto 4. 
Mi sembra(va) che la maniera piů semplice fosse quella di creare un
nouvo form, es. formX, ficcargli dentro la routine e lanciarlo modale.
Cosě facendo perň, essendo formX modale, devo per forza di cose far
partire la routine sul Form_Load,e fare l'unload quando questa
termina.
Ma se lo faccio, non posso chiamare il Load formX dall'altro form.
Insomma, il cane che si morde la coda....
Sicuramente mi sfugge qualcosa e, prima di provare a ricorrere a timer
vari, chiedo a voi.
Concettualmente, come si gestisce di solito questa situazione?

 
ActiveX.
C'e' un esempio passo-passo sulla guida, oppure qui:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vb98/html/vbsmpCoffeeCoffeeCoffee.asp
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 Così facendo però, essendo formX modale, devo per forza di cose far


 Concettualmente, come si gestisce di solito questa situazione?
 
Comunque, se decidi di utilizzare un altro form, potresti farlo vbModeless e
contemporaneamente nascondere il form principale durante la routine, per poi
renderlo di nuovo visibile proma dell'unload. Potrebbe andare?
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

Qualcosa sfugge anche a me: perché non puoi chiamare il load?
Per meglio dire: non posso chiamare lo show.
Il form non è più caricato. Ha fatto l'unload al termine 
della routine. 

 della routine. 
Premesso che sarebbe piuttosto meglio separare il codice applicativo 
dalla visualizzazione, nel tuo caso puoi risolvere cosi':
Sub ChiamoIlFormModale()
	Dim varForm As <il_form_che_contiene_la_routine>
	Set varForm = New <il_form_che_contiene_la_routine>
	Load varForm
	varForm.Show vbModal
	Set varForm = Nothing
End Sub
Nel form che contiene la routine metti nel Load soltanto quello che ti 
serve per impostare controlli, testi, ecc., mentre nell'Activate piazzi 
il dirty trick ;-)
Sub Form_Activate()
	Static giaFatto As Boolean
	Me.Refresh
	If (giaFatto) Then Exit Sub
	giaFatto = True
	Call routineLungaEComplessa()
End Sub
Function routineLungaEComplessa() As Long
	......
	<codice vario>
	......
	Unload Me
End Function
-- 
ciao, hal

dalla visualizzazione ....
Verissimo, se ho capito cosa intendi, tant'é che l' idea iniziale era
piazzare sul form modale solo la progress bar, (per  riutilizzarlo anche in
altre situazioni), e lasciare lì dov'era la routine (pubblica in un modulo).
Poi mi sono incartato.
Quando il cervello parte per lidi contorti, non c'è nulla da fare.
La maniera corretta di istanziare il form l'avevo omessa per non farla
lunga, il problema era da un'altra parte.
Comunque, la cosa più pulita da fare, ripensandoci, è quella di far partire
la routine al click di un pulsante sul form modale.
Avevo scartato questa cosa perchè era stupido costringere l'utente a
confermare una cosa che aveva già scelto di fare cliccando su un tasto
dell'altro form (trattasi di creare on-the-fly una pagina html con i dati di
una listview e aprirla con il browser. By the way, ci sono pericoli riguardo
l'eventuale lunghezza della stringa?).
In realtà avevo già pronto un altro form modale da aprire all'occorrenza per
cambiare i settings del report (quante righe, quali colonne, che colori,
page-break ecc.)
Basta solo mostrarla ogni volta e lanciare da lì la routine, giustificando
così il secondo click.
L'altra soluzione l'adotterò per la chiusura del programma (compattazione
db, backup di files ecc..)
Un sentito grazie a quanti mi hanno risposto.
PS. Scusa Hal, ma per errore devo averti risposto in privato. :-(