Oggi mi sono scontrato con una possibile anomalia di Gambas, relativamente al puntamento dei campi interni ad una delle linguette di una TabStrip.
Il problema sorge quando cerco di estrarre il contenuto degli oggetti interni alla linguetta, come TextLabel, TextArea. Infatti alla fine del caricamento di una TabStrip, punto alla prima linguetta della TabStrip che diventa perciò visibile.
La mia TabStrip si chiama Schedario e L'istruzione è:
Ora molto semplicemente devo estrarre il contenuto di tutte le TextLabel e TextArea contenute in essa:
iIdReColleg = Int(Val(NumIdPartMovv.Text))
--- bla --- bla --- bla ---
iNuProMovg = Int(Val(NuProMovimGG.Text))
$CauDescr = CausDescr.Text
dove gli oggetti.Text sono ripetuti in tutte le linguette della TabStrip Schedario.
Ebbene, tutti i campi destinatari vengono impegnati esclusivamente dai valori contenuti nell'ultima linguetta della TabStrip.
:ciao:
Vediamo un po'........
Poniamo come esempio un Form sul quale inseriamo un oggetto TabStrip formato da 3 schede. Ciascuna scheda conterrà una TextLabel ed una TextArea, alla proprietà .Text delle quali sarà assegnato un valore stringa.
Public Sub Form_Open()
Dim b As Byte
Dim tl As TextLabel
Dim ta As TextArea
' Attribuiamo 3 schede all'oggetto "TabStrip":
Schedario.Count = 3
For b = 0 To Schedario.Count - 1
' Individua la scheda sulla quale si va ad operare:
Schedario.Index = b
' Crea una "TextLabel" nella scheda attualmente considerata:
With tl = New TextLabel(Schedario)
.X = 10
.Y = 10
.W = 100
.H = 50
.Text = "tl_" & CStr(b)
End With
' Crea una "TextArea" nella scheda attualmente considerata:
With ta = New TextArea(Schedario)
.X = 10
.Y = 60
.W = 100
.H = 50
.Text = "ta_" & CStr(b)
End With
Next
' Impostiamo la scheda di indice 0 (ossia la prima) come attiva:
Schedario.Index = 0
End
Public Sub Button1_Click()
Dim ob As Object
Dim b As Byte
' Prendiamo in considerazione il numero totale delle schede presenti nella "TabStrip":
For b = 0 To Schedario.Count - 1
' Per "ogni" oggetto in qualità di "figlio" presente nella corrente scheda....
For Each ob In Schedario[b].Children
' ...andiamo a leggere il contenuto della proprietà ".Text" (...che abbiamo precedentemente assegnato come esempio):
Print ob.Text
Next
Print
Next
End
.... in visualizzazione, posso scorrere tutta la TabStrip e, soffermandomi su una linguetta qualsiasi della TabStrip, decido di estrarre i dati presenti solamente in quella linguetta .....
...ma quindi tu vuoi estrarre i dati contenuti dagli oggetti presenti soltanto in una determinata linguetta.
Allora il mio codice, sopra esposto, va modificato così:
Public Sub Form_Open()
Dim b As Byte
Dim tl As TextLabel
Dim ta As TextArea
' Attribuiamo 3 schede all'oggetto "TabStrip":
Schedario.Count = 3
For b = 0 To Schedario.Count - 1
' Individua la scheda sulla quale si va ad operare:
Schedario.Index = b
' Crea una "TextLabel" nella scheda attualmente considerata:
With tl = New TextLabel(Schedario)
.X = 10
.Y = 10
.W = 100
.H = 50
.Text = "tl_" & CStr(b)
End With
' Crea una "TextArea" nella scheda attualmente considerata:
With ta = New TextArea(Schedario)
.X = 10
.Y = 60
.W = 100
.H = 50
.Text = "ta_" & CStr(b)
End With
Next
' Impostiamo ad esempio la scheda di indice 0 (ossia la prima) come attiva:
Schedario.Index = 0
End
Public Sub Button1_Click()
Dim ob As Object
' Per "ogni" oggetto in qualità di "figlio" presente nella corrente scheda da noi scelta....
For Each ob In Schedario[Schedario.Index].Children
' ...andiamo a leggere il contenuto della proprietà ".Text" (...che abbiamo precedentemente assegnato per realizzare questo esempio):
Print ob.Text
Next
End
Anche io direi che funziona tutto bene nel mio Gambas3 3.7.1 in Ubuntu, ho fatto questa prova:
Public Sub Form_Open()
Dim i As Integer
Dim c As Control
Dim tl As TextLabel
Dim tb As TextBox
Dim ta As TextArea
For i = 1 To 3
For Each c In FMain.Controls
Select Case c.Name
Case "TextLabel" & CStr(i)
tl = c
tl.Text = "Testo della label " & CStr(i)
Case "TextBox" & CStr(i)
tb = c
tb.Text = "Testo della box " & CStr(i)
Case "TextArea" & CStr(i)
ta = c
ta.Text = "Testo della area " & CStr(i)
End Select
Next
Next
End
Public Sub Button1_Click()
Dim i As Integer
Dim c As Control
Dim tl As TextLabel
Dim tb As TextBox
Dim ta As TextArea
For i = 1 To 3
For Each c In FMain.Controls
Select Case c.Name
Case "TextLabel" & CStr(i)
tl = c
Print tl.Text
Case "TextBox" & CStr(i)
tb = c
Print tb.Text
Case "TextArea" & CStr(i)
ta = c
Print ta.Text
End Select
Next
Next
End
:ciao:
P.S. Mi ero dimenticato di allegare il form...
@ Gianluigi
Ecco come io aggiungo una nuova linguetta ad una tabstrip esistente:
iTotEle = vTbSkDett.Count / 10 - 1
Schedario.Count = iTotEle + 2
For i = 0 To iTotEle
yFlag = CByte(0) 'azzera la variabile byte "yFlag"
With Schedario 'dimensiono lo schedario con tutte le schede occorrenti compresa quella di FINE
.Index = i 'punto alla scheda corrente
.Text = "Sk n." & CStr(i + 1)
.Height = 560
.Width = 784
.Enabled = True
.Visible = True
End With
With AreaPartmovv = New Frame(Schedario) As "AreaPartmovv"
.X = 0
.Y = 5
.Width = 776
.Height = 192
.Background = iColorBeige
.Text = String(10, " ") & "----- Area PARTMOVV -----"
.Enabled = True
.Visible = True
End With
With Label1 = New Label(AreaPartmovv) As "Label1"
.X = 8
.Y = 32
.Width = 88
.Height = 24
.Border = Border.None 'Border = 0
.Alignment = Align.Center ' = 3
.Font.Name = "Liberation Serif"
.Font.Size = 11
.Font.Bold = False
.Text = "Codice Id"
.Enabled = True
.Visible = True
End With
---- bla ---- bla ---- bla----
Next
Insisto col dire che l'indirizzamento su qualsiasia linguetta di una TabStrip viene effettuato con TabStrip.Index = Integer. Pertanto dopo detta istruzione devo essere posizionato, per effetto della proprietà Index, sempre e solamente sulla linguetta indirizzata dall'istruzione precedente, cosi come quando mi sposto da una linguetta all'altra attraverso i seguenti eventi:
Public Sub SkPrec_Click()
Dim iInd As Integer
'--------------------------------
iInd = Schedario.Index
If iInd > 0 Then
iInd -= 1
Endif
Schedario.Index = iInd
End
Public Sub SkSucc_Click()
Dim iInd As Integer
'--------------------------------
iInd = Schedario.Index
If iInd < (Schedario.Count - 1) Then
iInd += 1
Endif
Schedario.Index = iInd
End
Non capisco perchè, per la visualizzazione in primo piano delle varie linguette, l'istruzione funzioni, mentre per l'estrazione dei valori contenuti al suo internio non debba funzionare.
In realtà la TabStrip funziona come un'array bidemensionale, perciò dopo essere posizionato dentro una linguetta, devo rilevare sempre i dati in essa contenuti.
:o
Non può essere altro che un BUG.
Poi Voi potete pensarla come volete.
:-\