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

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Creare array di componenti
« Risposta #30 il: 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.
« Ultima modifica: 05 Novembre 2012, 16:23:34 da md9327 »

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Creare array di componenti
« Risposta #31 il: 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
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Creare array di componenti
« Risposta #32 il: 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).

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Creare array di componenti
« Risposta #33 il: 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.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Creare array di componenti
« Risposta #34 il: 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.
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.292
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #35 il: 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
« 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 #36 il: 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"...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.292
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #37 il: 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 ?
« 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 #38 il: 06 Novembre 2012, 11:26:11 »
Perdona, mi sono perso un "non"...  :D

Sai, l'età, l'ora, e varie altre scuse...  ;D

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.292
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #39 il: 06 Novembre 2012, 13:14:41 »
....e varie altre scuse...  ;D

...del tipo: malattie infettive ?
« 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 #40 il: 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
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Creare array di componenti
« Risposta #41 il: 07 Novembre 2012, 14:01:36 »
La prossima volta non perdonerò questo tipo di errori...  :evil:

 :D