Italian Aprire una Form dalla riga di Tableview

GuidoS

Member
Licensed User
Longtime User
Scusate ....... cliccando in una riga della tableview come faccio ad aprire un'altra form passandogli i dati di quella riga ?
GRazie !
 

LucaMs

Expert
Licensed User
Longtime User
Nell'esempio SQLite Viewer di Erel, lui lo fa indirettamente, ma non cambia molto.

Al click su una listiview abilita un tasto che a sua volta apre un form passandogli un parametro.

Evento del tasto:
B4X:
Sub btnShowTable_Action
    Dim tableFrm As TableForm
    tableFrm.Initialize
    tableFrm.Show(MainForm, lstTables.SelectedItem)
End Sub

Routine nel form:
B4X:
Public Sub Show(Parent As Form, TableName As String)
    LoadTable(TableName)
    frm.SetOwner(Parent)
    frm.Show
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Mah, non riesco a ritrovare nel sito l'esempio SQLite Viewer in B4J!
 

maxware

Well-Known Member
Licensed User
Longtime User
Ciao GuidoS
io setto una variabile globale e poi apro il nuovo form
per leggere il valore in una cella in una griglia io faccio cosi ( magari sicuramente esistono metodi + veloce )
Sub NomeGriglia_SelectedRowChanged(Index As Int, Row() As Object)
Try
'prelevo il dato
variabile_lettura=Row(1) ' ove 1 e' la cella che devi leggere
' apro il form
If variabile_lettura<>"" Then
Dim mf As NomeForm
mf.Initialize
mf.Show
End If
Catch
End Try
End Sub

Ciaooo
Mamo
 

LucaMs

Expert
Licensed User
Longtime User
Due consigli, Mamo, non ti offendere; anzi, offenditi: come sai, chi si offende poi deve pagare da bere :D.

Cerca sempre di evitare il più possibile di utilizzare variabili globali. Il codice diventa meno leggibile e "manutenibile" (che parolaccia), un po' come con i Goto e Gosub.

Il secondo lo conosci bene, ma forse sei più pigro di me :p: utilizzare i tag Code
 

LucaMs

Expert
Licensed User
Longtime User
Si, si, va beh... dì la verità: è che non vuoi offrire da bere! hehehe

Anch'io, all'inizio, sono stato costretto ad utilizzare variabili globali, perché non è disponibile un ActivityForResult come in Java-Android (poi, col tempo, ho scoperto che posso utilizzare le CallSubDelayed, anche se non sono l'ideale per questo scopo).
Lo scopo era quello di avere un'Activity che gestisse ad esempio un Cliente e restituisse all'Activity chiamante un oggetto di tipo Cliente. Invece ho messo l'oggetto Cliente come pubblico nell'Activity Cliente.

Non è sbagliato, ovviamente, ma la "teorica perfezione" sarebbe che ogni blocco (che sia una routine, una classe, una Activity o altro) sia il più possibile indipendente. Per cui, invece di utilizzare una variabile globale, ad esempio l'oggetto Cliente, dovrei passare Cliente come parametro ad altri blocchi (sempre routine, classi, etc.)
 

GuidoS

Member
Licensed User
Longtime User
Ragazzi buona sera !!!
Se c'è da bere allora vengo pure io .........

a parte gli scherzi .... Mamo grazie avevo visto quella soluzione e avevo pensato addirittura di dichiarare , come globale , direttamente la Row() as object così posso passare tutte le celle della riga interessata. Però ancora non l'ho provata.

Ma cercavo qualcos'altro ..... a me serve caricare tutti i campi di un record selezionato dalla tableview, visualizzarli in una form singola ed eventualmente modificarli e/o cancellarli, tipo le maschere singolo record che si possono creare in Ms Access.

LucaMs Grazie anche a te ma purtroppo quello che hai detto a Mamo non l'ho capito molto.
Che cosa è una "CallSubDelayed" ??? :confused:

Ciao
Guido
 

LucaMs

Expert
Licensed User
Longtime User
La CallSubDelayed è una istruzione per chiamare e attivare un'activity dall'interno di un'altra.
Esiste anche la versione CallSubDelayed2 che richiede come parametri il componente (activity) da chiamare, il nome della sub ed un oggetto a piacimento. Questo oggetto potrebbe essere quello da usare al posto di quello globale.

Per esempio, da un "form" con un elenco/tabella dati l'utente seleziona una riga e tu richiami un "form dettagli" utilizzando la CallSubDelayed2 passandogli nomeFormDettagli, NomeSubRicevente, RigaDati (che potrebbe essere solo l'ID selezionato, una Row, un type o meglio ancora un classe-oggetto)
 

maxware

Well-Known Member
Licensed User
Longtime User
Ciao Guidos
Io faccio cosi..esempio archivio articoli
nel tuo esempio dichiaro una variabile globale es. codice articolo
carichi tutti i record , o quelli che voglio , degli articoli nella griglia
quando seleziono una row setto la variabile con il valore della cella ( ovviamente il codice )
poi richiamo la form del dettaglio articolo e avendo impostato la variabile richiamo il singolo record
ciaooo
Mamo
 

LucaMs

Expert
Licensed User
Longtime User
Infatti è uguale. Potresti passare il codice tramie la CallSubDelayed2 (ovviamente, non è che ora ti metti a modificare tutta la tua app per questo: anch'io ho lasciato le variabili globali, ma nelle prossime app farò in questo modo)
 

GuidoS

Member
Licensed User
Longtime User
Buongiono a tutti !

Scusate se in questi giorni non vi ho risposto ma è stata una settimana d'inferno.

Mamo la tua soluzione è quella che avevo già adottato e va benissimo ma vorrei evitare di aprire e chiudere in continuazione i recordset. Per questo chiedevo se ci fosse un sistema come quello di ms access. Ma purtroppo mi devo accontentare.

Ora studierò anche la CallSubDelayed e la CallSubDelayed2 , vediamo se ho dei vantaggi , ma a naso credo che i recordset si dovranno aprire e chiudere in continuazione come la versione scelta da Mamo da Me e sino ad oggi anche da LucaMs nei vecchi progetti.

LucaMs se ho capito male fammi sapere, le CallSubDelayed non mi evitano le multi aperture dei recordset , Giusto ?
 

LucaMs

Expert
Licensed User
Longtime User
Beh, il cursore devi gestirlo tu. La CallSubDelayed2 non ha niente di speciale, ti consente di chiamare dall'interno di un'activity una routine di un'altra activity passandogli un oggetto; se vuoi, tu puoi passargli il cursore aperto!
 
Top