Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: - 11 Giugno 2008, 21:16:18

Titolo: Creare array di componenti
Inserito da: - 11 Giugno 2008, 21:16:18
Salve a tutti ed essendo questo il mio primo post nel forum, ben trovati!

Mi trovo ad avere la necessita' di creare un array di componenti (label) in modo da poter assegnar loro dei valori che si trovano in un array mediante un ciclo for del tipo

for i = 1 to n
  text1 = array
next

a suo tempo, quando lavoravo come sviluppatore VB (dagli albori di vb4 a meta' della vita di vb5, quindi circa 10 anni fa) mi sembra di ricordare che si potesse fare, con VB, appunto.

Qualcuno sa darmi una dritta su come comportarmi in merito con gambas, prodotto a cui mi sono avvicinato soltanto un paio di giorni fa in una nottata insonne ma che credo non lascero' presto?

Grazie a tutti per l'attenzione riguardo il problema ed il consulto psicologico sulla nostalgia di quand'ero adolescente. :o)

Saluti.


Andrea
Titolo: Re: Creare array di componenti
Inserito da: - 12 Giugno 2008, 00:00:14
Benvenuto .....

Penso che la dritta migliore ti si possa dare sia quella di metterti a spulciare la guida in linea di Gambas .....

Poi nel momento in cui hai un dubbio specifico magari fai il post e qualcuno probabilmente ti risponderà ( sicuramente non io, io chiedo solo  :lol: , purtroppo ) .... Nonostante dalla banalità delle domande che pongo non sembri, io faccio così ....
Titolo: Re: Creare array di componenti
Inserito da: giulio - 12 Giugno 2008, 13:00:24
Allego un piccolo esempio, commentato.

Il metodo ME.Children ti restituisce già un
array degli oggetti della Form creati con l'IDE.
Poi usando Object.Type puoi scegliere quali modificare.
Se guardi il codice ti sarà tutto chiaro.

Siccome non ho capito se intendevi sapere
come si crea un array di oggetti al volo,
nella seconda parte dell'esempio
viene creato un array di 4 label.

Insomma vedi tu cosa ti serve :-)
Titolo: Re: Creare array di componenti
Inserito da: - 12 Giugno 2008, 13:52:45
Ciao, grazie mille per l'esempio, molto comprensibile e perfettamente attinente a quello che mi serviva.
Ho pero' un problema: non riesco a vedere le etichette che vengono create alla fine, nonostante guardando le loro proprieta' con un breakpoint risultino essere visibili e con delle coordinate ragionevoli per stare all'interno del monitor.
Tu le riesci a vedere?

Grazie ancora.

Andrea
Titolo: Re: Creare array di componenti
Inserito da: - 12 Giugno 2008, 14:32:09
Trovato.
Non sono state impostate le proprieta' di altezza e larghezza Height e Width e quindi non si vede nulla.

Grazie 10.000!


Andrea
Titolo: Re: Creare array di componenti
Inserito da: - 12 Giugno 2008, 15:02:38
Ultimo post sull'argomento, giuro! :o)

Se qualcuno dopo di me fosse interessato, la soluzione di giulio non permette di creare dinamicamente quante etichette si desidera, la mia modifica per poterlo fare e' la seguente:

Codice: [Seleziona]

PUBLIC SUB Form_Open()
  DIM tips AS NEW Object[]
  DIM i, i_tips, tips_y AS Integer
  i_tips = 5
 
  FOR i = 0 TO i_tips
    tips.Add(Label, i)
    tips[i] = NEW Label(ME)
   
    WITH tips[i]
      .X = 10
      .Y = tips_y
      .width = 100
      .height = 20
      .text = "Abc " & i
    END WITH
   
    tips_y += 30
  NEXT
END


dove, ovviamente i_tips puo' essere impostato a piacere in fase di esecuzione del programma in modo da ottenere etichette a piacere.

Saluti a tutti e tante grazie (a giulio in particolare per avermi indirizzato verso la soluzione!).


Andrea
Titolo: Re: Creare array di componenti
Inserito da: vuott - 12 Luglio 2011, 00:08:11
...allora vorrei riprendere quest'argomento per domandare come impostare la cosa se io non volessi creare componenti mediante un ciclo FOR, con il quale sono creati tutti (...diciamo) di colpo, bensì uno solo ogni qual volta io premo un tasto; ma sempre mediante l'uso di un array che mi consenta di distinguerli per numero ai fini di una successiva gestione.

Titolo: Re: Creare array di componenti
Inserito da: vuott - 12 Luglio 2011, 20:42:03
...bensì uno solo ogni qual volta io premo un tasto; ma sempre mediante l'uso di un array che mi consenta di distinguerli per numero ai fini di una successiva gestione.

Allora, siccome sul forum vige la norma "Sperimenta. Trova la soluzione; e solo poi domanda come si trova la soluzione già trovata"  :evil: .....nell'attesa di una risposta, ho dovuto cercare di rispondermi da me  :rolleyes: .

Ho dunque ottenuto l'effetto che desideravo, ma senza array. Ho fatto così:

Codice: gambas [Seleziona]
' Gambas class file

s As Integer
i As Integer

Public Sub Button1_Click()   ' Crea UNA SOLA Label ogni qualvolta viene premuto Button1

  Dim lab As Label
  
  i = i + 1

' crea la Label e aggiunge al suo nome anche il numero contenuto nella variabile “ i “.
 lab = New Label(Me) As "lab" & i

  With lab
   .X = 20
   .Y = s
    .Width = 50
    .Height = 20
       .tooltip = "Sono la Label " & i

    ' imposta il testo all'interno della Label.
      .Text = "Label" & i

  End With

 s = s + 30

     Object.Attach(lab, Me, "Evento")       ' associa l'oggetto Label alla definizione "Evento"

End


Public Sub Evento_MouseDown()          ' cliccando su una Label, fra quelle create, essa viene eliminata.

  Dim Obj As Object = Last
  Dim a As String
  
    a = Obj.name

    Obj.delete                    ' elimina la Label riportata da Last

' Scrive quale Label è stata eliminata fra quelle precedentemente create.
  ' La variabile " a " indica il nome riportato da Obj.name.
    Print "Eliminata " & a
                                              
End
Titolo: Re: Creare array di componenti
Inserito da: md9327 - 13 Luglio 2011, 10:19:20
E' tutto corretto, solo che il presupposto è fiorviante...

Nel tuo esempio, l'array non è necessario in quanto è l'assegnazione stessa che fà in modo che la Form gestisca l'oggetto Label. La sintassi "= NEW Label(ME)" istruisce l'interprete che l'oggetto deve essere creato e assegnato alla Form (parent). La form a sua volta lo inserisce nel suo contenitore Children, per cui mantiene il puntamento all'oggetto e quindi lo può gestire successivamente.

La tua richiesta iniziale è relativa alla possibilità di mantenere una lista di oggetti ( o quant'altro) in modo da poterli gestire in modo dinamico da programma. In questo caso la cosa avviene allo stesso della Form, solo che il contenitore degli oggetti lo devi fornire tu stesso (ad es. un Variant[] o un Object[]).

e due possibilità comunque non si escludono a vicenda in quanto, per esigenze di programma, potresti avere la necessità di mantenerti comunque una lista di oggetti, non influenzata dalla gestione della Form, e quindi mantenerti i riferimenti di ogni singolo oggetto a prescindere da quello che fà la Form.

Ti ricordo che, per come è strutturato Gambas, ogni oggetto rimane valido fino a che esiste un puntatore valido attivo. La cancellazione o l'eliminazione di tutti i puntatori che puntano allo stesso oggetto, causa l'eliminazione dell'oggetto stesso.
Titolo: Re: Creare array di componenti
Inserito da: vuott - 13 Luglio 2011, 13:25:54
... il contenitore degli oggetti lo devi fornire tu stesso (ad es. un Variant[] o un Object[]).


Oh... e dunque la parte forndamentale, appunto, come la scriveresti ?
Titolo: Re: Creare array di componenti
Inserito da: md9327 - 13 Luglio 2011, 14:14:11
Quanto hai scritto riguardo a questa cosa è corretto, per cui non ho nulla da dirti.
Se vogliamo parlare di altre alternative indipendenti, la cosa cambia ovviamente.

Se il tuo obiettivo era quello di gestire le cose all'interno di una Form, forse possiamo discutere sulle varie logiche che si potrebbero implementare (cosa valida in tutti gli aspetti dell'informatica), ma quanto hai scritto è giusto, per cui tutto ok.
Titolo: Re: Creare array di componenti
Inserito da: milio - 13 Luglio 2011, 21:34:58
Da aggiungere che potesti gestire un'array di Label anche nel questo modo:

Dim Lblarray As Label[]

Titolo: Re: Creare array di componenti
Inserito da: vuott - 18 Luglio 2011, 16:39:55
Sono tornato sulla questione da me posta.
Ricapitolando: la mia intenzione è di ottenere più oggetti del medesimo tipo, però creandone uno solo ogni qual volta io premo un tasto, e sempre mediante l'uso a livello di codice di un array che mi consenta di distinguerli per numero ai fini di una successiva gestione.

Nella mia risposta del 12 Luglio 2011, 00:08:11, ho inserito un listato, con il quale ho ottenuto un risultato finale funzionante in modo eguale al mio scopo ultimo (la gestione degli oggetti creati), però in questo caso senza uso di array. Avevo escogitato lo stratagemma di un falso array, legato al nome di ogni oggetto creato; nome che veniva così distinto da quelli attribuiti agli altri oggetti del medesimo tipo creati. Infatti, successivamente potevo eliminare l'oggetto operando sul suo nome.

Ora - mi sembra - di aver trovato la soluzione (che mi pare più semplice di quanto non avessi previsto) di creare più oggetti del medesimo tipo, e sempre uno solo ad ogni click su tasto, ma con l'uso di array (esperimento compiuto in Gambas 3):


Codice: gambas [Seleziona]
 ' Gambas class file

Private Lblarray[5] As Label    ' pongo il limite di prova massimo a 5 oggetti ("array di 5 elementi")
Private a As Integer
Private b As Integer


Public Sub Button1_Click()   ' Crea UNA SOLA Label ogni qualvolta viene premuto Button1
  Dim c, d As Integer
    
  b += 50
  
' crea la Label e la distingue dalle altre eventuali con un numero contenuto nella variabile “ a “,
' (ma questa volta non in aggiunta alla sua denominazione).
 Lblarray[a] = New Label(Me)
    
 Lblarray[a].Border = Border.Raised   ' definisco le caratteristiche della label
  Lblarray[a].W = 100                     ' in modo tale da posizionare le varie Label ottenute
  Lblarray[a].H = 20                       ' in luoghi diversi sul Form
   Lblarray[a].X = b                        '
   Lblarray[a].Y = b                        '

 Print Lblarray[a].ID    ' per prova trovo l'ID della Label appena creata e distinta con la variabile "a" dell'array.
  
   ' Per ulteriore prova intendo distruggere una Label precedentemente creata
   ' indicandone (questa è la prova effettiva) il numero assegnatole con la variabile " a ".
If a = 4 Then
  d = InputBox("Elimina una label (il numero deve essere compreso fra 0 e 4)")
   Print Lblarray[d].ID     ' ri-ottengo per riprova l'Id della Label scelta in InputBox
   Lblarray[d].delete       ' elimina la Label segnata dalla variabile dell'array scelta in InputBox
Endif

   a = a + 1         ' incremento la variabile relativa alla cella dell'array di indice 0

End


Ci sono ?
Titolo: Re: Creare array di componenti
Inserito da: tornu - 10 Ottobre 2012, 21:51:52
Ciao a tutti,
ho ripreso questa discussione, perchè mi è tornato utile questo esempio:

Ultimo post sull'argomento, giuro! :o)

Se qualcuno dopo di me fosse interessato, la soluzione di giulio non permette di creare dinamicamente quante etichette si desidera, la mia modifica per poterlo fare e' la seguente:
Codice: gambas [Seleziona]

PUBLIC SUB Form_Open()
  DIM tips AS NEW Object[]
  DIM i, i_tips, tips_y AS Integer
  i_tips = 5
  
  FOR i = 0 TO i_tips
    tips.Add(Label, i)
    tips[i] = NEW Label(ME)
    
    WITH tips[i]
      .X = 10
      .Y = tips_y
      .width = 100
      .height = 20
      .text = "Abc " & i
    END WITH
    
    tips_y += 30
  NEXT
END

dove, ovviamente i_tips puo' essere impostato a piacere in fase di esecuzione del programma in modo da ottenere etichette a piacere.
Saluti a tutti e tante grazie (a giulio in particolare per avermi indirizzato verso la soluzione!).
Andrea

è fin qui tutto ok, quello che non riesco a fare è utilizzare gli eventi degli oggetti creati (per es.: Oggetto_Click, Oggetto_GotFocus, ecc...).
Facendo varie ricerche sul Forum penso di aver capito che va usata la sintassi
Codice: gambas [Seleziona]

 Object.Attach(NomeOggetto, Contenitore, "TipoOggetto")


ma non ho capito come applicarla all'esempio soprariportato.
Titolo: Re: Creare array di componenti
Inserito da: vuott - 10 Ottobre 2012, 22:32:13
è fin qui tutto ok, quello che non riesco a fare è utilizzare gli eventi degli oggetti creati (per es.: Oggetto_Click, Oggetto_GotFocus, ecc...).
Facendo varie ricerche sul Forum penso di aver capito che va usata la sintassi
Codice: gambas [Seleziona]

 Object.Attach(NomeOggetto, Contenitore, "TipoOggetto")

ma non ho capito come applicarla all'esempio sopra riportato.
In vero puoi anche usare quel che c'è già, ossia (dato che parlavi di evento _click, più coerentemente ho cambiato la Label in Button):
Codice: gambas [Seleziona]

Public Sub Form_Open()  
 Dim tips As New Object[]  
 Dim i, i_tips, tips_y As Integer  
 i_tips = 2 
  
 For i = 0 To i_tips  
   tips.Add(Button)  
   tips[i] = New Button(Me) As "tips" & i


   With tips[i]  
     .X = 10  
     .Y = tips_y  
     .width = 100  
     .height = 40  
     .text = "Abc " & i  
   End With  
    
   tips_y += 30  
 Next  
End


Public Sub tips0_Click()
  
  Print "alibaba 0"
  
End

Public Sub tips1_Click()
  
  Print "alibaba 1"
  
End

Public Sub tips2_Click()
  
  Print "alibaba 2"
  
End
Titolo: Re: Creare array di componenti
Inserito da: md9327 - 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 
Titolo: Re: Creare array di componenti
Inserito da: vuott - 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
Titolo: Re: Creare array di componenti
Inserito da: tornu - 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.
Titolo: Re: Creare array di componenti
Inserito da: Top Fuel - 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?
Titolo: Re: Creare array di componenti
Inserito da: vuott - 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
Titolo: Re: Creare array di componenti
Inserito da: Top Fuel - 14 Ottobre 2012, 15:48:28
Mi servirà giusto una cosa simile. ;)
Grazie.
Titolo: Re: Creare array di componenti
Inserito da: vuott - 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
Titolo: Re: Creare array di componenti
Inserito da: tornu - 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

Titolo: Re: Creare array di componenti
Inserito da: Top Fuel - 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?
Titolo: Re: Creare array di componenti
Inserito da: tornu - 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
Titolo: Re: Creare array di componenti
Inserito da: vuott - 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
Titolo: Re: Creare array di componenti
Inserito da: md9327 - 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.
Titolo: Re: Creare array di componenti
Inserito da: vuott - 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
Titolo: Re: Creare array di componenti
Inserito da: tornu - 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

Titolo: Re: Creare array di componenti
Inserito da: vuott - 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
Titolo: Re: Creare array di componenti
Inserito da: md9327 - 05 Novembre 2012, 16:21:06
Codice: [Seleziona]
       
    Public Sub Form_Open()    
      
     Dim bt As Button  
     Dim j As Byte    
      
      For j = 0 To 39    
      
       With bt = New Button(Me) As "bt"
         .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  
Meglio così...  ;D

Inoltre vi ricordo che esistono gli oggetti VBox/HBox, che possono posizionare automaticamente i gli oggetti in essi contenuti, rendendo quindi inutile l'utilizzo delle proprietà X/Y/W/H, e quindi non è necessario impostarli a mano perchè ci pensa il manager.
Titolo: Re: Creare array di componenti
Inserito da: tornu - 05 Novembre 2012, 17:10:36
Codice: [Seleziona]
       
    Public Sub Form_Open()    
      
     Dim bt As Button  
     Dim j As Byte    
      
      For j = 0 To 39    
      
       With bt = New Button(Me) As "bt"
         .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  
Meglio così...  ;D

Inoltre vi ricordo che esistono gli oggetti VBox/HBox, che possono posizionare automaticamente i gli oggetti in essi contenuti, rendendo quindi inutile l'utilizzo delle proprietà X/Y/W/H, e quindi non è necessario impostarli a mano perchè ci pensa il manager.

Ciao md9327,
grazie per aver integrato ulteriormente i suggerimenti di vuott.
Ho provato il tuo codice su un Form vuoto e tutto funziona perfettamente, ma adattando il tuo suggerimento all'interno di un mio
progetto dove il Form contiene un Panel dove al suo interno creo altri oggetti da codice tutto si "scompiglia", utilizzando un Array
come suggeritomi da vuott prima del tuo intervento gli oggetti restano al loro "posto".
Nel mio caso è giusta questa ultima soluzione o mi suggerisci altre strade. Grazie ancora
Titolo: Re: Creare array di componenti
Inserito da: md9327 - 05 Novembre 2012, 23:23:41
L'esempio di vuott, e il mio intervento, si basavano sul concetto che i pulsanti venivano associati ad una Form.

E' sottinteso che ogni oggetto che tu crei, viene associato ad un parent, ovvero un contenitore.
Come nel tuo ultimo post, questo container non è la Form, ma un Panel all'interno di una Form.
A questo punto, il riferimento che devi usare non è la Form, ma il Panel, e quindi i Children del Panel.

L'uso di un'array di referenze, può essere utile se gli oggetti che crei dinamicamente, vengono linkati sotto diversi parent, e quindi potresti non sapere a priori dove si trovano. (P.S.: per Parent si intende il genitore, ovvero il Contenitore che contiene gli oggetti che stai creando).
Se, come suppongo, stai creando un pannello contenente una lista di pulsanti uguali, questi sono facilmente raggiungibili, tutti attraverso lo stesso Parent, e la stessa proprietà Children.

Nota:
il fatto di usare un'array personale non è che sia vietato, ma credo sia opportuno analizzarne bene l'utilità, e quindi valutarlo caso per caso.
Tieni conto che un array di questo tipo, contiene solo un elenco di riferimenti (ovvero puntatori in memoria) agli oggetti, e non gli oggetti stessi. Questo, ovviamente, limita l'impiego di memoria utilizzata dall'array (in pratica una serie di valori numerici, ovvero i valodi degli indirizzi di memoria degli oggetti), ma è pur sempre uno spreco, se non necessario, o se si possono usare altri metodi (come ad esempio gli array già presenti negli oggetti, vedi Children).
Titolo: Re: Creare array di componenti
Inserito da: tornu - 06 Novembre 2012, 00:08:36
Ok md9327 concetto appreso, grazie della ulteriore spiegazione.
Ora mi capita una cosa "strana", utilizzando sempre il tuo esempio l'ho adattato al mio progetto in questo modo:
Codice: gambas [Seleziona]

Public Sub Form_Open()
  Dim bt As Button
  Dim j As Byte

  For j = 0 To 255
    With lb = New Button(Me) As "bt"
      .X = 5 + ((64 * (j \ 64)) * 1.56)
      .Y = 1 + ((j - ((j \ 64) * 64)) * 25)
      .W = 96
      .H = 24
      .Name = Str(j)
    End With
  Next
End     
       
    Public Sub bt_Click()     
       
      Print "Hai premuto il tasto n. " & Last.Name 
     
    End 

ma il programma si blocca senza indicare nessun errore. Ora mi sorge un dubbio, anzi vi pongo la domanda:
ma c'è un limite al numero di oggetti che si possono creare?
Perchè se porto variabile J al di sotto di 255 tutto riprende a funzionare correttamente.
Titolo: Re: Creare array di componenti
Inserito da: Top Fuel - 06 Novembre 2012, 01:05:16
E' appunto per il fatto che tu usi una variabile tipo byte come contatore che ti succede questo.
Cambiala in short e vedrai che magicamente funzionerà tutto. ;)
Succede perchè essendo una variabile byte alla fine del ciclo next incrementa di 1 j, che essendo 255 torna a 0, ed entra in un loop infinito.
C'era anche una discussione a riguardo ma adesso non riesco a trovarla.
Titolo: Re: Creare array di componenti
Inserito da: vuott - 06 Novembre 2012, 02:16:25
Ora mi sorge un dubbio, anzi vi pongo la domanda:
ma c'è un limite al numero di oggetti che si possono creare?
Perchè se porto variabile J al di sotto di 255 tutto riprende a funzionare correttamente.

E' appunto per il fatto che tu usi una variabile tipo byte come contatore che ti succede questo.
Cambiala in short e vedrai che magicamente funzionerà tutto. ;)

Io avevo posto il tipo di variabile come Byte, poiché il numero di tasti da creare erano 40.



Succede perchè essendo una variabile byte alla fine del ciclo next incrementa di 1 j, che essendo 255 torna a 0, ed entra in un loop infinito.
C'era anche una discussione a riguardo ma adesso non riesco a trovarla.
Sì, avevo creato quella discussione sul ciclo For...Next all'infinito:
http://www.gambas-it.org/smf/index.php?topic=2342.0
Titolo: Re: Creare array di componenti
Inserito da: md9327 - 06 Novembre 2012, 02:32:48
Il limite credo sia imposto dalla dimensione della memoria.
In realtà, in alcuni casi, ho notato che Gambas soffre se l'applicazione impiega troppa memoria.

Ad ogni modo, il suggerimento sul tipo di variabile usata per il loop è corretto, anche se è la causa del tuo problema, visto che hai 40 oggetti.

Ora è abbastanza tardi, e ho la capa un pò fusa, ma credo dovresti controllare i calcoli che fai sul dimensionamento...

E poi c'è un errore:
Codice: [Seleziona]
With lb = New Button(Me) As "bt" 
...
chiami la variabile "lb", invece di "bt"...
Titolo: Re: Creare array di componenti
Inserito da: vuott - 06 Novembre 2012, 09:49:36
Ad ogni modo, il suggerimento sul tipo di variabile usata per il loop è corretto, anche se è la causa del tuo problema

Perché ritieni che sia la causa del problema ?
Titolo: Re: Creare array di componenti
Inserito da: md9327 - 06 Novembre 2012, 11:26:11
Perdona, mi sono perso un "non"...  :D

Sai, l'età, l'ora, e varie altre scuse...  ;D
Titolo: Re: Creare array di componenti
Inserito da: vuott - 06 Novembre 2012, 13:14:41
....e varie altre scuse...  ;D

...del tipo: malattie infettive ?
Titolo: Re: Creare array di componenti
Inserito da: tornu - 06 Novembre 2012, 14:44:12
Grazie a tutti, funziona tutto correttamente modificando la variabile da Byte a Integer.
Non avevo proprio fatto caso alla variabile dichiarata Byte pur conoscendo la differenza fra i vari tipi.

...E poi c'è un errore:
Codice: [Seleziona]
With lb = New Button(Me) As "bt" 
...
chiami la variabile "lb", invece di "bt"...

Una modifica involontaria..... ;D
Titolo: Re: Creare array di componenti
Inserito da: md9327 - 07 Novembre 2012, 14:01:36
La prossima volta non perdonerò questo tipo di errori...  :evil:

 :D