Gambas-it

Gambas3 => Programmazione => Topic aperto da: luca.decarlo - 10 Dicembre 2015, 20:59:05

Titolo: Array di controlli
Inserito da: luca.decarlo - 10 Dicembre 2015, 20:59:05
Forse sono ancora legato ai vecchi metodi di programmazione, ma dovrei automatizzare dei processi e mi risultavano comodi gli array per i controlli, es

Codice: [Seleziona]
For x = 1 to xxx
    txtCampi[x].Enabled = False
Next

Si può fare qualcosa di simile?

Grazie

Luca
Titolo: Re:Array di controlli
Inserito da: Top Fuel - 10 Dicembre 2015, 21:07:27
Usi dei normali array che contengono il tipo di oggetto che ti serve:

Private mioarray[20] As Label

oppure dentro una procedura:

Dim mioarray As New Label[20]

Poi fai tutto quello che vuoi.
Oppure usando i gruppi puoi raggruppare insieme oggetti di tipo differente.
Titolo: Re:Array di controlli
Inserito da: vuott - 11 Dicembre 2015, 00:08:16
A quanto già ben esposto da Top Fuel vorrei semplicemente aggiungere la pagina della nostra WIKI:

http://www.gambas-it.org/wiki/index.php?title=Creare_array_di_oggetti
Titolo: Re:Array di controlli
Inserito da: luca.decarlo - 11 Dicembre 2015, 12:03:51
Grazie Ragazzi,

Tutto esaustivo (spero)

Provo ad implementare!!!

Luca
Titolo: Re:Array di controlli
Inserito da: luca.decarlo - 12 Dicembre 2015, 13:03:50
... allora stamattina ci sto mettendo le mani ...

ho visto che gli esempi di Top e vuott, sono relativi al creare dei nuovi oggetti, io ho un form complessino (come grafica) con varie textbox, e con quelle già piazzate che dovrei fare un ciclo per abilitarle o disabilitarle tutte.

Se ho ben capito le vostre indicazioni le utilizzerò una form "dinammica" dove "passandogli"  un array di campi, formati, lunghezze, ecc, gestisce le tabelle!!

Luca
Titolo: Re:Array di controlli
Inserito da: Top Fuel - 12 Dicembre 2015, 16:05:13
Usa i gruppi.
In fase di design assegni le varie TextBox ad un unico gruppo, poi nel programma usando il loro nome o un altro riferimento che vedrai tu le abiliti o no.
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 12 Dicembre 2015, 22:30:07
Usa i gruppi.
In fase di design assegni le varie TextBox ad un unico gruppo, poi nel programma usando il loro nome o un altro riferimento che vedrai tu le abiliti o no.
@luca
Ti dovresti fidare di quanto qui scrive Top Fuel perché ne sta scrivendo proprio ora nel libro, o almeno dovrebbe  ;)

 :ciao:
Titolo: Re:Array di controlli
Inserito da: vuott - 13 Dicembre 2015, 15:02:06
un array di campi, formati, lunghezze, ecc, gestisce le tabelle!!
Ricorda che volendo utilizzare un'unica collezione di dati appartenti a tipi diversi, dovrai utilizzare un array di tipo Variant oppure una Struttura.
Titolo: Re:Array di controlli
Inserito da: Top Fuel - 13 Dicembre 2015, 16:56:00
Ricorda che volendo utilizzare un'unica collezione di dati appartenti a tipi diversi, dovrai utilizzare un array di tipo Variant oppure una Struttura.

Quando ne ho parlato io mi avete massacrato "usa le classi, sono meglio di qui, meglio di la ecc. ecc..." e adesso sei qui a consigliare di usarle? :P :P :P :P :P :P :P :P :P :P :P :P :P :P :P :P :P :P :P :P
Titolo: Re:Array di controlli
Inserito da: vuott - 13 Dicembre 2015, 19:06:38
Quando ne ho parlato io mi avete massacrato "usa le classi, sono meglio di qui, meglio di la ecc. ecc..." e adesso sei qui a consigliare di usarle?
Devi riportarmi il post, nel quale io ti ho massacrato per aver tu suggerito di usare le Strutture.
 :o E' paradossale la tua affermazione ! Io faccio abbondante uso della risorsa Struttura, in particolar modo nelle chiamate a funzioni esterne a Gambas con Extern.
Al fine di sottolineare la mia particolarissima attenzione alle Strutture in genere, mi preme a questo punto ricordare i miei due mattoni micidiali sullo studio per l'adattamento delle Strutture esterne, scritte in C, con Gambas:
1) http://www.gambas-it.org/wiki/index.php?title=Gestire_con_sicurezza_le_Strutture_esterne
2) http://www.gambas-it.org/wiki/index.php?title=Gestire_con_un_Puntatore_le_Strutture_esterne
Per chiarire la mia attenzione per le Strutture, ti passo, allora, questa mia chicca esemplificativa, che fa riferimento alla pagina sub 1), di come poter adattare in un'applicazione Gambas con codice Gambas una Struttura esterna molto complessa, scritta in C (in questo caso l'esempio è stato effettuato su una semplice Struttura del file header /usr/include/aio.h ):
Codice: [Seleziona]
Library "/tmp/libadhoc"

' int Dim_aiocb()
' Ottiene la dimensione della Struttura "aiocb":
Private Extern Dim_aiocb() As Integer

' void Scrive_aio_fildes(struct *aiocb)
' Scrive un valore nel membro "aio_fildes"
Private Extern Scrive_aio_fildes(po As Pointer, v As Integer)

' int Legge_aio_fildes(struct *aiocb)
' Legge il valore contenuto dal membro "aio_fildes"
Private Extern Legge_aio_fildes(po As Pointer) As Integer

' void Scrive_lio_opcode(struct *aiocb)
' Scrive un valore nel membro "aio_lio_opcode"
Private Extern Scrive_aio_lio_opcode(po As Pointer, v As Integer)

' int Legge_lio_opcode(struct *aiocb)
' Legge il valore contenuto dal membro "aio_lio_opcode"
Private Extern Legge_aio_lio_opcode(po As Pointer) As Integer


Public Sub Main()

  Dim i As Integer
  Dim p As Pointer
 
  CreaSo("/usr/include/aio.h", "struct aiocb", ["aio_fildes", "aio_lio_opcode"], "/tmp/libadhoc")
 
  i = Dim_aiocb()
  Print "La dimensione della Struttura è:     ", i; " byte"
  p = Alloc(i)
 
  Scrive_aio_fildes(p, 99)
 
  i = Legge_aio_fildes(p)
  Print "Valore letto dal membro 'aio_fildes':", i
 
  Scrive_aio_lio_opcode(p, 200)
 
  i = Legge_aio_lio_opcode(p)
  Print "Valore letto dal membro 'aio_fildes':", i
 
  Free(p)

End


Private Procedure CreaSo(Percorso_del_file_header As String, Nome_della_Struttura As String, Nome_dei_Membri As String[], libreria_adhoc As String)
 
  Dim s As String
  Dim b As Byte
 
    s = "#include <" & Percorso_del_file_header & ">\n\n" &
        "int Dim_" & LTrim(Replace(Nome_della_Struttura, "struct", Null)) & "() {\n" &
        "   return sizeof(" & Nome_della_Struttura & ");\n}" &
        "\n\n\n"
       
    For b = 0 To Nome_dei_Membri.Max
      s &= "void Scrive_" & Nome_dei_Membri[b] & "(" & Nome_della_Struttura & " *p, int valore) {\n" &
      "   p->" & Nome_dei_Membri[b] & " = valore;\n}"
      "\n\n\n" &
      "int Legge_" & Nome_dei_Membri[b] & "(" & Nome_della_Struttura & " *p) {\n" &
      "   return p->" & Nome_dei_Membri[b] & ";\n}"
    Next
       
    File.Save(libreria_adhoc & ".c", s)

    Shell "gcc -o " &/ libreria_adhoc & ".so " &/ libreria_adhoc & ".c -shared" Wait
 
End

E', inoltre, arcinota la disquisizione fra me e Gianluigi proprio sulle Strutture (...laddove io vesto sempre i panni dello strenuo difensore proprio delle Strutture); così come è altrettanto noto in modo sommo che tuttte le pagine della nostra WIKI, afferenti direttamente od indirettamente alla risorsa Struttura, sono state scritte da me.
Tra l'altro, come Gianluigi sa bene, io sono molto restio ad usare i Variant, in favore invece proprio delle Strutture !

Pertanto, per me è stato naturale consigliare a luca.decarlo l'uso delle Strutture.   :-\





Titolo: Re:Array di controlli
Inserito da: Top Fuel - 13 Dicembre 2015, 21:01:36
Io parlavo di questa discussione:

http://www.gambas-it.org/smf/index.php?topic=3919.0 (http://www.gambas-it.org/smf/index.php?topic=3919.0)

E comunque Luca non chiedeva lumi sulle chiamate di funzioni esterne, ma di lavorare su dei dati, il tutto può avere un collegamento a quella mitica discussione, dove voi mi bombardavate da tutte le parti... :P :P :P :P
Titolo: Re:Array di controlli
Inserito da: vuott - 14 Dicembre 2015, 00:21:43
Io parlavo di questa discussione:

http://www.gambas-it.org/smf/index.php?topic=3919.0 (http://www.gambas-it.org/smf/index.php?topic=3919.0)

L'avevo immaginato che facevi riferimento a questa discussione, ma - mi spiace dirlo - hai compreso male il mio pensiero, lì espresso.

I miei dubbi, là sollevati, facevano riferimento alle "stringhe a lunghezza fissa" e non alla risorsa "Struttura" in quanto tale. (In particolare, io e Pastrank suggerivamo l'uso della funzione Seek).
Tra l'altro, vedo nell'intera discussione che ad un certo punto io e te ci trovavamo su alcune cose in accordo rispetto invece a Gianluigi.

Inoltre, guarda cosa rispondo all'amico Gianluigi:    :-\
http://www.gambas-it.org/smf/index.php?topic=3919.msg35156#msg35156



E comunque Luca non chiedeva lumi sulle chiamate di funzioni esterne, ma di lavorare su dei dati,
...ed infatti io gli ho solo e semplicemente ricordato di fare attenzione con l'uso degli array contenenti valori di tipo diverso fra loro.



dove voi mi bombardavate da tutte le parti..
Colgo l'occasione di quest'ultima tua riga per ripetere che il dubbio - niente bombardamento - per quel che mi riguarda era limitato all'idea "stringhe a lunghezza fissa".

Ti riporto cosa ho scritto a Gianluigi in quella discussione (http://www.gambas-it.org/smf/index.php?topic=3919.msg35063#msg35063):
" In fondo l'amico Top Fuel non nega ovviamente che con Gambas non si possa ottenere il medesimo risultato, dice semplicemente che in VB v'è l'opzione RANDOM con la connessa procedura ed istruzioni della lettura/scrittura di file che provvede lei a fare i lavoraccio dei dovuti calcoli, non solo per leggere, ma soprattutto per scrivere dati il cui numero può variare all'interno dei campi della struttura tipo dichiarati come Stringhe a lunghezza fissa. La lunghezza fissa porrebbe degli argini, dei punti di riferimento per la scrittura e per la lettura certa. "
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 14 Dicembre 2015, 10:57:50
Io parlavo di questa discussione:
...

Ciao Top Fuel,
guarda che è vero, quello che ha sempre avuto perplessità sulle strutture sono io.
Comunque se leggi alla fine della discussione da te indicata si capisce bene, infatti io forzo vuott a scrivere in soldoni cosa intende Minisini sulla ML e ne concludo che io l'unico, diciamo così, a osteggiare le strutture ero in sintonia col gran capo.
Non prendertela con chi non ha colpe, anzi con chi ha solo meriti.
Comunque io ho cercato di utilizzare le strutture in modo efficiente (con gli array di strutture) tanto che e ho allegato un file di esempio, ne approfitto per scusarmi delle spiegazioni in inglese maccheronico.

Piuttosto approfitterei di questa discussione per sollecitare vuott che ne capisce (ma anche altri se credono, penso a Sotema, Milio...)  a sforzarsi di spiegare a noi semplici “programmatori orientati agli eventi” un po meglio di quanto qui è stato fatto fino a oggi, un modo semplice e comprensibile per instradarci ad usare efficacemente gli oggetti (le classi) al posto delle strutture.
Grazie

Nel labirinto Sanmidiano cerco l'uscio Minisiano...  :P

 :ciao:  :ciao:
Titolo: Re:Array di controlli
Inserito da: vuott - 14 Dicembre 2015, 11:08:34
sollecitare vuott che ne capisce (ma anche altri se credono, penso a Sotema, Milio...)  a sforzarsi di spiegare a noi semplici “programmatori orientati agli eventi” un po meglio di quanto qui è stato fatto fino a oggi, un modo semplice e comprensibile per instradarci ad usare efficacemente gli oggetti (le classi) al posto delle strutture.

" Questo è il baaallo della sala,
  io non so se ballo bene,
  ma se qua qualche altro non viene,
  questo ballo non si può far.
"    (http://www.snowboard-italia.com/forum/images/smilies/whistle.gif)
Titolo: Re:Array di controlli
Inserito da: luca.decarlo - 16 Dicembre 2015, 14:30:56
Sono arrivato al momento di definire nel campo group dei controlli interessati al test il valore grp1

poi nello specifico eseguo:

Codice: [Seleziona]
For Each oControl In grp1
    oControl.Enabled = True
Next

Chiaramente oControl è definito come Objects, ma ottengo errore su grp1 che non esiste.

Titolo: Re:Array di controlli
Inserito da: vuott - 16 Dicembre 2015, 14:43:22
ottengo errore su grp1 che non esiste.
Hai dichiarato e creato preliminarmente quella variabile grp1 ?
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 16 Dicembre 2015, 15:05:27
Sono arrivato al momento di definire nel campo group dei controlli interessati al test il valore grp1

poi nello specifico eseguo:

Codice: [Seleziona]
For Each oControl In grp1
    oControl.Enabled = True
Next

Chiaramente oControl è definito come Objects, ma ottengo errore su grp1 che non esiste.

Ricordati che gli oggetti prima di poter essere usati devono essere istanziati (http://www.gambas-it.org/wiki/index.php?title=Istanziare_un_oggetto_mediante_la_Classe_%22Object%22) .
NomeOggetto = New ecc., leggi anche questo (http://www.gambas-it.org/wiki/index.php?title=Assegnare_da_codice_pi%C3%B9_oggetti_ad_un_Gruppo)
Titolo: Re:Array di controlli
Inserito da: luca.decarlo - 17 Dicembre 2015, 09:27:13
Grazie Gianluigi,

sto studiando il materiale che mi hai indicato, mi perdo sempre per strada, ovvero tutti gli esempi sono su oggetti che vengono creati da codice, non riesco a trovare la connessione tra questi appena detti e quelli invece creati da ide.

Ho delle form piene di TextBox e le nel campo group ci metto in tutte lo stesso nome, ora da codice devo abilitarle o disabilitarle tutte.

Con vb6 avevo un indice di controlli e facevo un semplice for dallo 0 all'indice massimo e via!

Titolo: Re:Array di controlli
Inserito da: Gianluigi - 17 Dicembre 2015, 11:14:08
Grazie Gianluigi,

sto studiando il materiale che mi hai indicato, mi perdo sempre per strada, ovvero tutti gli esempi sono su oggetti che vengono creati da codice, non riesco a trovare la connessione tra questi appena detti e quelli invece creati da ide.

Ho delle form piene di TextBox e le nel campo group ci metto in tutte lo stesso nome, ora da codice devo abilitarle o disabilitarle tutte.

Con vb6 avevo un indice di controlli e facevo un semplice for dallo 0 all'indice massimo e via!

Non sono sicuro di aver compreso quello che mi stai chiedendo, non confondere gli eventi con le proprietà se devi disabilitare alcune textbox di una maschera che siano già disegnate dall'ide o disegnate dal codice poco importa ad esempio:
Codice: [Seleziona]
Public Sub Button1_Click()
 
  Dim c As Control
 
  For Each c In FMain.Controls
   
    If c.Name Like "TextBox[1,3,5]" Then
      c.Enabled = False
    Endif
   
  Next

End
Titolo: Re:Array di controlli
Inserito da: vuott - 17 Dicembre 2015, 14:14:59
Come già ti ha precisato Gianluigi, il Gruppo (group) è afferente alla sola sollevazione degli Eventi: tutti gli oggetti che appartengono ad un Gruppo potranno sollevare quel determinato Evento, facente riferimento nel codice alla sua sub-routine (sottoprocedura).
Codice: [Seleziona]
Public Sub NomedelGruppo_Click()

   Print Last.Name; " ha sollevato questo evento _Click() ! "

End

Ti segnalo questa pagina della nostra WIKI:
http://www.gambas-it.org/wiki/index.php?title=Gli_eventi


Riguardo, poi, al tuo problema di disattivare due o più oggetti di tipo TextBox, qualora sul Form vi siano solo TextBox, puoi anche più semplicemente fare così:
Codice: [Seleziona]
Public Sub Form_Open()

  Dim tb As TextBox
 
' Per ciascun "TextBox" presente sul Form corrente...
     For Each tb In Me.Children
' ...viene assegnato il valore False alla proprietà .Enabled:
       tb.Enabled = False
    Next

End
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 17 Dicembre 2015, 16:34:31
@vuott
come chiesto da luca.decarlo il codice che hai postato agisce su tutte le textbox e come hai sottolineato funziona solo se sulla form hai messo unicamente TextBox, per questa ragione credo sia il caso di approfittare della proprietà Tag; ad esempio  si possono selezionare tutte le textbox interessate e impostare tag ad 1 in un colpo solo quindi:
Codice: [Seleziona]
Public Sub Button1_Click()
 
  Dim c As Control
 
  For Each c In FMain.Controls   
   
    If c.Tag = 1 Then c.Enabled = False     
 
  Next

End
:ciao:
Titolo: Re:Array di controlli
Inserito da: vuott - 17 Dicembre 2015, 16:47:43
..... funziona solo se sulla form hai messo unicamente TextBox, per questa ragione credo sia il caso di approfittare della proprietà Tag
L'uso della proprietà .Tag è una possibilità, sì.
Però si può anche evitare di scomodare questa proprietà, verificando invece il tipo di oggetto-Figlio presente sul Form.

Nell'esempio che segue sul Form abbiamo oltre ad alcune TextBox anche altri oggetti. Per individuare e, quindi, disabilitare soltanto le TextBox, possiamo adottare la seguente soluzione:
Codice: [Seleziona]
Public Sub Form_Open()

  Dim ob As Object
 
' Per ogni oggetto-figlio presente sul Form corrente...
    For Each ob In Me.Children
' ...verifichiamo il suo "tipo".  SE l'oggetto è una "TextBox", allora - e solo in tal caso - la disabilitiamo:
      If Object.Type(ob) = "TextBox" Then ob.Enabled = False
    Next
 
End
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 17 Dicembre 2015, 16:59:27
E perché non così? (sempre nel ciclo):
Codice: [Seleziona]
If Left(c.Name, 7) = "TextBox" Then c.Enabled = False
:ciao:
Titolo: Re:Array di controlli
Inserito da: vuott - 17 Dicembre 2015, 17:10:09
E perché non così?

....sai meglio di me che spesso nella programmazione esistono molti modi per dare soluzione ad un problema....

Codice: [Seleziona]
Public Sub Form_Open()
 
  Dim c As Control
 
' Per ogni Controllo posto nel Form...
  For Each c In FMain.Controls
' ...se detto Controllo appartiene alla Classe "TextBox", allora lo disabilitiamo:
   If Object.Is(c, "Textbox") Then c.Enabled = False
 
  Next

End
    ;D
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 17 Dicembre 2015, 17:18:59
 :rotfl:

Basta mi arrendo ho esaurito le idee che poi non andavano molto oltre la proprietà name.  :D

 :ciao:
Titolo: Re:Array di controlli
Inserito da: vuott - 17 Dicembre 2015, 18:56:16
Basta mi arrendo .....

Adesso usando i Puntatori, penetro nella memoria di ciascun oggetto posto sul Form, individuando il nome della propria Classe.... così t'affondo la Corazzata:    :rotfl:

Codice: [Seleziona]
Public Sub Form_Open()

  Dim ob As Object
  Dim p1, p2 As Pointer

   For Each ob In Me.Children
     p1 = Object.Address(ob)
     p2 = Pointer@(p1)
     if String@(Pointer@(p2 + 24)) = "TextBox" then ob.Enabled = False
   Next

End

(http://www.trentoincina.it/images/barham.jpg)
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 17 Dicembre 2015, 22:17:33
Sono uscito tranquillo perché mi ero arreso e tu malgrado questo  mi hai affondato la corazzata!  >:(
Mi appello alla convenzione di Ginevra (quella gnocca coi capelli rossi) perderai la guerra a tavolino.  :nonono:
Titolo: Re:Array di controlli
Inserito da: vuott - 08 Gennaio 2016, 12:27:40
sollecitare vuott che ne capisce (ma anche altri se credono, penso a Sotema, Milio...)  a sforzarsi di spiegare a noi semplici “programmatori orientati agli eventi” un po meglio di quanto qui è stato fatto fino a oggi, un modo semplice e comprensibile per instradarci ad usare efficacemente gli oggetti (le classi) al posto delle strutture.
Credo che questa pagina possa dare una risposta:
http://www.gambas-it.org/wiki/index.php?title=Variabile_del_tipo_di_una_Classe_specifica_creata
Titolo: Re:Array di controlli
Inserito da: luca.decarlo - 13 Gennaio 2016, 10:26:51
Dopo le vostre spiegazioni ho una subbettina che funzione perfettamente, che, in base ad un valore bool che gli passo abilita o disabilita i controlli che mi interessano.

Ora provavo ad implementarla, visto che fa già un ciclo sui controlli del form, passando un'altro bool, facendogli azzerare il valore del controllo.

es:
Codice: [Seleziona]
Public Sub EnaDisa(bValue As Boolean, bAzzero As Boolean)
 
  Dim c As Control
 
  For Each c In FSoggetti.Controls
   
    If c.Tag = 1 Then
     c.Enabled = bValue
     Print c.Name
     If c.Name Like "TextBox[2,3,4,5]" And bAzzero = True Then
        c.Text = ""
     Else If c.Name Like "TextBox[6,7]" And bAzzero = True Then
        c.Text = 0
     Else If c.Name Like "ComboBox" And bAzzero = True Then
        c.Index = -1
     Endif
    Endif
  Next
 
End

nella line c.Text = "" ottendo un errore: "Unknow symbol 'Text' in class Control"

Luca
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 13 Gennaio 2016, 10:39:13
Sto facendo una cosa che non posso mollare, ma credo tu debba assegnare il tipo di controllo.
Se l'oggetto è un pulsante allora devi assegnare button e dovrebbe funzionare.
Titolo: Re:Array di controlli
Inserito da: vuott - 13 Gennaio 2016, 10:49:45
Ponendo immediatamente prima del comando c.Text = ""
la riga:
 
Codice: [Seleziona]
Print Object.Type(c)

cosa viene scritto in console ?
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 13 Gennaio 2016, 10:59:06
Ciao vuott,
forse dovrebbe sfruttare i tuoi precedenti consigli e basarsi su Object e Children farebbe prima.
 :ciao:
Titolo: Re:Array di controlli
Inserito da: luca.decarlo - 13 Gennaio 2016, 11:12:39
Ponendo immediatamente prima del comando c.Text = ""
la riga:
 
Codice: [Seleziona]
Print Object.Type(c)

cosa viene scritto in console ?


scrive: TextBox
Titolo: Re:Array di controlli
Inserito da: luca.decarlo - 13 Gennaio 2016, 11:15:54
Ciao vuott,
forse dovrebbe sfruttare i tuoi precedenti consigli e basarsi su Object e Children farebbe prima.
 :ciao:

Forse sbaglio io, ma ho provato a rivedere quello che dici, in realtà il Children mi cambierebbe solo il ciclo for each, poi comunque nell'esempio viene comunque eseguito obj.enabled dopo il test di obkect.type, quindi mi darebbe lo stesso errore.

Luca
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 13 Gennaio 2016, 11:25:25
Ciao vuott,
forse dovrebbe sfruttare i tuoi precedenti consigli e basarsi su Object e Children farebbe prima.
 :ciao:

Forse sbaglio io, ma ho provato a rivedere quello che dici, in realtà il Children mi cambierebbe solo il ciclo for each, poi comunque nell'esempio viene comunque eseguito obj.enabled dopo il test di obkect.type, quindi mi darebbe lo stesso errore.

Luca

Forse non mi sono spiegato bene:
Se invece di c e controls cicli o e children come aveva a suo tempo suggerito vuott avresti subito il tipo di oggetto e potresti usare text.
Ti dovrebbe bastare provare il tuo codice così come è sostituendo o a c, object a control e children a controls. Forse c'è un errore sulla combobox, se usi name deve essere completa del numero.
Titolo: Re:Array di controlli
Inserito da: luca.decarlo - 13 Gennaio 2016, 11:36:13
A Ok Gianluigi, ora ho capito ... sai l'età  ;D

Provo subito!
Titolo: Re:Array di controlli
Inserito da: vuott - 13 Gennaio 2016, 11:54:50
Codice: [Seleziona]
If c.Name Like "TextBox[2,3,4,5]" And bAzzero = True Then
        c.Text = ""

...perché hai usato la parola chiave " Like " invece di " = " ?  ???
Titolo: Re:Array di controlli
Inserito da: luca.decarlo - 13 Gennaio 2016, 11:56:09
Fatto prova veloce così e sembra funzionare tutto!!



Codice: [Seleziona]
Dim o As Object
 
   For Each o In Me.Children
    If o.Tag = 1 Then
     o.Enabled = bValue
     If o.Name Like "TextBox[2,3,4,5]" And bAzzero = True Then
        o.Text = ""
     Else If o.Name Like "TextBox[6,7]" And bAzzero = True Then
        o.Text = 0
     Else If o.Name Like "ComboBox" And bAzzero = True Then
        o.Index = -1
     Endif
    Endif
  Next
 
Titolo: Re:Array di controlli
Inserito da: luca.decarlo - 13 Gennaio 2016, 11:57:36
Codice: [Seleziona]
If c.Name Like "TextBox[2,3,4,5]" And bAzzero = True Then
        c.Text = ""

...perché hai usato la parola chiave " Like " invece di " = " ?  ???

E' un errore??  Nelle pagine precedenti c'è questo esempio, ho preso spunto da li!
Titolo: Re:Array di controlli
Inserito da: vuott - 13 Gennaio 2016, 12:08:44
Sì, ho visto, ma solitamente la parola " Like " prevede anche l'uso di caratteri speciali.

Prova a cambiare con il segno di uguale ( = ).
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 13 Gennaio 2016, 12:11:14
Usare Like è corretto (più che corretto :D ) piuttosto occorre capirlo bene il tuo Like su ComboBox non può funzionare. Se intendi indicare tutte le combobox devi aggiungere un asterisco.
Devi studiare anche la differenza fra Controls e Children il primo scova tutti i controlli anche quelli annidati nei contenitori (controlli di controlli di controlli...) il secondo no e se vuoi leggerli devi annidare dei cicli per ogni contenitore.

 :ciao:
Titolo: Re:Array di controlli
Inserito da: vuott - 13 Gennaio 2016, 12:37:28
Codice: [Seleziona]
"TextBox[2,3,4,5]"

Ah, ma hai utilizzato le parentesi quadre come appunto caratteri speciali per individuare quasiasi nome di TextBox che termina con uno di quei numeri.
L'uso è più che correto, allora.
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 13 Gennaio 2016, 14:21:23
... credo tu debba assegnare il tipo di controllo.
Se l'oggetto è un pulsante allora devi assegnare button e dovrebbe funzionare.

Nel caso tu voglia ricercare sempre tramite la proprietà nome e tu abbia anche la necessità di accedere a controlli annidati puoi usare il mio precedente suggerimento che credo funzioni:
Codice: [Seleziona]
Public Sub EnaDisa(bValue As Boolean, bAzzero As Boolean)
 
  Dim c As Control, o As Object
 
  For Each c In FSoggetti.Controls
    ' Dovrebbe andar bene anche qui'
    ' o = c
    '
    If c.Tag = 1 Then
     c.Enabled = bValue
     Print c.Name
     If c.Name Like "TextBox[2,3,4,5]" And bAzzero = True Then
        o = c
        o.Text = ""
     Else If c.Name Like "TextBox[6,7]" And bAzzero = True Then
       o = c
       o.Text = 0     
     Else If c.Name Like "ComboBox*" And bAzzero = True Then ' Se ti riferisci a tutte!'
       o = c
       o.Index = -1
     Endif
    Endif
  Next
 
End
Titolo: Re:Array di controlli
Inserito da: luca.decarlo - 14 Gennaio 2016, 14:22:33
Ritorno all'utilizzo del "Like" ma utilizza solo 1 carattre "variabile"??

Ovvero:

Codice: [Seleziona]
Dim o As Object
   For Each o In Me.Children
    If o.Tag = 1 Then
     o.Enabled = bValue
     If o.Name Like "TextBox[2,3,4,5,6,7,8,9,10,11,12,13]" And bAzzero = True Then
        o.Text = ""
     'Else If o.Name Like "TextBox[6,7]" And bAzzero = True Then
     '   o.Text = 0
     Else If o.Name Like "ComboBox*" And bAzzero = True Then
        o.Index = -1
     Endif
    Endif
  Next


Azzera solo fino alla textbox9 dalla 10 in poi nulla!

Titolo: Re:Array di controlli
Inserito da: Gianluigi - 14 Gennaio 2016, 17:00:39
Guarda io di espressioni regolari ne so veramente poco, in giro per il web ci sono dei tutorial ...
Questo ad esempio funziona:
Codice: [Seleziona]
Public Sub Button1_Click()
 
  Dim c As Control
  Dim $OK As Boolean = True
 
  For Each c In FMain.Controls
   
    If c.Name Like "TextBox[2-9]" Or c.Name Like "TextBox[1][0-3]" And $OK = True Then
      c.Enabled = False
    Endif
   
  Next

End
A proposito:
A te il mio codice sulle combo funziona? Oppure fa come a vuott?

NB: Ho spostato la domanda sulla ComboBox qui (http://www.gambas-it.org/smf/index.php?topic=4679.msg37751#msg37751)
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 14 Gennaio 2016, 17:55:19
Nel codice precedente avevo inserito inavvertitamente un Or If è giusto solo Or

Scusa
Titolo: Re:Array di controlli
Inserito da: vuott - 14 Gennaio 2016, 18:03:08
Visto il suo esempio, se lui non ha più di 13 TextBox e vuole disabilitarli tutti tranne il primo, si può più agevolmente scrivere:

Codice: [Seleziona]
...Like "TextBox*[2-9]"...

e più precisamente:
Codice: [Seleziona]
If c.Name Like "TextBox*[2-9]" And bAzzero Then
   ......
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 14 Gennaio 2016, 19:05:23
Visto il suo esempio, se lui non ha più di 13 TextBox e vuole disabilitarli tutti tranne il primo, si può più agevolmente scrivere:

Codice: [Seleziona]
...Like "TextBox*[2-9]"...

...

A me non funziona, esclude 1, 10 e 11, come potrebbe agire se 0 e 1  vengono esclusi? Il carattere (*) significa un qualunque numero di qualsiasi carattere escluso 0 e 1 un po come questo codice:
Codice: [Seleziona]
c.Name Like "TextBox*[^0-1]"
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 14 Gennaio 2016, 19:24:40
Che brutta cosa la vecchiaia, c'ero già caduto ma non mi sono ricordato, basta che invece delle parentesi quadre uno usi le parentesi graffe e il codice postato da Luca funziona, esempio:
Codice: [Seleziona]
If c.Name Like "TextBox{2,3,4,5,6,7,8,9,10,11,12,13}" And $OK = True ... Then
Titolo: Re:Array di controlli
Inserito da: vuott - 14 Gennaio 2016, 23:48:13
A me non funziona, esclude 1, 10 e 11, come potrebbe agire se 0 e 1  vengono esclusi?
Hai ragione, non me ne ero avveduto.



basta che invece delle parentesi quadre uno usi le parentesi graffe e il codice postato da Luca funziona, esempio:
Codice: [Seleziona]
If c.Name Like "TextBox{2,3,4,5,6,7,8,9,10,11,12,13}" And $OK = True ... Then
Sì, funziona bene.
Titolo: Re:Array di controlli
Inserito da: Gianluigi - 15 Gennaio 2016, 00:06:30
... avveduto.

Perdindirindina avveduto merita un bacio  :-*

 :D  :ciao: