Differenze tra le versioni di "Individuare una Classe di oggetti fra molti"

Da Gambas-it.org - Wikipedia.
Riga 10: Riga 10:
 
   Dim obj As Object
 
   Dim obj As Object
 
    
 
    
  <FONT color=#006400>' ''Per ogni oggetto posto nel Form...'</font>
+
  <FONT color=gray>' ''Per ogni oggetto posto nel Form...'</font>
 
     For Each obj In FMain.Children
 
     For Each obj In FMain.Children
  <FONT color=#006400>' ''(ma potremmo anche scrivere: '''For Each obj In FMain.Controls''')''</font>
+
  <FONT color=gray>' ''(ma potremmo anche scrivere: '''For Each obj In FMain.Controls''')''</font>
 
   
 
   
  <FONT color=#006400>' ''...effettuiamo una verifica: se il tipo di oggetto è un "Button"...'</font>
+
  <FONT color=gray>' ''...effettuiamo una verifica: se il tipo di oggetto è un "Button"...''</font>
 
       If Object.Type(obj) = "Button" Then
 
       If Object.Type(obj) = "Button" Then
  <FONT color=#006400>' ''...allora ne vediamo in console il nome della Classe di appartenenza,:'</font>
+
  <FONT color=gray>' ''Si potrebbe anche usare:''
 +
' '''If Object.Class(obj).Name = "Button" Then'''</font>
 +
 
 +
<FONT color=gray>' ''...allora ne vediamo in console il nome della Classe di appartenenza,:'</font>
 
         Print obj.Name
 
         Print obj.Name
  <FONT color=#006400>' ''e, volendo, gli modifichiamo una proprietà:'</font>
+
  <FONT color=gray>' ''e, volendo, gli modifichiamo una proprietà:'</font>
 
         obj.Text = "tasto"
 
         obj.Text = "tasto"
 
       Endif
 
       Endif

Versione delle 16:46, 9 nov 2016

Il caso è quello in cui, avendo in un qualsiasi contenitore una molteplicità di oggetti facenti parte di due o più Classi, si intende individuare soltanto gli oggetti appartenenti ad una specifica Classe, ed eventualmente modificarne una o più proprietà.


Di seguito esporremo alcuni diversi casi con i relativi esempi. Poniamo l'esempio specifico di avere su un Form sei oggetti, appartenenti in numero eguale a tre Classi: due Button, due TextArea e due RadioButton. In ciascun esempio vogliamo individuare gli oggetti appartenenti alla sola Classe Button, e modificarne la proprietà Text.


Oggetti posti sul Form

Public Sub Button1_Click()

 Dim obj As Object
 
' Per ogni oggetto posto nel Form...'
   For Each obj In FMain.Children
' (ma potremmo anche scrivere: For Each obj In FMain.Controls)

' ...effettuiamo una verifica: se il tipo di oggetto è un "Button"...
     If Object.Type(obj) = "Button" Then
' Si potrebbe anche usare:
' If Object.Class(obj).Name = "Button" Then
  
' ...allora ne vediamo in console il nome della Classe di appartenenza,:'
       Print obj.Name
' e, volendo, gli modifichiamo una proprietà:'
       obj.Text = "tasto"
     Endif

   Next

End


Oggetti posti all'interno di un contenitore

Qualora gli oggetti siano posti all'interno di un Contenitore, ad esempio un Panel, allora non potrà essere utilizzata anche la proprietà Controls (proprietà non posseduta dai Contenitori), ma si utilizzerà la sola proprietà Children.

Public Sub Button1_Click()

 Dim obj As Object
 
' Per ogni oggetto posto nel Form...'
   For Each obj In Panel1.Children

' ...effettuiamo una verifica: se il tipo di oggetto è un "Button"...'
     If Object.Type(obj) = "Button" Then
' ...allora ne vediamo in console il nome della Classe di appartenenza,:'
       Print obj.Name
' e, volendo, gli modifichiamo una proprietà:'
       obj.Text = "tasto"
     Endif

   Next

End


Oggetti posti sia sul Form che in un Contenitore

Qualora vi siano oggetti posti sia direttamente sul Form che nel Contenitore, l'uso della proprietà FMain.Controls agirà su tutti gli oggetti presenti: sia su quelli figli diretti del Form che su quelli figli del Contenitore.


Oggetti posti in più Contenitori nidificati

Se gli oggetti sono posti in vari Contenitori nidificati l'uno nell'altro, il codice, sopra esposto, dovrà essere modificato come segue |1|, altrimenti non saranno tutti individuati:

Public Sub Button1.Click()

  Dim obj As Object

' Per ogni oggetto posto nel Form...:
    For Each obj In FMain.Children  
' (ma potremmo anche scrivere: For Each obj In FMain.Controls)
 
' ...effettuiamo una verifica: se il tipo di oggetto è un "Button"... 
   If Object.Type(obj) = "Button" Then  
' ...allora ne vediamo in console il nome della Classe di appartenenza,:
     Print obj.Name  
' e, volendo, gli modifichiamo una proprietà:
     obj.Text = "tasto"  
       
' Controllo che l'oggetto sia un "contenitore":
     Else If (Object.Class(obj).Parent.Name = "Container") Then  
' e nel caso verifico i suoi "children":
        ListChildren(obj)  
   Endif  
 Next  

End
 

Public Sub ListChildren(ob As Object)

    For Each ob In ob.Children  
      If (Object.Type(ob) = "Button") Then  
        Print ob.Name  
        ob.Text = "tasto"  
      Else If (Object.Class(ob).Parent.Name = "Container") Then  
        ListChildren(ob)  
      Endif  
    Next  

End


Note

[1] Il seguente codice è stato segnalato e suggerito dall'utente sotema del Forum di Gambas-it.org.