Italian [RISOLTO] PrefDialog: è possibile far variare i campi precompilati scegliendo una delle opzioni dentro il PrefDialog?

Elric

Well-Known Member
Licensed User
Ciao!

Provo a spiegarmi meglio.

Subroutine per creare un nuovo utente, Mario Rossi, che appartiene alla Famiglia Rossi.

La Famiglia Rossi abita a Parco della Vittoria n. 1, Milano.

Per creare un nuovo utente, utilizzo un PrefDialog, con "Nome utente" [testo], "Famiglia" [lista di opzioni], Via [testo], Numero Civico [testo], Città [testo].

Mi chiedo se, una volta selezionata la "Famiglia" dalla lista di opzioni, è possibile far compilare automaticamente all'interno del PrefDialog aperto i campi "Via", "Numero Civico" e "Città" ma lasciandoli comunque editabili, qualora Mario Rossi, sempre appartenente alla Famiglia Rossi, sia andato a vivere in Vicolo Corto n. 6, Venezia.
 

LucaMs

Expert
Licensed User
Longtime User
  1. Devi usare una dialog per quello scopo? Perché non una B4XPage (o Activity, se non usi le B4XPage)?
  2. Perché PrefDialog anziché una B4XDialog, con un tuo template personalizzato?
  3. In ogni caso, se usi una B4XComboBox (una delle XUI Views) per selezionare una "Famiglia", dovresti usare il suo evento SelectedIndexChanged, dall'interno del quale "compilare" il resto del "form".
 
Last edited:

Elric

Well-Known Member
Licensed User
  1. (...) Perché non una B4XPage (...)?
  2. (...)
Sto provando da tre ore.

Vorrei evitare di creare una pagina per ogni pagina che contiene una tabella e fare quindi una cosa più versatile, dove la B4XPage di servizio si adatti a seconda della pagina che la chiami. Per intenderci: una pagina che contiene tutti i dati delle diverse Famiglie e una pagina per i singoli individui si servono della medesima pagina di servizio per inserire e modificare i dati.

Ho provato a creare delle liste nella pagina di servizio ma anche se le modifico nella pagina principale non tengono i valori nella pagina di servizio...
 

udg

Expert
Licensed User
Longtime User
Probabilmente non ho compreso bene ciò che desideri ottenere, ma un semplice form ed una dialog dovrebbero essere sufficienti. Mi spiego meglio.
Hai un form (es. su una pagina B4XPages) con tutti i campi che ti occorrono per inserire un nuovo individuo. Il campo Famiglia sarà una combobox/spinner oppure una xCLV.
1. Inserisci il nominativo
2. Selezioni dalla combobox/clv la famiglia e di conseguenza pre-compili gli altri campi
3. eventualmente modifichi gli altri campi
4. premi il tasto SALVA e registri nel DB (presumo)

Che fare se il nominativo è il primo della sua famiglia? Accanto alla combobox metti un'icona/tasto/label che produce l'apertura di una dialog per l'aggiunta di una famiglia alla lista della combobox.
Nella dialog avrai i campi necessari a definire una nuova famiglia (e il suo indirizzo) ed un tasto SALVA. Immessi i dati della nuova famiglia (che registrerai anche sul DB) aggiorni la lista della combobox/clv così che, tornato al form, ora potrai selezionare la nuova famiglia dalla lista.
Puoi anche aggiungere un ulteriore tasto per la modifica dei dati di una famiglia (quella selezionata, ovviamente); utile in caso di errori di digitazione, ad esempio.

ps: ovviamente se l'elenco delle famiglie è molto corposo allora sarà utile prevedere un meccanismo di search abbinato alla combo/clv o anche considerare l'utilizzo di una tabella per le famiglie con i suoi controlli di navigazione e ricerca.

pps: stavo per scrivere che tutto sommato la mia risposta era abbastanza OT, ma poi ho pensato che la dialog-famiglia possa essere una PrefDialog.. :)
 

Elric

Well-Known Member
Licensed User
Grazie udg.

Ho una PageFamiglia (con una B4XTable) e una PagePersona (con una B4XTable).

Il tuo suggerimento è usare il B4XDialog, se ho capito bene. Non avendolo ben presente e tutto da studiare avevo pensato di creare una PageInserisciDati: un'unica pagina aggiuntiva che possa servire ad inserire i dati sia nella pagina FamigliaPage che nella pagina PersonaPage. Una sola pagina a servizio delle altre, in modo da non dover avere due pagine di inserimento dati e per evitare che, se poi creo anche altre 5 pagine di tabelle mi ritrovo a dover creare altre 5 pagine di inserimento dati.

Pensavo di creare i controlli di inserimento a run-time o comunque (perché magari una soluzione più furba) servirmi di una B4XTable a due colonne con in campi da editare in stile InlineEdit.

Per realizzare questo, ho creato delle liste (lstControlsType e lstControlHeaders; potrei fare delle map ma al momento mi trovo meglio con le liste... 😅 ) nella PageInserisciDati. In questo modo (secondo me) qualunque pagina può svuotare e popolare le liste che verranno poi utilizzate nella PageInserisciDati

Quindi:
  • nella PageInserisciDati dichiaro le due list come public
B4X:
Public lstControlsType as List
lstControlsHeader as List
  • le inizializzo nella sub "Initialize" della PageInserisciDati
B4X:
Public Sub Initialize As Object
    lstControlsType.Initialize
    lstControlsHeader.Initialize
    Return Me
End Sub
  • nelle PageFamiglia e nella PagePersona, verifico se le list sono inizializzate e se non lo sono richiamo la sub Initialize e quindi popolo le liste
B4X:
Sub Class_Globals
    (...)
    Private pInsDat As PageInserisciDati
    (...)
End Sub
(...)
Sub AggiungiDato
    If pInsDat.lstControlsType.IsInitialized = False Then pInserDat.Initialize
  
    ' 0 Text; 1 Combobox; 2; Switch
    pInsDat.lstControlsType.Add(Array(0, 1, 0, 0, 0, 0, 0))
    pInsDat.lstControlsHeader.Add(Array(strName, strFamily, strStreet, strStreetNumber, strCity, strCountry, strUSState))
    B4XPages.ShowPage("PageInserisciDati")
End Sub
  • nella PageInserisciDati creo i controlli
ma mi ritrovo la lstControlsType e la lstControlsHeader completamente vuote.
🤔
 

udg

Expert
Licensed User
Longtime User
Nelle PageFamiglia/PagePersona devi far riferimento all'istanza esistente (presumo creata in B4xMain) di PageInserisciDati
B4X:
pInsDat = B4XPages.GetPage("PageInserDati") 'non so come l'hai denominata
pInsData.lstControlsType.Add(....)
 
Top