Italian Chiamata CallSub2

Fulvio75

Well-Known Member
Licensed User
Ciao, ho un problema con il CallSub2 durante la compilazione che va in errore perchè?

ModuloA è un modulo da chiamare
Codice è un codice stringa
Versione è una versione stringa
Data sono i dati che la sub chiamata deve interpretare

CallSub2(ModuloA,"Get_" & Codice & "_" & Versione,Data)
 

Fulvio75

Well-Known Member
Licensed User
a no... errore Codice è int no string
coma faccio a convertire direttamente dalla riga 'Codice' in stringa?
 

Fulvio75

Well-Known Member
Licensed User
Ho provato anche:

codice as string

CallSub2(ModuloA,Codice ,Data)

non compila ugualmente
 

Star-Dust

Expert
Licensed User
Longtime User
Puoi copiare il codice di errore e il pezzo del codice che genera l'errore?
 

Alessandro71

Well-Known Member
Licensed User
Longtime User
Cioè, tu vuoi comporre dinamicamente il nome della sub da chiamare a runtime?
mi sembra un modo per cercarsi problemi: non puoi chiamare sempre la stessa, con nome fisso e agire di conseguenza in base ad un parametro?
 

Fulvio75

Well-Known Member
Licensed User
Fatto... ora funziona

Prod_Class è una classe che contiene tutte le sub che devo chiamare che restituiscono il dato
Prod_Class la uso per poter utilizzare CallSub altrimenti con i moduli normali non funziona

Codice è string
Prod.Ver è int

B4X:
If SubExists(Prod_Class,"Get_" & Codice & "_" & $"${Prod.Ver}"$) = True Then
    CallSub2(Prod_Class,"Get_" & Codice & "_" & $"${Prod.Ver}"$,Dati)
End If
 

LucaMs

Expert
Licensed User
Longtime User
Fatto... ora funziona

Prod_Class è una classe che contiene tutte le sub che devo chiamare che restituiscono il dato
Prod_Class la uso per poter utilizzare CallSub altrimenti con i moduli normali non funziona

Codice è string
Prod.Ver è int

B4X:
If SubExists(Prod_Class,"Get_" & Codice & "_" & $"${Prod.Ver}"$) = True Then
    CallSub2(Prod_Class,"Get_" & Codice & "_" & $"${Prod.Ver}"$,Dati)
End If
Perché usi una smart string per Prod.Ver ma non per Codice? 😊
Inoltre, se prepari prima la stringa, non serve ripetere tutto il codice due volte, il che non è un problema, se non "esteticamente".
B4X:
Dim SubName As String
SubName = $"Get_${Codice}_${Prod.Ver}"$
If SubExists(Prod_Class, SubName) Then
    CallSub2(Prod_Class, SubName, Dati)
End If

[Prod_Class è un oggetto! Non potrai mai chiamare la Sub di un modulo di classe]
 

Fulvio75

Well-Known Member
Licensed User
Entrambi sono oggetti; più precisamente X punterà allo stesso-unico oggetto, prod_class.

Ripeto 'sta roba perché è importante, basilare (so che a molti sembrerò pedante/presuntuoso, ma molti altri provengono da... VB 3 😄 e non hanno assimilato la OOP).
Si che la chiama... Provato entra nella classe e trova la sub
 

LucaMs

Expert
Licensed User
Longtime User
Si che la chiama... Provato entra nella classe e trova la sub
Ti sembra, perché sei in modalità debug. In realtà tu chiami la Sub di una istanza di quella classe (= oggetto).

CallSub2(Prod_Class, SubName, Dati)

Non credo che Prod_Class sia il nome del modulo di classe, no? Dovrebbe essere il nome di una variabile:
B4X:
Dim Prod_Class As [NomeDelModuloDiClasse]
Prod_Class.Initialize
'...
CallSub2(Prod_Class, SubName, Dati)

Se, invece, Prod_Class è davvero il nome del modulo... è una caz...ta, non dovrebbe funzionare.
 

Fulvio75

Well-Known Member
Licensed User
Ti sembra, perché sei in modalità debug. In realtà tu chiami la Sub di una istanza di quella classe (= oggetto).

CallSub2(Prod_Class, SubName, Dati)

Non credo che Prod_Class sia il nome del modulo di classe, no? Dovrebbe essere il nome di una variabile:
B4X:
Dim Prod_Class As [NomeDelModuloDiClasse]
Prod_Class.Initialize
'...
CallSub2(Prod_Class, SubName, Dati)

Se, invece, Prod_Class è davvero il nome del modulo... è una caz...ta, non dovrebbe funzionare.
Prod_Class è la classe
X=Prod_class

X.initialize
Poi
CallSub2 (x, "nomesub della classe", parametro x sub)

Funziona
 

Fulvio75

Well-Known Member
Licensed User
?

Non hai chiamato una sub di un modulo di classe, in quanto non è possibile, hai chiamato la sub di X, che è un variabile oggetto (ovvero un oggetto) di tipo (classe) prod_class
Dim x as prod_class

Callsub2 (x,"nomesub", param)

È quello che hai scritto anche tu
 

LucaMs

Expert
Licensed User
Longtime User
Dim x as prod_class

Callsub2 (x,"nomesub", param)

È quello che hai scritto anche tu
Eh, e allora? (A parte che manca x.inizialize)

"Parlamm e non ce capimm?"

Ci provo un'ultima volta.

1 - crei un modulo di classe - ovvero una classe, il testo di una classe
2 - NON potrai chiamare le sue Sub (metodi), proprietà, variabili pubbliche direttamente, come potresti fare con un modulo di codice. Quest'ultimo è sempre ed ovunque disponibile ed in una "unica versione"
3 - crei una variabile-oggetto (un oggetto!), che dichiari di "tipo" (classe) di quella classe. La inizializzi ed a quel punto hai un oggetto = istanza della classe
4 - Puoi chiamare le sub (metodi) di quell'oggetto (variabile oggetto) direttamente: x.NomeSub o indirettamente: CallSub ...

Sono le basi della programmazione ad oggetti, in tutti i linguaggi.
 

Fulvio75

Well-Known Member
Licensed User
Eh, e allora? (A parte che manca x.inizialize)

"Parlamm e non ce capimm?"

Ci provo un'ultima volta.

1 - crei un modulo di classe - ovvero una classe, il testo di una classe
2 - NON potrai chiamare le sue Sub (metodi), proprietà, variabili pubbliche direttamente, come potresti fare con un modulo di codice. Quest'ultimo è sempre ed ovunque disponibile ed in una "unica versione"
3 - crei una variabile-oggetto (un oggetto!), che dichiari di "tipo" (classe) di quella classe. La inizializzi ed a quel punto hai un oggetto = istanza della classe
4 - Puoi chiamare le sub (metodi) di quell'oggetto (variabile oggetto) direttamente: x.NomeSub o indirettamente: CallSub ...

Sono le basi della programmazione ad oggetti, in tutti i linguaggi.
Esatto è quello che hai scritto, se tento di entrare in prod_class non ci entra ma in dim x as prod_class si
 
Top