Ciao a tutti,
avrei bisogno di un aiuto.
E' possibile eseguire un ciclo per avere tutti i Control che sono dentro un container (e dentro i sub-container).
Ho dei controlli "TextBox" e "TextArea" che vorrei ripulire ed ho pensato di far eseguire un ciclo del Panel che voglio ripulire anziché scrivere il codice riga per riga.
Milio mi dette un ottimo suggerimento...
Public Sub pulisci(frm As Form, Optional salta As String)
Dim txt As Control
For Each txt In frm.Controls
If (Object.Class(txt).Name) = "TextBox" Or (Object.Class(txt).Name) = "TextArea" Or (Object.Class(txt).Name) = "TextPro" Then
Object.SetProperty(txt, "Text", Null)
Endif
Next
End
Questo ciclo mi restituisce tutti i controlli che sono nel Form...
Però mi sto accorgendo che se fosse possibile a me interesserebbe pulire solo i Controlli di un panel (e dei relativi panel_discendenti).
Ho provato ad inserire la condizionale...
If txt.Parent.Name = nome_del_panel_che_m'interessa Then...
...però così mi esclude tutti i controlli dei sotto_panel annidati. Io invece vorrei il ciclo sul panel_genitore e su tutti i suoi panel_discendenti.
Potreste aiutarmi? :)
Per il momento sto usando questa Sub...
Public Sub pulisci(contenitore As Container, Optional salta As String)
Dim txt As Control
For Each txt In contenitore.Children
Select Case Object.Class(txt).Name
Case "TextBox", "TextPro", "TextArea", "SearchBox", "SearchPro"
Print "Puliti: " & txt.Name & " --> " & txt.Parent.Name
If txt.name <> salta Then Object.SetProperty(txt, "Text", Null)
End Select
Next
End
Come vi dicevo il problema è che quando necessito di ripulire i campi di testo devo richiamarla per ogni container; ma poiché i container_figli sono esclusi... devo chiamarla anche per ogni container_figlio...
Attendo i vostri suggerimenti... :)
PS. il comando PRINT mi ha aiutato a capire fossero i Controls ed i relativi Containers interessati nel ciclo...
E' una soluzione ma non mi piace. Se chiamo l'ultimo ed il penultimo xpanel, ma poi mi trovassi nella situazione di voler pulire solo l'ultimo... dovrei rinominare i panel...
La mia domanda era anche didattica per capire questa cosa.
Ho sempre saputo che il Form può essere inteso come un contenitore grosso... che contiene tutti gli oggetti che vi sono dentro. Se uso la pulizia sul Form pulisce qualsiasi cosa (compresi tutti i container in esso annidato); mentre se provo sui container questo non è possibile (cioè non è possibile risalire a tutta la discendenza). Perché?
Questo era il codice di pulizia delle textbox dell'intero form:
Public Sub pulizia(Optional salta As String)
Dim txt As Control
For Each txt In Me.Controls
If (Object.Class(txt).Name) = "TextBox" Or (Object.Class(txt).Name) = "TextArea" Then
If txt.name <> salta Then Object.SetProperty(txt, "Text", Null)
Endif
Next
End
La mia curiosità è di sapere perché la classe "container" è priva della proprietà .Controls... (quella che nell'esempio fa fare il ciclo for each)
Il discorso è duplice:
1) nel mio gestionale ho diverse Forms con tanti Controls per l'input di dati, di testo. Quindi anziché fare la solita lista di pulizia di ogni controllo, uno per uno, volevo risolvere la questione creando una routine che "ripulisse", genericamente, solo quelli dentro i Containers che interessano a me.
2) a scopo didattico, per capire e prendere dimestichezza con il codice di programmazione.
Ho notato che il tempo di pulizia è decisamente superiore rispetto alla classica lista di .Text = "", perché con questo mio approccio l'eseguibile deve fare, oltre all'operazione di pulizia, anche quella di ciclo e ricerca dei Controls che m'interessano... però al momento mi soddisfa molto. Con queste 10 righe di codice, messe in un modulo pubblico, pulisco tutte le .Text del mio progetto che m'interessano.
Non ho capito bene il discorso della classe dinamica e dell'array, tieni conto che ho ricominciato a programmare da poco più di un mese (dopo diversi anni, ma anche allora molto sommariamente).
$Array[0]= TextBox1.Name
$Array[1]= Panel1.Name
$Array[2]= TextBox2.Name
Scusa se rispondo solo adesso, ma per me questo é un periodo nel quale dedico il mio tempo ad altro e non posso concentarmi molto su Gambas. Infatti soffre pure il mio programma che é messo letteralmente in deposito. A te sembra difficile lo studio dell'utilizzo di una classe esterna a cui passare i parametri necessari per la pulizia degli oggetti che ti interessano, ma mi pare che l'affannosa ricerca di di una soluzione attraverso la realizzazione di una funzione universale che agisca come vuoi tu sia ancora più complessa del metodo che ti ho suggerito più sopra.
Provo a farti un esempio veloce su quello che voglio dire:
PUBLIC SUB Qualsiasi()
DIM $Array AS NEW String[]
DIM Classe1 AS ClasseDinamica
-------------- bla bla bla -------------
-------------- bla bla bla -------------
$Array[0]= TextBox1.Name
$Array[1]= TextBox2.Name 'oggetto figlio di Panel1
$Array[2]= ComboBox1.Name 'oggetto figlio di Panel1
Classe1 = NEW ClasseDinamica($Array)
-------------- bla bla bla -------------
-------------- bla bla bla -------------
END
PUBLIC SUB _new($ParametriArray AS NEW String[]) 'Metodo _new della "ClasseDinamica"
DIM i AS Integer
DIM Conta AS Integer
Conta = $ParametriArray.Count - 1
For i = 0 to Conta
$ParametriArray.Text=""
Next
END
Ho buttato giù la mia idea in codice. Non so se funziona perché non l'ho provata. Puoi farlo tu se ti pare interessante.
Comunque vada, buon lavoro. :D
Ciao