Italian Puntatore a funzione

Luciano Veneziano

Active Member
Licensed User
Longtime User
Ti ringrazio di avermi risposto

mi serve per poter fare una query, che è una funzione asincrona che però uso per diverse tabelle

Sub httpPost(path As String, SQL As String,id As String)
Dim j As HttpJob
j.Initialize("", Me)
j.PostString(path,SQL)
Wait For (j) JobDone(j As HttpJob)
If j.Success Then
refresh(id,j.GetString) 'da mettere qui
End If
j.Release
End Sub

Sub refresh(id As String,res As String)
Select(id)
Case "fql": createFreqsList(res)
Case "usr": createDeviceList(res)
Case Else Log("errore:"&id)
End Select
End Sub


Sostituire refresh(id,j.GetString) con un puntatore a funzione, perche la uso per aggionare diverse tabelle.
in modo da chiamare direttamente la sub associata per aggiornare la parte visuale.
ora uso una stringa "id", ma è macchinosa come procedura.
 

LucaMs

Expert
Licensed User
Longtime User
Potresti creare una struttura dati (Array, List o Map), riempirla con i nomi delle routine da chiamare ed usare CallSub2.

Ad esempio, se ancora usi ID, numerico intero:

B4X:
Dim lstMethods As List
lstMethods.AddAll(Array As String("createFreqsList", "createDeviceList", "other"))
'refresh(id,j.GetString) 'da mettere qui
CallSub2(Page, lstMethods.Get(id), j.GetString)

Come Component ho messo Page, se ad esempio fosse una pagina B4XPages. Volendo, la List potrebbe contenere variabili custom type, in cui metterai sia il Component che il nome della routine da lanciare.
B4X:
Type tMethod(Component As Object, Name As String)


Public Sub CreatetMethod (Component As Object, Name As String) As tMethod
    Dim t1 As tMethod
    t1.Initialize
    t1.Component = Component
    t1.Name = Name
    Return t1
End Sub

Una volta riempita la List con oggetti di tipo tMethods:
B4X:
Dim Method As tMethod = lstMethods.Get(id)
CallSub2(Method.Component, Method.Name, j.GetString)
 
Last edited:
Top