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

  • Visitatore
Creare array di componenti
« il: 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

  • Visitatore
Re: Creare array di componenti
« Risposta #1 il: 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ì ....

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: Creare array di componenti
« Risposta #2 il: 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 :-)

  • Visitatore
Re: Creare array di componenti
« Risposta #3 il: 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

  • Visitatore
Re: Creare array di componenti
« Risposta #4 il: 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

  • Visitatore
Re: Creare array di componenti
« Risposta #5 il: 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

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.683
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #6 il: 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.

« Ultima modifica: 19 Luglio 2011, 10:24:15 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.683
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #7 il: 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
« Ultima modifica: 10 Ottobre 2012, 22:24:10 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 md9327

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

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.683
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #9 il: 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 ?
« 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 #10 il: 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.

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Creare array di componenti
« Risposta #11 il: 13 Luglio 2011, 21:34:58 »
Da aggiungere che potesti gestire un'array di Label anche nel questo modo:

Dim Lblarray As Label[]

« Ultima modifica: 13 Luglio 2011, 21:54:47 da milio »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.683
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #12 il: 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 ?
« Ultima modifica: 10 Marzo 2013, 18:29:00 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 #13 il: 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.
« Ultima modifica: 10 Ottobre 2012, 21:53:30 da tornu »
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.683
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Creare array di componenti
« Risposta #14 il: 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
« Ultima modifica: 10 Ottobre 2012, 23:06:49 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. »