Italian Modifica ai controlli

Rigadritta

Member
Buongiorno,
scusate, sono nuovissimo di B4a.
Conosco abbastanza bene VB6, ho sviluppato un sistema informatico. Con B4a non riesco ad accedere ai controlli, ad esempio modificare gli attributi di un controllo.
Ho definito un controllo EditText chiamato TestoMio e tento di modificarne il testo digitando TestoMio.text ="Prova", ma mi dice "Variabile 'TestoMio' non dichiarata..."
Come devo fare (o dove devo andare a studiare), per favore?
Grazie :)
 

Sagenut

Expert
Licensed User
Longtime User
Benvenuto!
La EditText la hai creata dichiarandola solo da codice o è in un Layout creato con il Designer?
Se la dichiari da codice la devi anche Inizializzare prima di potervi accedere
B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    Private edtMioTesto As EditText 'Dichiara la EditText
End Sub

Public Sub Initialize
'    B4XPages.GetManager.LogEvents = True
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
    edtMioTesto.Initialize("MioTesto") 'Inizializza la EditText e setta MioTesto come riferimento per gli Eventi
    edtMioTesto.Text = "Ciao!" 'Ora si può accedere ai metodi e alle proprietà
    Log(edtMioTesto.Text)
End Sub
Se invece è una View aggiunta dal Designer in un Layout ti basta cliccarci sopra con il tasto destro e fare la dichiarazione tramite
Generate -=> Dim xxx as B4Xview
Ormai quasi tutte le view si dichiarano come B4XView (poi capirai le differenze e come accedere anche alla versione nativa comunque).
In questo modo non devi fare l'Inizializzazione perchè viene fatta dal sistema e avrai una cosa così
B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    Private EditText1 As B4XView 'Dichiarazione aggiunta dal Designer
End Sub

Public Sub Initialize
'    B4XPages.GetManager.LogEvents = True
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
    EditText1.Text = "Ciao" 'Risulta immediatamente accessibile, dopo aver caricato il Layout
    Log(EditText1.Text)
End Sub
 
Last edited:
Upvote 0

BlueVision

Active Member
Licensed User
Longtime User
Un caloroso benvenuto anche da parte mia.

Provare quanto segue:

1.
Utilizzate il Designer e posizionate i controlli lì. Questo è preferibile farlo con uno script, in modo che il layout del programma si adatti automaticamente alle diverse dimensioni del display. Sembra più complicato di quanto non sia:

Avviare Designer, creare un layout e definire un campo EditText nella parte superiore e assegnare le proprietà a questo controllo. Nella parte inferiore del designer si deve definire la posizione di ciascun controllo nel layout:
Larghezza del display = da 0%x a 100%x
Altezza del display = da 0%y a 100%y

Esempio:
EditText1.SetTopAndBottom(1%y,10%y)
EditText1.SetLeftAndRight(40%x,60%x)

È anche possibile modificare la posizione di un controllo rispetto a un altro controllo, in modo da facilitare la regolazione automatica quando si cambia un controllo "primario".

Esempio:
EditText1.SetTopAndBottom(Button1.Top,Button1.Bottom)
EditText1.SetLeftAndRight(Button1.Left + 30%x, Button1.Right + 30%x)

2.
Definire il controllo in Sub Process_Globals nel programma stesso.

3.
Quindi assegnare dinamicamente un valore (testo, colore, ecc.) all'elemento di controllo nel programma.
 
Upvote 0

Rigadritta

Member
Benvenuto!
La EditText la hai creata dichiarandola solo da codice o è in un Layout creato con il Designer?
Se la dichiari da codice la devi anche Inizializzare prima di potervi accedere
B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    Private edtMioTesto As EditText 'Dichiara la EditText
End Sub

Public Sub Initialize
'    B4XPages.GetManager.LogEvents = True
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
    edtMioTesto.Initialize("MioTesto") 'Inizializza la EditText e setta MioTesto come riferimento per gli Eventi
    edtMioTesto.Text = "Ciao!" 'Ora si può accedere ai metodi e alle proprietà
    Log(edtMioTesto.Text)
End Sub
Se invece è una View aggiunta dal Designer in un Layout ti basta cliccarci sopra con il tasto destro e fare la dichiarazione tramite
Generate -=> Dim xxx as B4Xview
Ormai quasi tutte le view si dichiarano come B4XView (poi capirai le differenze e come accedere anche alla versione nativa comunque).
In questo modo non devi fare l'Inizializzazione perchè viene fatta dal sistema e avrai una cosa così
B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    Private EditText1 As B4XView 'Dichiarazione aggiunta dal Designer
End Sub

Public Sub Initialize
'    B4XPages.GetManager.LogEvents = True
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
    EditText1.Text = "Ciao" 'Risulta immediatamente accessibile, dopo aver caricato il Layout
    Log(EditText1.Text)
End Sub
Aaaaah! Grazie!
Quindi non basta inserire il controllo con il Designer, ma bisogna definirlo ulteriormente nella Sub Class_Globals.
Ora ci riesco.
Grazie ancora!
 
Upvote 0

Rigadritta

Member
Buongiorno,
ora il problema contrario: ho definito da codice un oggetto (un pulsante), l'ho inizializzato ed accedo ai suoi attributi, ma non riesco a vederlo.
Nella Class_Globals ho definito
Private Pulsante As Button
Nella Sub B4XPage_Created l'ho inizializzato egli ho dato gli attributi per averlo sotto mano
Pulsante.Initialize("Pulsante")
Pulsante.Top=10dip
Pulsante.Left=20dip
Pulsante.Height=50dip
Pulsante.Width=50dip
Pulsante.Text="Bottone"
Pulsante.Visible=True
Pulsante.BringToFront

Ma non si vede. Mi sa che devo fare qualcos'altro.

Un'altra cosa: ho attivato il log e mi dice che l'ha impostato regolarmente:
(Button): Left=80, Top=40, Width=200, Height=200, Text=Bottone
quindi accedo ai suoi attributi, ma le misure sono moltiplicate per 4, perché?

Grazie per l'aiuto.
 
Upvote 0

Sagenut

Expert
Licensed User
Longtime User
Buongiorno,
ora il problema contrario: ho definito da codice un oggetto (un pulsante), l'ho inizializzato ed accedo ai suoi attributi, ma non riesco a vederlo.
Nella Class_Globals ho definito
Private Pulsante As Button
Nella Sub B4XPage_Created l'ho inizializzato egli ho dato gli attributi per averlo sotto mano
Pulsante.Initialize("Pulsante")
Pulsante.Top=10dip
Pulsante.Left=20dip
Pulsante.Height=50dip
Pulsante.Width=50dip
Pulsante.Text="Bottone"
Pulsante.Visible=True
Pulsante.BringToFront

Ma non si vede. Mi sa che devo fare qualcos'altro.

Un'altra cosa: ho attivato il log e mi dice che l'ha impostato regolarmente:
(Button): Left=80, Top=40, Width=200, Height=200, Text=Bottone
quindi accedo ai suoi attributi, ma le misure sono moltiplicate per 4, perché?

Grazie per l'aiuto.
Aggiungere delle View da codice è sconsigliato nel 95% dei casi.
Però in alcuni casi può essere utile per interfacce dinamiche.
Comunque dopo averla dichiarata e dimensionata và aggiunta al container dove la vuoi vedere.
Tra poco ti mando un esempio se non arriva prima qualche altro utente.
 
Last edited:
Upvote 0

Sagenut

Expert
Licensed User
Longtime User
Questo il codice per creare e aggiungere un Button all'interfaccia
B4X:
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
    Dim MioButton As Button 'Dichiaro una View Button
    MioButton.Initialize("") 'Inizializzo la View, in questo caso non ho assegnato un nome di riferimento per gli eventi
    MioButton.Text = "Prova" 'Setto cosa deve essere scritto sul Button
    Root.AddView(MioButton, 20dip, 10dip, 100dip, 100dip)    'Aggiunge il Button all'interfaccia (sulla Root), posizione e dimensione vengono definite direttamente quì
End Sub
Nota bene che un progetto B4A può essere di due tipi:
Default (vecchio e basato sulle Activity che sono molto più brigose da gestire)
B4XPages (il nuovo sistema esclusivo di B4A che semplifica moltissime cose)
Ormai ogni nuovo progetto andrebbe fatto in B4XPages per tanti motivi.
Il mio esempio è basato su questo sistema e quindi non funzionerebbe se tu stai provando con le vecchie Activity.
Nel qual caso ti consiglio di passare subito alle B4XPages.
Girando nel forum troverai tanti vecchi esempi che ancora fanno riferimento alle Activity.
Purtroppo non si può cancellare il passato. 😅
Questo potrebbe generare un pò di confusione ma presto capirai e potrai adattare tutto.
Provenire da VB6 ti semplificherà moltissimo l'apprendimento.

Se vedrai che B4X soddisfa le tue esigenze ti consiglio (non è un obbligo) di fare una donazione per lo sviluppo.
In questo modo diventerai un Licensed User e i tuoi messaggi appariranno subito senza bisogno di attendere l'accettazione di un moderatore.
Questo velocizzerà di molto le risposte alle tue domande.
La pagina per fare l'eventuale donazione è questa:
https://www.b4x.com/b4a.html
 
Last edited:
Upvote 0

Sagenut

Expert
Licensed User
Longtime User
quindi accedo ai suoi attributi, ma le misure sono moltiplicate per 4, perché?
Perchè il LOG ti dà la sua dimensione in Pixels, mentre i DIP sono un'unità di misura che tende a dimensionare nello stesso modo le View su schermi diversi.
 
Upvote 0

Rigadritta

Member
Perfetto, funziona tutto, ma seguirò il consiglio di non definire wiev da programma.
Se userò B4X seguirò anche l'altro consiglio, perché un supporto on-line è essenziale per chi lo usa.
Grazie di tutto... per ora ;)
 
Upvote 0
Top