Newsgroup: it.scienza.informatica
Titolo: Aiuto in Visual Basic (3) (mi spiego meglio)

Ho scritto un programmino che elabora una serie di dati numerici che
corrispondono a misure topografiche terrestri e GPS. Nel corso
dell'elaborazione il programma scrive dei valori in un file di testo il
quale dovrebbe venire letto da un programma esterno DOS scritto in
FORTRAN. quest'ultimo al termine del calcolo scrive i risultati in un
secondo file di testo che a sua volta deve venire letto
dall'applicazione VB. Come effettuare correttamente la chiamata al
programma DOS?
Ho provato con il comando "Shell" , il quale fa partire il programma
esterno, ma non consente all'applicazione VB di attendere il termine
della scrittura dei dati nel file, quindi il programma va subito a
leggere un file che non è stato ancora scritto.
Fatto ciò il programma funziona correttamente fintantochè vengano
immessi correttamente i dati. In una TextBox vanno immessi solamente
numeri, il separatore decimale (virgola) ed eventualmente il segno meno
(-) davanti al numero.
A tal proposito vorrei  eseguire il controllo sull'immissione del testo
nel momento in cui l'utente indica che ha terminato l'immissione in tale
campo (textbox), cosa che si può dedurre quando passa ad un'altra
control premendo il tasto TAB o facendo click con il mouse. In questo
caso viene generato l'evento "LostFocus" che può venire utilizzato come
controllo. Esso indica la perdita dell'azione per il campo di immissione
testo. Se il campo viene riconosciuto come errato, è possibile il metodo
"SetFocus" per obbligare l'azione sul campo di immissione. Tuttavia
l'uso di questo metodo non restituisce immediatamente l'azione alla
control, poichè Windows assegna l'azione prima alla control che la
doveva ottenere in seguito all'azione dell'utente. Per esempio, se una
control C1 ha l'azione e l'utente fa click su una control C2 si avranno
i seguenti eventi:
- C1 riceve un evento "LostFocus", e si può quindi richiamare "SetFocus"
su C1 per annullare la perdita di azione;
- C2 ottiene ugualmente l'azione e riceve un evento "GotFocus";
- C2 perde subito l'azione e riceve un evento "LostFocus";
- C1 ottiene l'azione e riceve un evento GotFocus.
Il metodo "SetFocus" è quindi asincrono, il suo effetto non è immediato.
Ciò può portare al bloccaggio se nell'esempio che ho fatto viene
chiamato il metodo "SetFocus" su C2 in fase di elaborazione dell'evento
dell'evento "LostFocus" per C2.
Immagino che esisteranno delle routine per il controllo del testo,
purtroppo non riesco a reperirle.
Grazie di cuore a chi può essermi di aiuto.
Saluti.
        Mirko

 leggere un file che non è stato ancora scritto.
  [Omessa tutta la parte di gestione eventi in VB ]
Premetto che tutti il linguaggi che conosco hanno un meccanismo per
chiamare un processo in esecuzione in modo "blocking", quindi forse si
tratta solo di trovare la chiamata giusta.
Se cio' non fosse per un limite del linguaggio, io farei come segue:
- il programma esterno scrive i dati su un file temporaneoi (diciamo:
  a.tmp), lo chiude al termine della scrittura e gli cambia nome (ed es.
  in b.tmp)
- il programma in VB, dopo aver lanciato l'applicazione esterna si mette
  in un loop in cui attende la creazione del file b.tmp e quindi prosegue
						l.f.
--------------------------------------------------------------------------
       -- )     Luca Fini                            Tel: +39 055 2752 307
 ___    |\      Osservatorio Astrofisico di Arcetri  Fax: +39 055 2752 292
/   |   | |\_   L.go E.Fermi, 5 +-----------------------------------------
(___|___//___)  50125 Firenze  /   WWW: 
http://www.arcetri.astro.it/~lfini
 (_)      (_)   Italia        / e-mail: 
lf...@arcetri.astro.it
-----------------------------+--------------------------------------------
                              In a world without fences - who needs GATES?

Ti chiedo scusa, ma non ho potuto quotare il tuo MSG, era troppo lungo.
Non so come hai scritto la tua routine, ma una routine del genere in
corrispondenza dell'evento LostFocus:
If Not IsNumeric(Text1.Text) Then
Text2.Text = "Errore"
Text1.SetFocus
Else
Text2 = "OK"
End If
sembra non dare alcun problema. E' vero che l'evento LostFocus è
asincrono, ma quell' attimo di pausa tra il LostFocus, il GotFocus della
text2 e il ritorno del focus alla text1 è impercettibile... almeno sulla mia
macchina basata su un normalissimo AMD-K6 225 (overclock :-)). Forse stai
facendo girare questo programma su una macchina + lenta o con poca RAM  (<
32Mb). Ho provato anche a far perdere il focus premendo un pulsante e
effettivamente l'evento Click non viene generato se la text non è corretta.
Ti faccio anche notare che questa routine così scritta non genera errore in
caso che nella text siano presenti il carattere '-' o la virgola.
Per quando riguarda il problema del file la soluzione più semplice che ho
trovato è quella di inserire una routine di controllo sull'esistenza del
file: se il file esiste(cioè è stato scritto correttamente dal tuo programma
DOS) il programma continua, altrimenti aspetta
Es:
          .
          .
While DIR("nomefile") = ""
Wend
          .
          .
/* Finquando non trovi "nomefile" non fare niente */
L'unico problema è che se il file, per qualsiasi motivo, non verrà mai
scritto, il tuo programma andrà in loop infinito... il che è un problema.
SIGH!
Però non disperare, su questo NG c'è parecchia gente(molto + in gamba di me)
in grado di aiutarti!!!!!!
Spero di averti in qualche modo aiutato e di non essere stato troppo
presuntuoso!,
forse non ho capito bene il tuo problema e ti ho raccontato solo frottole(se
così fosse scusami).
Se hai qualche problema fammi sapere (anche in privato), vedremo di
risolverlo ;-).
P.S. Se funziona mandami un OK
--
Homer --> ICQ#25235024
Corso di  Laurea in Ingegneria Elettronica - SUN
Seconda Università di Napoli
e-mail: 
morhom...@tin.it
 (elimina  XSPAMX  !!!!!)
---------------------------------------------------------------------------

Questa soluzione fa acqua da tutte le parti... Purtroppo applicando le
leggi di murphy in quell'istante impercettibile tra il Lostfocus e il
GotFocus succede di tutto. 
Quanto al "semaforo" While Dir("..")... almeno mettici un ritardo
dentro... che ne so` fai il controllo ogni 5 secondi.
Comunque se chiedeste su it.comp.lang.visual-basic vi saprebbero dire
meglio. Qui questi argomenti sono OT.
-- 
# Giorgio Vecchiocattivi.
# Dip. Informatica, Universita` di Pisa. 
---
E` in corso la CFV per la moderazione di it.scienza.informatica.
Se siete interessati leggete l'aritcolo su it.news.annunci