Autore Topic: Creare array di componenti  (Letto 7518 volte)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Creare array di componenti
« Risposta #15 il: 10 Ottobre 2012, 23:30:01 »
Puoi anche catturare tutti gli eventi di tutti i pulsanti con un solo gestore:
Codice: [Seleziona]
...
tips[i] = New Button(Me) As "tips"
tips[i].Name = "tips" & i
...
...
Public Sub tips0_Click() 
  Select Case Last.Name
    Case "tips0"
      Print "alibaba 0" 
    Case "tips1"
      Print "alibaba 1" 
    ...
  End Select
End 

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #16 il: 10 Ottobre 2012, 23:36:15 »
Puoi anche catturare tutti gli eventi di tutti i pulsanti con un solo gestore:
E' vero. Mi permetto di correggere il codice eliminando solo un carattere rimasto lì imbambolato come un asino in mezzo ai suoni:
Codice: gambas [Seleziona]

  Public Sub tips_Click()  ' era rimasto l'asino: tips0

   ....etc...etc
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Creare array di componenti
« Risposta #17 il: 12 Ottobre 2012, 09:51:59 »
 :ok: :ok:
Grazie a tutti e due... altra nozione messa da parte

Puoi anche catturare tutti gli eventi di tutti i pulsanti con un solo gestore:
E' vero. Mi permetto di correggere il codice eliminando solo un carattere rimasto lì imbambolato come un asino in mezzo ai suoni:
Codice: gambas [Seleziona]

  Public Sub tips_Click()  ' era rimasto l'asino: tips0

   ....etc...etc


.....quanto sei pignolo  ;D

Per i moderatori:
Non posso inserire [RISOLTO] in quanto non ho cominciato io questo post.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re: Creare array di componenti
« Risposta #18 il: 14 Ottobre 2012, 12:01:23 »
Puoi anche catturare tutti gli eventi di tutti i pulsanti con un solo gestore:
Codice: [Seleziona]
...
tips[i] = New Button(Me) As "tips"
tips[i].Name = "tips" & i
...
...
Public Sub tips0_Click() 
  Select Case Last.Name
    Case "tips0"
      Print "alibaba 0" 
    Case "tips1"
      Print "alibaba 1" 
    ...
  End Select
End 

Questo prevede che tu sappia già quanti pulsanti devi gestire. E se il numero non può essere stabilito a priori?
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #19 il: 14 Ottobre 2012, 12:39:37 »
E se il numero non può essere stabilito a priori?
...ed allora è ancora più semplice:  ;D
Codice: gambas [Seleziona]

Private i As Integer
Private tips As New Object[]
Private tips_y As Integer


Public Sub Form_Open()  
    
End
    
    
Public Sub Button1_Click()   ' Ogni volta che si preme sul Button1, si crea ed aggiunge un Button nell'array
    
       tips.Add(Button)    
      tips[i] = New Button(Me) As "tips"
      
      With tips[i]    
        .X = 10    
        .Y = tips_y    
        .width = 100    
        .height = 40    
        .text = "Tasto n. " & i    
      End With    
          
      tips_y += 40    

  i = i + 1

End  
      
      
Public Sub tips_Click()  

' Ritorna la posizione nell'array del "Button" che abbiamo premuto:
    Print "alibaba " & tips.Find(Last)
  
End
« Ultima modifica: 14 Ottobre 2012, 16:03:24 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re: Creare array di componenti
« Risposta #20 il: 14 Ottobre 2012, 15:48:28 »
Mi servirà giusto una cosa simile. ;)
Grazie.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #21 il: 14 Ottobre 2012, 15:53:56 »
Questo metodo: var_array.Find(Last) ovviamente può essere applicato anche nei precedenti casi.

Esempio:
Codice: gambas [Seleziona]

Private ar As New Button[]


Public Sub Form_Open()

  Dim bt As Button
  Dim j As Byte

    For j = 0 To 9
      bt = New Button(Me) As "bt"
      ar.Add(bt)
    Next
  
  
  For j = 0 To 9
    With ar[j]
      .X = 10
      .Y = 1 + (30 * j)
      .W = 60
      .H = 30
    End With
  Next

End


Public Sub bt_Click()  

  Print "Hai premuto il tasto n. " & ar.Find(Last)
  
End
« Ultima modifica: 14 Ottobre 2012, 23:06:24 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Creare array di componenti
« Risposta #22 il: 04 Novembre 2012, 19:30:48 »
Buona sera a tutti,
riprendo ancora una volta questo post per farvi una domanda sempre inerente lo stesso, prendendo ad esempio questo codice
postato da vuott volevo creare quattro file identiche di pulsanti, ci sono riuscito ripetendo lo stesso codice per quante file di pulsanti
voglio creare modificando la proprietà .X .Ci sarebbe la possibilità di ottenere lo stesso risultato con un unico "passaggio" ?

Questo metodo: var_array.Find(Last) ovviamente può essere applicato anche nei precedenti casi.

Esempio:
Codice: gambas [Seleziona]

Private ar As New Button[]


Public Sub Form_Open()

  Dim bt As Button
  Dim j As Byte

    For j = 0 To 9
      bt = New Button(Me) As "bt"
      ar.Add(bt)
    Next
  
  
  For j = 0 To 9
    With ar[j]
      .X = 10
      .Y = 1 + (30 * j)
      .W = 60
      .H = 30
    End With
  Next

End


Public Sub bt_Click()  

  Print "Hai premuto il tasto n. " & ar.Find(Last)
  
End

Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re: Creare array di componenti
« Risposta #23 il: 04 Novembre 2012, 20:51:12 »
La sparo: doppio ciclo for-next nidificato usando il valore del ciclo più esterno e moltiplicandolo per un altro valore base così da ottenere i pulsanti perfettamente allineati?
E' questo che volevi sapere?
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Creare array di componenti
« Risposta #24 il: 04 Novembre 2012, 22:57:01 »
La sparo: doppio ciclo for-next nidificato usando il valore del ciclo più esterno e moltiplicandolo per un altro valore base così da ottenere i pulsanti perfettamente allineati?
E' questo che volevi sapere?

Potresti spiegarmelo meglio applicandolo all'esempio di vuott che ho postato precedentemente. Grazie
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #25 il: 05 Novembre 2012, 07:29:59 »
La sparo: doppio ciclo for-next nidificato usando il valore del ciclo più esterno e moltiplicandolo per un altro valore base così da ottenere i pulsanti perfettamente allineati?

Ma un asino come me è incapace di doppi salti mortali carpiati con avvitamento. Pertanto propongo nuovamente un goffo salto di pancia:  ;D
Codice: gambas [Seleziona]

Private ar As New Button[]  
  
  
Public Sub Form_Open()  
  
 Dim bt As Button  
 Dim j As Byte  
  
   For j = 0 To 39  
     bt = New Button(Me) As "bt"  
     ar.Add(bt)  
   Next  
  
  
 For j = 0 To 39  
   With ar[j]  
     .X = (10 * (j \ 10)) * 8
     .Y = (j - ((j \ 10) * 10)) * 30
     .W = 60  
     .H = 30  
   End With  
 Next  
  
End  
  
  
Public Sub bt_Click()    
  
 Print "Hai premuto il tasto n. " & ar.Find(Last)  
  
End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Creare array di componenti
« Risposta #26 il: 05 Novembre 2012, 10:37:15 »
Non è necessario tenersi in memoria un array con gli oggetti creati, perchè lo fà già la form quando li crei (e li associ come parent alla form stessa).
Per poter identificare l'oggetto hai più possibilità, dipendentemente dalla situazione in cui ti trovi.
Durante un evento, associato a tutti gli oggetti che hai creato dinamicamente, puoi capire di quale oggetto si tratta interrogando LAST.
Se, durante la creazione di ogni singolo oggetto, gli fornisci anche un nome univoco (cosa peraltro obbligatoria), puoi interrogare LAST.Name.
Per interrogare la lista degli oggetti che hai creato dinamicamente, puoi leggere la proprità Children della form (o del parent dell'oggetto dinamico), che è un array di tipo Collection indicizzato.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #27 il: 05 Novembre 2012, 11:12:01 »
Non è necessario tenersi in memoria un array con gli oggetti creati, perchè lo fà già la form quando li crei (e li associ come parent alla form stessa).
Per poter identificare l'oggetto hai più possibilità, dipendentemente dalla situazione in cui ti trovi.
Allora, adattando il mio codice all'interessante suggerimento di md9327, verrebbe così:
Codice: gambas [Seleziona]

Private bt As Button
 
 
Public Sub Form_Open() 
 
  Dim j As Byte 
 
   For j = 0 To 39 
     bt = New Button(Me) As "bt"   
   Next 
   
 For j = 0 To 39 
   With Me.Children[j]
     .X = (10 * (j \ 10)) * 8
     .Y = (j - ((j \ 10) * 10)) * 30
     .W = 60 
     .H = 30
     .Name = Str(j)
   End With 
 Next 
 
End 
 
 
Public Sub bt_Click()   
 
   Print "Hai premuto il tasto n. " & Last.Name

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Creare array di componenti
« Risposta #28 il: 05 Novembre 2012, 14:32:38 »
Ma un asino come me è incapace di doppi salti mortali carpiati con avvitamento. Pertanto propongo nuovamente un goffo salto di pancia:  ;D

Spero che durante le tue acrobazie ci sia una...rete a proteggerti... ;D
Grazie vuott, puntuale come sempre.   :D

Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #29 il: 05 Novembre 2012, 15:32:32 »
Grazie vuott, puntuale come sempre.   :D

...ma con il suggerimento di md9327 possiamo abbreviare ancora di più il codice:
Codice: gambas [Seleziona]

Private bt As Button
  
  
Public Sub Form_Open()  
  
  Dim j As Byte  
  
   For j = 0 To 39  
     bt = New Button(Me) As "bt"  
  
    With Me.Children[j]
      .X = (10 * (j \ 10)) * 8
      .Y = (j - ((j \ 10) * 10)) * 30
      .W = 60  
      .H = 30
      .Name = Str(j)
    End With  
  Next  
  
End  
  
  
Public Sub bt_Click()    
  
   Print "Hai premuto il tasto n. " & Last.Name

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »