Gambas-it

Gambas3 => Programmazione => Topic aperto da: kicco - 19 Agosto 2019, 16:07:43

Titolo: Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 19 Agosto 2019, 16:07:43
Picturebox con una serie di oggetti pulsanti.
Voglio identificarne uno tramite la proprietà .name.
se uso:
Codice: [Seleziona]
 For Each hCon In Me.Controls
                            If hCon.text = "pippo" Then
                               hCon.Background = Color.red
                            Endif
            Next
Mi dice chiaramente che .name non è una proprietà di control.
Non riesco a capire come aggirare l'ostacolo!  :-\
 :ciao:
Titolo: Re:Cercare oggetto istanziato col suo "nome" .name
Inserito da: vuott - 19 Agosto 2019, 16:55:26
.name non è una proprietà di control.

Se parli della Classe "Control", questa Classe possiede la proprietà .Name !
Titolo: Re:Cercare oggetto istanziato col suo "nome" .name
Inserito da: kicco - 19 Agosto 2019, 17:06:15
 :ciao:
Citazione
Se parli della Classe "Control", questa Classe possiede la proprietà .Name !
:bad:  scusa! molevo dire .text non .name
 :bad:

PS: correggo anche il titolo!
Titolo: Re:Cercare oggetto istanziato col suo "nome" .name
Inserito da: vuott - 19 Agosto 2019, 17:08:42
Allora... torniamo alle "origini": ...questi pulsanti sono in via "astratta" innanzitutto degli................. ?   ;)


Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 19 Agosto 2019, 17:21:57
Citazione
Allora... torniamo alle "origini": ...questi pulsanti sono in via "astratta" innanzitutto degli................. ? 
..."cosi" che se premo fanno qualcosa. Ma devono anche cambiare "faccia" e descrizione (.text) a seconda della "luna" dell'utente.
Sono generati (attribuendo la proprietà .name), posizionati ed etichettati (.text) sempre dall'utente che può muoverli per una picturebox.
Creazione, drag & Drop e memorizzazione è già tutto fatto e funziona anche bene.
Quando mi arriva un segnale esterno (seriale), dal quale capisco quale pulsante modificare di stato. Ma ho un ID che corrisponde a .text.
 :-\
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: vuott - 19 Agosto 2019, 17:30:07
No, non sono stato chiaro.

Guarda, la risposta al tuo problema ce l'hai davanti agli occhi, e l'hai già scritta tu nel titolo del tuo post.

I pulsanti, i Button, prima ancora di essere dei "Controlli", sono innanzitutto degli "Oggetti", in quanto istanze, ossia creazioni fattuali, concrete, di una Classe astratta.
Quindi la variabile, dalla quale leggere nell'If la proprietà .Text, andrà dichiarata di tipo....... ?
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 19 Agosto 2019, 17:56:08
Citazione
Quindi la variabile, dalla quale leggere nell'If la proprietà .Text, andrà dichiarata di tipo....... ?
dim hCom as object ?
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: vuott - 19 Agosto 2019, 17:59:44
Appunto.

In un linguaggio orientato agli Oggetti (quasi) tutto è un Oggetto, quale Particolare che partecipa delle caratteristiche formali di una Classe, ossia di un Universale. Universale qui nel senso che vale per tutte le individuali istanze concrete di quella Classe.

Guarda qui ad esempio:
Codice: [Seleziona]
Public Sub Main()

   Dim ob As Object
   Dim ii As Integer[] = [111, 2222, 33333, 444444]
   Dim i As Integer

  ob = ii

  For Each i In ob
    Print i
  Next

End

Nel tuo programma la Classe Button potenzialmente può esprimere la proprietà .Text; cosa, questa, che verrà effettuata da vari Oggetti concreti, ossia i Button creati e posti in un Contenitore, all'interno di un'applicazione grafica.
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: cogier - 19 Agosto 2019, 18:09:21
Changing the colour of buttons does not work very well in Gambas.

To do something similar I would do it like this: -

Codice: [Seleziona]
Public Sub Form_Open()
Dim oObj As Object

For Each oObj In Me.Children
  If Not IsNull(oObj.Text) Then
    If oObj.text = "pippo" Then
      oObj.Font.Bold = True
      oObj.Font.Size = 14
    End If
  Endif
Next

End
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 19 Agosto 2019, 18:19:40
Grazie Vuott e Cogier
@Vuott
mi da comunque un errore alla riga
Codice: [Seleziona]
 If hCon.text = "pippo" Then
con questo messaggio:

Tipo non corrispondente:cercato numero,data o stringa, ottenuto VOID al suo posto...
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: vuott - 19 Agosto 2019, 18:29:24
Io mi rifaccio genericamente alle tue righe all'inizio postate.
Pongo ad esempio 4 Button, ciascuno con un testo alfanumerico nella rispettiva proprietà .Text.
Poi lancio il codice:

Codice: [Seleziona]
Public Sub Form_Open()

   Dim cnt As Object

  For Each cnt In Me.Controls
    Print cnt.Text
  Next

End
E funziona perfettamente.
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 19 Agosto 2019, 18:34:33
Citazione
E funziona perfettamente.
e anche nel mio caso, mi elenca tutti gli oggetti.
M quando creo l'IF di confronto sembra che non riconosca la proprietà .text
Faccio una prova usando il tuo caso.
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 19 Agosto 2019, 18:37:10
Funziona!
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: vuott - 19 Agosto 2019, 18:38:38
...quindi ?
Hai trovato il problema dell'errore sollevato ?
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 19 Agosto 2019, 18:46:37
No! Se applico le stesse regole dentro il progetto non funzionano.
Se faccio il print vedo tutti gli oggetti compreso quello che sto cercando di modificare, correttamente.
Quando uso l'IF non funziona. Per sicurezza ho impostato direttamente il valore (stringa "c1") senza prenderlo dalla seriale, magari c'è qualche errore di conversione...
Ho controllato che non ci fossero spazi o caratteri ascii non stampabili ecc. nella proprietà .text
ma sembra tutto a posto!
Boh! forse devo fermarmi e lasciare decantare le cose perchè, come capita spesso, sarà una cazzata!
Almeno spero!
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: vuott - 19 Agosto 2019, 18:50:58
Sì, forse una pausa può far bene.
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 19 Agosto 2019, 19:04:26
SCOPERTO!
Prova a mettere i pulsanti dentro una picturebox.
a me  non funziona più!
 :-\
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: vuott - 19 Agosto 2019, 19:05:48
... da quando una PictureBox è diventata un Oggetto Container ?   :violent:




Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 19 Agosto 2019, 19:10:49
Citazione
...e ci credo: da quando una PictureBox è diventata un Oggetto Container ?   :violent:
Ho bisogno di una immagine di fondo...
Ma nell'elenco degli oggetti che hanno proprietà .name c'è l'oggetto in questione e con il valore corretto!
 :-\
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: vuott - 19 Agosto 2019, 19:16:16
 :rolleyes:
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: vuott - 19 Agosto 2019, 19:26:08
Il problema sta nel fatto che tra gli Oggetti verificati con l'IF c'è anche la PictureBox (che è anch'essa figlia di FMain come i Button), la quale non possiede una proprietà .Text.

Ecco perché.

Pertanto devi "filtrare" gli Oggetti da far verificare al IF.
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: vuott - 19 Agosto 2019, 19:38:46
Pertanto devi "filtrare" gli Oggetti da far verificare al IF.

Facciamo un semplice esempio pratico.
Su un Form poniamo una PictruBox, sulla quale poniamo due Button.
Nell'IDE attribuiamo alla proprietà .Text del primo Button la stringa "kicco", mentre a quella del secondo la stringa "seveso".
Poi lanciamo in modalità passo-dopo-passo (F8) il seguente codice e vediamo come si comporta e cosa viene scritto in console:
Codice: [Seleziona]
Public Sub Form_Open()

  Dim cnt As Object

  For Each cnt In FMain.Controls
    Print cnt.Name
    If cnt = PictureBox1 Then Continue
    Print cnt.text
    If cnt.text = "kicco" Then Print "trovato !"
  Next

End
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 19 Agosto 2019, 20:29:46
 :ciao:
Ho usato
Codice: [Seleziona]
If Str(hCon.text) = "c1" Then
e funziona!
 :2birre:
 e da queste parti la birra va a fiumi!!!!
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: Gianluigi - 20 Agosto 2019, 00:01:38
Tu hai bisogno di avere un'immagine di fondo per la tua form.
Mi spieghi come fai ad ottenerla con una PictureBox?
Devi sempre pensare a come lavora Gambas, che tutta la grafica si basa sui container.
Un tipo di sfondo così andrebbe bene?
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: vuott - 20 Agosto 2019, 10:26:47
Ho usato
Codice: [Seleziona]
If Str(hCon.text) = "c1" Then
e funziona!
Sì, nel post, che poi ho cancellato/sostituito, ti avevo suggerito di usare la funzione nativa di Gambas Str( ).
Non viene più sollevato l'errore, perché - a mio modesto avviso - quanto ricevuto viene "adeguato", adattato alla modalità Stringa dalla variabile Str() da te utilizzata. Insomma in questo caso la funzione nativa Str() rende comprensbile, nelle modalità strutturali di una stringa di caratteri come stabilite dal linguaggio Gambas, ciò che riceve in modo incomprensibile per essere una "stringa" secondo il protocollo Gambas.
In tal senso anche il Null di Gambas assume ovviamente una forma, prevista dal linguaggio Gambas, affinché possa essere concepito come una stringa Null.
Una Stringa in Gambas viene gestita attraverso una Struttura, scritta in C, chiamata "VALUE_STRING" visibile nel file header gbx_value.h dei sorgenti di Gambas.

Pertanto, l'uso di quella funzione Str() diventa un astuto stratagemma per superare l'ostacolo, per evitare la sollevazione dell'errore, ma non è certo una soluzione pulita ed elegante.
La soluzione ortodossa e giusta è pensare ad un filtro per saltare la valutazione dell'Oggetto PictureBox all'interno della riga del IF.


Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: Gianluigi - 20 Agosto 2019, 11:33:55
...
Pertanto, l'uso di quella funzione Str() diventa un astuto stratagemma per superare l'ostacolo, per evitare la sollevazione dell'errore, ma non è certo una soluzione pulita ed elegante.
La soluzione ortodossa e giusta è pensare ad un filtro per saltare la valutazione dell'Oggetto PictureBox all'interno della riga del IF.

Non riesco ad afferrare quello che intendi, se guardi il mio esempio vedrai che non c'è nessuna picturebox, ma se non uso Str() ...
Cosa mi sfugge?
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: vuott - 20 Agosto 2019, 11:58:13
se guardi il mio esempio vedrai che non c'è nessuna picturebox....
Cosa mi sfugge?

Ti sfugge l'Oggetto Panel che è un "Figlio" di FMain.

La cosa che sfugge invece a me è perché non viene prioritariamente sollevato l'errore di Proprietà non posseduta dall'oggetto rappresentato dalla variabile di tipo Object, invece di dire che il Tipo di dato non è corrispondente.
Ho provato a mettere il nome inventato di una presunta proprietà alla variabile di tipo Object, e anche in questo caso mi solleva semplicemente l'errore del Tipo non corrispondente.
Se pongo quella proprietà, da me inventata, nella funzione Str(), ecco che mi solleva l'errore del simbolo (quindi della Proprietà) sconosciuto.
Forse Object tende preliminarmente ad accettare tutti i "simboli" possibili per i vari Oggetti esistenti in Gambas, salvo verifica successiva. ...ma perché accetta pure i nomi inventati ? Mah !
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: Gianluigi - 20 Agosto 2019, 14:12:50
Si hai ragione.
Un modo per poter filtrare credo è questo:
Codice: [Seleziona]
Public Sub Form_Open()

  Dim obj As Object

  Button1_Click
  For Each obj In Me.Controls
    If object.Type(obj) = "Button" Then
      If obj.Text = "Lilla" Then obj.Background = Color.Blue
    Endif
  Next

End

Avevo scritto delle cavolate, occorre sempre pensare che se gli oggetti sono all'interno di un contenitore, automaticamente diventano figli del contenitore.
Ora vedo se con una bella tazzona di caffè mi sveglio  ;D
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 20 Agosto 2019, 14:41:14
 :ciao:
Citazione
Tu hai bisogno di avere un'immagine di fondo per la tua form.
Mi spieghi come fai ad ottenerla con una PictureBox?
Devi sempre pensare a come lavora Gambas, che tutta la grafica si basa sui container.
Un tipo di sfondo così andrebbe bene?
Grazie Gianluigi!
L'immagine che ho bisogno deve essere tutta visibile. Ecco perchè di primo acchito l'ho "infilata" in una PictureBox, lasciando libero uno spazio per i pulsanti.
La soluzione che hai proposto, Gianluigi l'ho pensata anch'io e per ovviare all'occupazione di spazio sul Form ho deciso di usare solo il menu che appare col tasto destro del mouse. Modo operativo che in genere mi piace molto e che in parte ho già implementato.

Resta la questione sollevata da Vuott su Str() per adattare il formato che sembra irritare (non poco) San Midi (semper laudatur!). sanmidi
 :ciao:
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: Gianluigi - 20 Agosto 2019, 14:50:37
...

Resta la questione sollevata da Vuott su Str() per adattare il formato che sembra irritare (non poco) San Midi (semper laudatur!). sanmidi
 :ciao:

La soluzione (filtro) da me proposta non ti garba?
A San Midi credo che vada bene...
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 20 Agosto 2019, 14:54:44
Citazione
La soluzione (filtro) da me proposta non ti garba?
A San Midi credo che vada bene...
Hai ragione, non usi Str()!
Sì, Sì credo gli vada bene.
Poi la provo nel mio programma.
 :ciao:

PS: Provato! funziona!
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: vuott - 20 Agosto 2019, 17:05:34
Il filtro di Gianluigi è una corretta soluzione.
Era un altro filtro magico a cui tra l'altro anch'io avevo pensato.
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: Gianluigi - 20 Agosto 2019, 18:17:29
Il filtro di Gianluigi è una corretta soluzione.
Era un altro filtro magico a cui tra l'altro anch'io avevo pensato.

Mi è costata una fatica pazzesca!
Rimugina che ti rimugina alla fine ho deciso di copiare questo codice(*) adattandolo e di dargli un tocco di novità cambiando ob con obj e togliendo le spiegazioni altrimenti era troppo facile risalire all'autore originale.  ;D  :rotfl:

(*) http://www.gambas-it.org/smf/index.php?topic=4615.msg37575#msg37575
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 20 Agosto 2019, 20:43:37
 :D :D :D
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: vuott - 21 Agosto 2019, 00:15:44
Conferma quanto da me detto in sostegno della soluzione gianluigesca.
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: kicco - 21 Agosto 2019, 09:21:34
Citazione
gianluigesca.
:)
Titolo: Re:Cercare oggetto istanziato usando la sua proprietà .text
Inserito da: Gianluigi - 21 Agosto 2019, 10:03:47
l'aggettivo vi...

 :P :P :P