Newsgroup: it.comp.lang.visual-basic
Titolo: Anomalia VB con evento ADD (classe di insieme)

Ragazzi ho un comportamento di VB alquanto strano  o per lo meno io non 
riesco a capire il perchè
  1.. Apro un file di testo
  2.. Trovo l'inizio e la fine dei dati da elaborare
  3.. Una volta saputo la riga di inizio e la riga di fine ( il file 
(purtroppo non sempre è uguale) elaboro la stringa dove ho caricato 
inizialmente il file e quando trovo i dati che mi interessano li aggiungo in 
una classe di insieme.
Il problema che mi si pone è che appena le condizioni lo permettono ed entro 
dentro l'evento ADD della classe di insieme invece di aggiungermi le 
proprietà nell'insieme e VB esce dalla SUB anche se il ciclo DO WHILE non è 
terminato.
La cosa strana è che quando arrivo all'evento ADD della classe di insieme VB 
esce senza motivo apparente dalla SUB. Mi sapreste dire dove sbaglio?
Metto sotto il codice ( ho tagliato l'elaborazione perchè è inutile metterla 
e complicherebbe il debug) e metto l'evento ADD della classe d'insieme che 
ho fatto tramite la creazione guidata di VB
1)
Public Sub CaricaFile()
frmTurno.CommonDialog1.ShowOpen
intFile = FreeFile
strFile = frmTurno.CommonDialog1.FileName
On Error Resume Next
Open strFile$ For Input As #intFile
If strFile$ = "" Then Exit Sub
strRows = Split(Input$(LOF(intFile), #intFile), vbCrLf)
Close #intFile
Trova_Inizio_e_fine
End Sub ************************************************  punto di ritorno 
********************************
2)
Public Sub Trova_Inizio_e_fine()
For i = LBound(strRows) To UBound(strRows)
    [cut]
            elaborazione testo
    [cut]
Next
'Avendo trovato da dove inizia e da dove finisce elaboro il file di testo 
per trovare i dati che servono
AddAvvicendamenti StartSchedule, EndSchedule
End Sub
3)
Public Sub AddAvvicenamenti(InizioTurno As Integer, FineTurno As Integer)
Dim i                            As Integer
Dim Giorno                   As Date
Dim Attività                   As String
Dim Riga                      As String
Dim HB                        As String
Dim HD                        As String
Dim HF                        As String
Dim HI                         As String
Dim HS                        As String
Dim HSOS                   As String
Dim HV                        As String
Dim DA                        As String
Dim A                          As String
Dim TipoAereo              As String
Dim TipoAvv                  As String
Dim Tratta                    As Ctratte
Dim avvicendamenti      As New Collection
i = InizioTurno
Do
'Scrivere funzione che importi il turno dentro un insieme di oggetti 
(v.Classe Tratta in Tratte)
    Riga = Trim$(strRows(i))
    If Riga <> "" Then
        Giorno = Mid$(Riga, 1, 2) & "/" & (DV.MeseBustaPaga) & "/" & 
(DV.AnnoBustaPaga)
        TipoAereo = Trim$(Mid$(Riga, 6, 5))
        Attività = Trim$(Mid$(Riga, 12, 15))
        HB = Trim$(Mid$(Riga, 37, 5))
        HI = Trim$(Mid$(Riga, 42, 5))
        HF = Trim$(Mid$(Riga, 47, 5))
        HD = Trim$(Mid$(Riga, 52, 5))
        DA = Trim$(Mid$(Riga, 58, 4))
        A = Trim$(Mid$(Riga, 63, 4))
        HV = Trim$(Mid$(Riga, 69, 5))
        HS = Trim$(Mid$(Riga, 75, 5))
        HSOS = Trim$(Mid$(Riga, 81, 5))
        Select Case UCase(TipoAereo)
            Case Is = "M80"
                TipoAvv = "M/R"
            Case Is = "M82"
                TipoAvv = "M/R"
            Case Is = "772"
                TipoAvv = "L/R"
        End Select
        If TipoAereo <> "" Then
            Tratta.Add Giorno, TipoAereo, TipoAvv, Attività, HB, HI, HF, HD, 
DA, A, HV, HSOS, HS, 0, 0  ********* qui mi esce e mi torna al punto 1
        End If
  End If
    i = i + 1
 Loop Until i > FineTurno
End Sub
EVENTO ADD
Public Function Add(Giorno As Date, TipoAereo As String, TipoAvv As String, 
Attività As String, HB As String, HI As String, HF As String, HD As String, 
DA As String, A As String, HV As String, HSOS As String, HS As String, 
OreNotturne As Double, DiariaMaturata As Double, Optional sKey As String) As 
CTratta
    'crea un nuovo oggetto
    Dim objNewMember As CTratta
    Set objNewMember = New CTratta
    'imposta le proprietà passate al metodo
    objNewMember.Giorno = Giorno
    objNewMember.TipoAereo = TipoAereo
    objNewMember.TipoAvv = TipoAvv
    objNewMember.Attività = Attività
    objNewMember.HB = HB
    objNewMember.HI = HI
    objNewMember.HF = HF
    objNewMember.HD = HD
    objNewMember.DA = DA
    objNewMember.A = A
    objNewMember.HV = HV
    objNewMember.HSOS = HSOS
    objNewMember.HS = HS
    objNewMember.OreNotturne = OreNotturne
    objNewMember.DiariaMaturata = DiariaMaturata
    If Len(sKey) = 0 Then
        mCol.Add objNewMember
    Else
        mCol.Add objNewMember, sKey
    End If
    'restituisce l'oggetto creato
    Set Add = objNewMember
    Set objNewMember = Nothing
End Function
Debby

 riesco a capire il perchè
- Metti Option Explicit all'inizio e avvia con CTRL+F5
- Commenta eventuali 'on error'
Prova questa sintassi:
Call Tratta.Add (Giorno, TipoAereo, TipoAvv, Attività, HB, HI, HF, HD, 
DA, A, HV, HSOS, HS, 0, 0 )
Ciao
Alberto
-- 
Autore di
"Petting for Dummies"

 ho fatto tramite la creazione guidata di VB
Metti un breakpoint sulla prima istruzione del metodo Add della classe, ed avvia
il programma.
Quando si ferma sul breakpoint, usando il menu contestuale, setta "Interrompi ad
ogni errore" o "Break on all errors".
Continua l'esecuzione, dovrebbe interrompersi sulla riga che ha l'errore.
La cosa migliore è comunque prevedere il gestore degli errori nella sub Add, ad
esempio:
Public Function Add(Giorno As Date, TipoAereo As String, TipoAvv As String,
Attività As String, HB As String, HI As String, HF As String, HD As String,
DA As String, A As String, HV As String, HSOS As String, HS As String,
OreNotturne As Double, DiariaMaturata As Double, Optional sKey As String) As
CTratta
    On Error Goto ErrorHandler
    'crea un nuovo oggetto
    Dim objNewMember As CTratta
...
    Exit Sub
ErrorHandler:
    Debug.Print Err.Description
    Debug.Assert False    ' Così nell'ambiente di sviluppo si blocca e puoi
eseguire passo-passo
    Select Case MsgBox(Err.Description, vbExclamation Or vbAbortRetryIgnore,
"Errore inatteso")
    Case vbRetry
        Resume
    Case vbAbort
        Exit Sub
    Case vbIgnore
        Resume Next
    End Select
Bye
Raf

 ha scritto nel messaggio
news:wRhPe.101975$fm.67...@news4.tin.it...


 Debby
Bye
Raf

Cavolo non avevo mai fatto caso alla diferenza sul breakpoint.
Raf ho fatto come hai detto tu ho messo "interrompi ad ogni errore" ( prima 
stava a "interrompi in modulo di classe")
Mi esce l'errore 91 Variabile oggetto non impostata
ma io ho dimensionato la variabile nella SUB scrivendo
Dim Tratta              As Ctratte
La devo scrivere a livello di modulo e renderla Public?
Debby 

 Dim Tratta              As Ctratte
E con questo l'hai dimensionata.
Ma l'hai istanziata?
Set Tratta = New CTratte


 ha scritto nel messaggio
news:deld7e$1cd$1...@newsreader.mailgate.org...

Se fosse un problema di scope (visibilità) avresti un errore in compilazione,
non a run-time.
Albe ti ha dato il suggerimento giusto.
Bye
Raf

Hehehe.... Si Albe l'avevo istanziata così....
Sai ho un maestro che non mi segue tanto ma ha una pazienza grande quanto 
una casa....
E' la seconda volta che uso classi di insiemi ( me lo ha consigliato il 
prof) e siccome la prima volta
ho avuto problemi di visibilità ho accentrato i miei pensieri sulla 
visibilità scordandomi di istanziare l'insieme
Mea culpa ma sicuramente ( spero) next time lo ricorderò
Grazie ragazzi senza di voi non avrei fatto tutto quello che ho fatto....
Che brutta frase, ma spero che abbia reso l'idea.
Un bacio ad Albe e un abbraccio a Raf,,
Grazie Debby 

Tataaaa ennesima domanda stupida per voi meno stupida per me.
Andando a controllare che il mio insieme si popoli in modo giusto ho notato 
quanto segue:
Tratta
|_mCol
|_NewEnum
|_Item1
|_Item2
|_Item3
....
dentro Item ho le voci doppie ma con nome diverso.
|_Item1
  |_A                    "FCO"
  |_Attività            "AZ 1752"
  |_DA                 "CTA"
  |_Giorno            <Necessario oggetto>
...
  |_mvarA            "FCO"
  |_mvarAttività    "AZ 1752"
  |_mvarDA          "CTA"
  |_mvarGiorno    #02/03/05#
E' giusto cosi oppure devo correggere qualcosa nella classe CTratta?
Poi guardate la proprietà giorno. Nel primo caso mi dice che è necessario un 
oggetto e quindi non trovo il parametro che gli ho passato con l'evento ADD, 
nel secondo (mvarGiorno) la proprietà è riempita con il parametro che gli ho 
passato.
Che vuol dire? Dove sta l'errore?
Debby 

 Che vuol dire? Dove sta l'errore?
Come è definita la proprietà Giorno? Posta il codice delle property let (o set)
e get.
Sembrerebbe che Giorno sia stata definita come oggetto e non come tipo Date.
Ciao
Raf
P.S. Attenzione alla nomenclatura: Add non è un *evento* ma un *metodo*.
Il tuo "prof" non ti ha spiegato la differenza?

 Il tuo "prof" non ti ha spiegato la differenza?
Il mio prof me l'ha spiegata sono io che ho qualche neurons che ogni tanto 
fa i capricci
Smack Raf e grazie per oggi per ieri e per.... la pazienza ( miiiiii che 
ruffiana!!!)

 Il tuo "prof" non ti ha spiegato la differenza?
Il mio prof me l'ha spiegata sono io che ho qualche neurons che ogni tanto


 ruffiana!!!)
Prego, prego!
Ciao
Raf

 fare con gli oggetti mentre qui non ce ne sono?
Mi viene da dire che Set non ci vuole ma la classe Tratta l'ha creata VB
davo per scontato che fosse giusta.
Debby

 > La magagna è per forza in questo punto:

Centro. Ecco quindi un buon motivo per non fidarsi troppo dei wizard di
generazione automatica di codice.
Però è strano: ho fatto una prova io stesso creando con il Class Builder
Wizard una classe CTratta e aggiungendo una proprietà Giorno As Date, ma a
me il Set non è venuto fuori!
Boh?!
'Notte
Raf

Okay ho tolto il Set e no mi appare più "necessita oggetto" ma rimangono le
voci doppie anche se simili tipo
dentro Item ho le voci doppie ma con nome diverso.
|_Item1
  |_A                    "FCO"
  |_Attività            "AZ 1752"
  |_DA                 "CTA"
  |_Giorno            #02/03/05#
...
  |_mvarA            "FCO"
  |_mvarAttività    "AZ 1752"
  |_mvarDA          "CTA"
E' mi sembra di aver capito  che sia giusto cosi.
Io però quando ci devo lavorare per fare ulteriori calcoli mi devo riferivi 
ai nomi veri nel senso. Se prendo la proprietà DA dell'insieme 1 mi devo 
riferire a Da e non a mvarDA giusto?
Debby

A me lo ha consigliato il mio Tutor di smanettare con il Class Builder
hehehe... chissà che ho combinato però grazie al builder ho creato gli
insiemi per me tabù
Debby


 ha scritto nel messaggio
news:detf3l$nq$1...@newsreader.mailgate.org...

Nel tuo caso, ispezionare l'una o l'altra è indifferente, essendo coincidenti,
ad es.:
DA = valore restituito dalla Property Get (che è una function a tutti gli
effetti) DA
Public Property Get DA() As String
    DA = mvarDA    ' Sono coincidenti
End Property
Diverso sarebbe in un caso ad esempio in cui una proprietà pubblica non abbia
palesemente una variabile privata come "ombra", ma si ottenga con una
trasformazione, ad es.
Private mvarDistanza As Long    ' Rappresentata ad es. in metri
Public Property Get Distanza() As Single    ' Rappresentata in Km
    Distanza = mvarDistanza / 1000
End Property
Public Property Let Distanza(ByVal Value As Single)
    mvarDistanza = CLng(Value * 1000)    ' Occhio agli overflow...
End Property
Chiaro?
Bye
Raf
P.S. Non dar troppo retta al tuo tutor ;)

C'era una volta cappuccetto rosso che andava in giro con una cesta piena
di Array, poi incontro´ il lupo che gli disse:
Bella bambina dove vai con questa cesta piena zeppa di Array? Non e'
meglio per la tua schiena riempire la cesta di insiemi?
Sono piu leggeri e quando ti serve un insieme in particolare fai subito
a trovarlo.
Cosi cappuccetto rosso torno a casa e rifare la cesta.
Raf ti piacciono le fiabe a lieto fine?
Anche a me anche se cappuccetto rosso ancora non  ha capito perche´ ha
dato retta al lupo cattivo. Lo avra' scambiato forse per il principe
azzurro?
mmm... no quella era un'altra favola!!! Ghghgh....
Ti spiego quello che la mia testa vorrebbe fare.
Prendo un file txt dove c'e´un ipotetico turno di lavoro
Questo turno ha delle indicazioni
Io le importo dentro un insieme anzi gli insiemi sono piu di uno perche
alcuni
inglobano altri ( forse pero il lupo non intendeva questo... ci devo
parlare quando lo incontro nella casa della nonna) =)
Turno
|______Avvicendamenti
       |____________Avvicendamento 1
       |____________Avvicendamento 2
       |____________Avvicendamento 3
.....
dentro l'insieme Avvicendamento:
Avvicendamento
|_____________Giorno
|_____________Attivita'
|_____________Da
|_____________A
|_____________Orario di firma
|_____________Orario di decollo
|_____________Orario di arrivo
|_____________Ore volo
|_____________Ore servizio *
|_____________Ore di sosta *
|_____________Ore notturne **
|_____________Diaria Maturata **
Le voci senza asterisco le trovo tutte nel file txt
(*)
Non sempre sono presenti infatti se nello stesso giorno si effettuano
piu tratte
le voci contrassegnate staranno solo nell'ultima tratta dove appunto si
trovera' il resoconto totale
( fin qui tutto oK o quasi, con una serie di IF THEN penso di riuscire a
farglielo capire)
(**)
Queste voci invece le vorrei far calcolare al programma che sto
scrivendo. Le regole non sono difficile per esempio per la
diaria so che ogni ora di servizio matura 3,5 EURO per un massimo di 12
ore ma ho notato che quando scrivo:
tratta.add (avendo io scritto nella classe Tratta le Property Get/Let
relativa a Diaria) mi chiede il parametro relativo alla diaria che
inizialmente io non ho.
Io ho fatto questo ragionamento ma non so se e´esatto.
Quando importo il turno nell'insieme al momento di passargli il
parametro Diaria io scrivo 0.
Ora la mia domanda e´questa posso io scrivere nella Get una cosas del
tipo If Diaria = 0 then ... vatti a vedere le ore di servizio e
ricalcolati la diaria?
O e' sbagliato concettualmente?
Insomma mi sto un po' imbrogliando da sola ed ho bisogno che qualcuno
porti Cappuccetto Rosso sulla retta via.
Anche perche´una volta importato il turno lo devo riportare dentro una
griglia ( non dovrebbe essere un problema) ma dopo devo andare a
scrivere
questi dati dentro un DataBase che si aggiorna ogni volta che si importa
un turno.
Ora a parte i relativi controlli che dovro´scrivere per verificare se il
turno gia´c'e´nel database oppure no, io dovro´creare un db che mi
permetta poi
a fine anno di fargli qualche domandina tipo: Quante tratte hai fatti in
un anno? Oppure quante ore di volo o di transito hai fatto in un anno?
Raf che dici chiedo aiuto al Lupo?
Spero di essermi fatta capire 
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Raf che dici chiedo aiuto al Lupo?
Va', chiedi pure al tuo "tutor"... ma attenta alle frasi tipo "che occhi grandi
che hai..."
Bye
Raf

 che hai..."
Per guardarti meglio Nonna!
Ma Nonnaaa!!!!!!!!! Che... che... mmm.... bocca grande che hai?
Mettendo per inciso che da quando ho scritto ad oggi non ho messo mano a VB 
ho riletto quello che ho scritto e ho anche ripensato a quello che ho 
scritto e penso invece di stare sulla strada sbagliata
( ti mando un file txt in pvt cosi vedi cosa dico e forse ti rendi conto)
Quello che ho scritto potrebbe risultare giusto qualora un turno sia tutto 
su un unica riga. Il problema qual'è?
Io ho dei dati che mi servono a tirar fuori DIARIA GIORANLIERA E ORE 
SERVIZIO NOTTURNO (qualora ci siano)
Per calcolare la Diaria io devo andare a prendere l'orario di firma e 
l'orario di fine servizio.
Se all'atto della creazione dell'insieme io trovassi tutti questi dati su un 
unica riga il gioco sarebbe semplice ( può succedere ma quasi sempre non è 
cosi).
Quand'è che non succede? Quando per esempio nello stesso giorno si facciano 
piu tratte. Mettiamo caso che si facciano 3 tratte ( raf seguimi che tanto 
agli altri già è venuto sonno)
io troverei una cosa di questo tipo
 GG       ATTIV.  FIRMA   DEC  ARR     DA       A     F.SERV
01VE   AZ1010    10.30    11.30  12.30   FCO  MXP
                                          13.30  14.30   MXP FCO
                                          15.40  17.00   FCO CTA     17.30
Vedi! Nella prima riga trovo la firma, nella seconda e terza la firma non 
c'è ma nella terza trovo la Fine del Servizio ed io per trovare la diaria 
maturata dovrei fare 17.30 - 10.30 = 7 ORE
Ora vediamo il mio ragionamento.
Leggo riga per riga
Arrivo alla prima, analizzo l'atività e se non è un riposo mensile entro 
dentro una CONDIZIONE
Appena entrata dico a VB di assegnare i valori di GG,ATT,FIRMA e via dicendo 
alle variabili che ho dimensionato
Poi carico tutto dentro l'insieme con Tratta.ADD
Scendo di riga
A questo punto dico a VB di analizzare il giorno.
Se il giorno è lo stesso vuol dire che devo aggiungere qualcosa all'insieme 
appena creato e vado a verificare se F:SERV è presente ( nel caso lo fosse 
vuol dire che è l'utlima tratta del giorno)
Se non è l'ultima tratta SCENDO di nuovo di riga
Arrivo alla terza riga, analizzo il giorno e la F.Serv. una volta constatata 
che si tratta di una  TRATTA nello stesso giorno rivado a prendere l'insieme 
creato in precedenza e aggiungo l'ennesima tratta.
Quando arrivo alla fine della giornata di lavoro vado a calcolare la diaria 
in base ai dati che mi trovo nell'insieme e questi dati sono FIRMA e FINE 
SERVIZIO (gli altri calcoli mi risparmi di dirteli)
Ora questo che ho appena spiegato a parole si puo fare o è difficilissimo?
COme faccio ad aggiungere le tratte all'insieme se il METODO ADD è già 
impostato in modo da ricevere i dati della diaria?
POsso dire a VB che fino a quando non ho il dato FINE SERVIZIO la DIARIA è 0 
e poi all'ultimo modificare solo quella proprietà?
Mah!
Intanto mi leggo le fiabe che AMO QUELLE CHE FINISCONO A LIETO FINE, non 
vorrei rischiare di impiccarmi
Debby 

 Ma Nonnaaa!!!!!!!!! Che... che... mmm.... bocca grande che hai?
Sarà senz'altro per gridare meglio quando vede i tuoi sorgenti... ;-P
Ah, ho preferito risponderti in privato, per non tediare troppo gli altri del
NG...
Raf