Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: Cri - 22 Febbraio 2010, 14:12:45

Titolo: [Risolto]Gruppi di controlli
Inserito da: Cri - 22 Febbraio 2010, 14:12:45
Salve!
Chiedo scusa per la niubbiaggine; ho cercato sul forum e sul wiki, ma non sono riuscita a trovare niente che mi sveli il modo di fare ciò che vorrei.
Ho un gruppo di controlli (10 Button) per i quali vorrei settare alcune proprietà (ad esempio il colore di background), prendendo i valori da un array di 10 elementi (uno per controllo). Non vorrei fare 10 assegnamenti in cascata :o, preferirei usare un for, ma... non ho capito come indicizzare i dieci controlli!
Mi aiutate?
Titolo: Re: Gruppi di controlli
Inserito da: Ceskho - 22 Febbraio 2010, 14:36:01
Se i tupi button hanno come group, ad esempio, Button allora devi fdare così:

Codice: [Seleziona]
  i = 0
  FOR EACH hcontrol IN ME.Children
    'se il tipo l'oggetto è un Button
    IF Object.Type(hcontrol) = "Button" THEN
      'imposto il background
      hcontrol.background = Color.Red
      INC i
    ENDIF   
  NEXT

Ricorda di definire i nella sub in cui usi questo codice e hcontrol AS Object
Titolo: Re: Gruppi di controlli
Inserito da: Cri - 22 Febbraio 2010, 14:52:15
Ti ringrazio per la competenza, la gentilezza e la velocità!
Funziona perfettamente!
Edit... mi sembrava funzionasse, ma invece non va.... I colori restano quelli che erano...
Ora provo col debug a capire che fa....

Edit: col debug mi pare di aver capito che:
Codice: [Seleziona]
Object.Type
come del resto suggerisce il nome, non contiene il gruppo di appartenenza dell'oggetto in esame, ma il tipo (button, label...);
per cui l'espressione dell'IF:
Codice: [Seleziona]
Object.Type(hcontrol) = "Button" 
risulta vera per tutti i Button della form, e non solo per quelli appartenenti al gruppo.
Bisognerebbe che:
Titolo: Re: Gruppi di controlli
Inserito da: Picavbg - 22 Febbraio 2010, 15:49:06
Spero di non dispiacere a Ceskho se prendo parte alla discussione.
Metti i pulsanti dentro un contenitore del tipo frame o panel e raggruppali come hai fatto prima. Così l'array è limitato solamente ai pulsanti del nuovo oggetto.
Ciao.
Titolo: Re: Gruppi di controlli
Inserito da: Cri - 22 Febbraio 2010, 15:56:37
Anche io avevo pensato a qualche cosa del genere... però mi sembra comunque una soluzione che aggira il problema, invece di affrontarlo di petto.
Non posso indicizzare dei controlli in base al loro appartenere ad un gruppo?
Titolo: Re: Gruppi di controlli
Inserito da: Cri - 22 Febbraio 2010, 17:04:21
C'è poi un altro problema. Leggo infatti a pag. 55 di 'A Beginner's Guide to GAMBAS', a proposito dell'istruzione FOR EACH:
Citazione
The  FOR  EACH  statement   executes  a  loop while simultaneously enumerating an object. The  Expression must be a reference to an enumerable object such as a collection or an array. The order of enumeration in not necessarily predictable. 

Invece io ho bisogno di fare:
Quindi devo assegnare alla proprietà background di ogni Button un ben determinato colore, diverso da tutti gli altri, e seguendo un ordine preciso.
Invece dalla guida sembrerebbe di capire che non è predicibile l'ordine in cui vengono restituiti i controlli, il che mi assegnerebbe i colori in modo random ai vari controlli.
Come devo fare?
Grazie a tutti per l'aiuto e l'interessamento!
Titolo: Re: Gruppi di controlli
Inserito da: Ceskho - 22 Febbraio 2010, 17:08:57
Anche io avevo pensato a qualche cosa del genere... però mi sembra comunque una soluzione che aggira il problema, invece di affrontarlo di petto.
Non posso indicizzare dei controlli in base al loro appartenere ad un gruppo?


Devi capire che purtroppo non ho la sfera magica e devo studiare il caso in base a ciò che mi dici e alle informazioni che mi dai...pertanto il tuo problema è facilmente aggirabile poichè basta inserire un if nel ciclo.

IF hcontrol.grup = "pincopallino" THEN .....

Quindi il codice in toto diventa:

Codice: [Seleziona]
 i = 0
  FOR EACH hcontrol IN ME.Children
    'se il tipo l'oggetto è un Button
    IF Object.Type(hcontrol) = "Button" THEN
      'imposto il background
      IF hcontrol.group = "gruppo_tuo_nuovo" THEN hcontrol.background = Color.Red
      INC i
    ENDIF   
  NEXT
Titolo: Re: Gruppi di controlli
Inserito da: Ceskho - 22 Febbraio 2010, 17:24:58
@ cri

Scusa ma il tuo ultimo messaggio mi era sfuggito (colpa dl pane e nutella!!!  :P)

Dunque...il tuo problema è semplicissimo da risolvere. Il tutto consiste nel creare all'inizio un array di colori ed ad ogni indici associ un colore diverso. In questo modo mediante la i che usi per il ciclo EACH puoi richiamarti i colori dell'array....

Se hai ancora dubbbi chiedi pure...non dovrebbe essere difficile... ;)
Titolo: Re: Gruppi di controlli
Inserito da: Cri - 22 Febbraio 2010, 17:40:20
Grazie!
Dunque, vi dico il punto a cui sono:
di testare hcontrol.group ci avevo provato anche io, solo che ottengo a run time il messaggio di errore:
Citazione
Unknow symbol 'group' in class 'Button'
avevo provato a testare anche  object.group(hcontrol); ottengo lo stesso errore.
l'array di colori ce l'ho, ovviamente indicizzato da i; il problema è comunque che se i controlli mi vengono restituiti dal FOR EACH in modo random, non sono sicura di attribuire ai controlli i colori giusti (al primo il bianco, al secondo il rosso...)
Non mi arrendo però... non voglio fare 10 assegnamenti in cascata!
Titolo: Re: Gruppi di controlli
Inserito da: Ceskho - 22 Febbraio 2010, 17:53:31
in che modo lo controlli il gruppo? postami il codice per favore...

E poi tieni presente che devi impostarlo tu il Group
Titolo: Re: Gruppi di controlli
Inserito da: Cri - 22 Febbraio 2010, 18:22:01
Ho risolto (non molto elegantemente, lo so), in questo modo:
poiché i controlli del gruppo hanno nome n0,n1,n2...
ho assegnato il colore di background in questo modo:

Codice: [Seleziona]
hcontrol.background = .Colori[CInt(Right(hcontrol.name, Len(hcontrol.Name) - 1))]

@Ceskno:  cosa intendi con:
in che modo lo controlli il gruppo?

Il gruppo l'ho impostato attribuendo come proprietà Group lo stesso nome (tramite ToolBox, non col codice). Devo fare dell'altro?
Grazie ancora!
Titolo: Re: Gruppi di controlli
Inserito da: Ceskho - 23 Febbraio 2010, 00:27:17
Citazione
Il gruppo l'ho impostato attribuendo come proprietà Group lo stesso nome (tramite ToolBox, non col codice). Devo fare dell'altro?
Grazie ancora!

No no..era ciò che volevo sapere...
Titolo: Re: Gruppi di controlli
Inserito da: Cri - 23 Febbraio 2010, 06:25:10
Indipendentemente dal fatto che abbia risolto, ( ho sfruttato il fatto che i nomi dei controlli sono formati dalla stringa "n"&<numero progressivo>, convertendo in int il numero progressivo e utilizzandolo come indice) mi piacerebbe sapere se c'è un modo più elegante per lavorare su tutti i controlli di un gruppo, avendo a disposizione un indice che individui in modo univoco ogni controllo all'interno del gruppo.
Ho capito che non si deve fare confronti col VB, perché Gambas è un'altra cosa; voglio precisare che non sono assolutamente nostalgica di win e microsoft (tra l'altro è una decina d'anni che non metto più le mani su VB) ma ricordo che con gli array di controlli questo poteva essere fatto.

Grazie a tutti per l'attenzione e l'aiuto.
Titolo: Re: Gruppi di controlli
Inserito da: leo72 - 23 Febbraio 2010, 07:30:01
Gambas (purtroppo) non ha le matrici di controlli per cui le modifiche/impostazioni a gruppi di essi devono essere fatte ricorrendo a qualche escamotage del codice.

Titolo: Re: Gruppi di controlli
Inserito da: milio - 23 Febbraio 2010, 08:12:12
@Cri

puoi usare la proprieta' tag del button...
ti allego un piccolo esempio.
Titolo: Re: Gruppi di controlli
Inserito da: Cri - 23 Febbraio 2010, 13:44:59
Gambas (purtroppo) non ha le matrici di controlli per cui le modifiche/impostazioni a gruppi di essi devono essere fatte ricorrendo a qualche escamotage del codice.


Capisco... tipo la mia, dunque.... peccato.
@milo, ti ringrazio... sono appena tornata a casa, preparo il pranzo e, appena ho un attimo, guardo l'esempio che mi hai postato.
Titolo: Re: Gruppi di controlli
Inserito da: Gaspare - 23 Febbraio 2010, 18:49:20
non ho visto l'esempio che è stato postato ma la soluzione che ho trovato io è stata quella di usare la proprietà tag del controllo... un esempio pratico si vede nella ricostruzione del sudoku in area download dove a ogni tag corrisponde un colore su 9 occorsi per fare lo schema.
Titolo: Re: Gruppi di controlli
Inserito da: Cri - 23 Febbraio 2010, 19:26:07
Sì, l'esempio postato fa proprio così.
La cosa che non mi convince ancora è quella frase presa dalla guida e che ho postato sopra, dalla quale pare che non sia fissato a priori l'ordine con il quale vengono restituiti i vari controlli dal ciclo FOR EACH... Se può capitare che i controlli vengano visitati in modo random, allora anche i vari colori sono assegnati in modo random! L'unica altra soluzione (oltre alla mia) mi sembrerebbe quella di settare le proprietà TAG dei vari controlli con dei numeri progressivi (un po' come i nomi nel mio esempio, che sono formati da n&<numero progressivo>

Ora ho un ltro problema, riguardante il passaggio di parametri da un form all'altro, ma aprirò un'altra discussione.
Intanto ringrazio di cuore tutti quelli che mi hanno aiutato!
Titolo: Re: [Risolto]Gruppi di controlli
Inserito da: Cri - 24 Febbraio 2010, 05:43:24
Nel ringraziare tutti dell'aiuto datomi, metto un definitivo [risolto] alla discussione
Accipicchia, bastava che mi scorressi i suggerimenti per avere la soluzione (che, per altro voi mi avete dato)!
Titolo: Re: [Risolto]Gruppi di controlli
Inserito da: fsurfing - 24 Febbraio 2010, 17:27:50
Citazione
Accipicchia, bastava che mi scorressi i suggerimenti per avere la soluzione (che, per altro voi mi avete dato)!
:o