Gambas-it

Gambas3 => Programmazione => Topic aperto da: kicco - 23 Giugno 2019, 20:45:42

Titolo: Nome di un oggetto
Inserito da: kicco - 23 Giugno 2019, 20:45:42
Perchè se creo un oggetto  dall'ide e gli attribuisco la proprietà nome dal panello proprieta, esempio BT_Quit, poi posso usare l'espressione
Bt_Quit.background=color.red e se invece istanzio l'oggetto da una classe attraverso il codice, gli attribuisco il nome con .name=xxx e poi tento di cambiare colore, usando XXX.backgound=color.red non funziona?
Entrambi dovrebbero portare allo stesso risultato, essendo entrambi la "stessa" operazione?
Cosa non ho capito?
 :'(
Titolo: Re:Nome di un oggetto
Inserito da: vuott - 23 Giugno 2019, 21:21:23
Nel tuo esempio dell'IDE cambia il "nome" dell'Oggetto, da te impostato con "BT_Quit", con un altro nome mediante la proprietà BT_Quit.Name = "xxxx" (come fai nell'altro esempio da una Classe); poi prova a usare l'oggetto mediante quel nuovo nome, ad esempio
Print xxxx.Name

Facci sapere che succede.
Titolo: Re:Nome di un oggetto
Inserito da: kicco - 23 Giugno 2019, 21:59:44
Citazione
poi prova a usare l'oggetto mediante quel nuovo nome,
OK non è possibile!
Ma è la stessa proprietà! e nell'ide la puoi cambiare anche dopo aver istanziato l'oggetto!
 :-\
Titolo: Re:Nome di un oggetto
Inserito da: Gianluigi - 23 Giugno 2019, 22:33:07

Ma è la stessa proprietà! e nell'ide la puoi cambiare anche dopo aver istanziato l'oggetto!
 :-\

Lo sai che non riesco a capire, puoi fare un esempio concreto?
Titolo: Re:Nome di un oggetto
Inserito da: vuott - 24 Giugno 2019, 01:29:39
Ma è la stessa proprietà! e nell'ide la puoi cambiare anche dopo aver istanziato l'oggetto!
Tu fai confusione, ma non è colpa tua.

Nella colonna di destra dell'IDE c'è la scheda chiamata "Proprietà", ed è questo che genera appunto un po' di confusione.
Infatti sono presenti, proprio all'inizio dell'elenco, le definizioni:
- "Class", ma la Classe di appartenenza dell'Oggetto non è una "proprietà" dell'Oggetto medesimo, essendo in vero la "Proprietà" una risorsa della Classe (così come i Metodi e gli Eventi);
- "Name", ed è l'elemento al quale tu fai riferimento. Se però fai attenzione, in realtà questo nome si riferisce alla "variabile" del tipo dell'Oggetto prescelto, che quindi punta a quell'Oggetto.... alla Struttura costitutiva dell'oggetto in questione. Pertanto NON è una proprietà dell'Oggetto. Insomma è come se io scrivessi: Dim abc As Integer: ecco "abc" è quel "Name" che vedi nell'IDE.
-  "Group", ma anche in questo caso il Gruppo degli Eventi non è una Proprietà in senso stretto dell'Oggetto.
Poi vengono gli altri elementi che sono vere e proprie Proprietà dell'Oggetto. Nel caso del Button abbiamo anche la Proprietà ".Name".... che non è il secondo elemento nella scheda dell'IDE (abbiamo già detto che quello è il nome della Variabile del tipo dell'Oggetto prescelto !).
Pertanto, se la variabile che rappresenta l'Oggetto Button, ad esempio, si chiamerà "BT_Quit", l'assegnazione di una stringa di caratteri alla sua Proprietà ".Name", ad esempio:
Codice: [Seleziona]
BT_Quit.Name = "kicco"
è un po' come assegnare all'Oggetto una sorta di etichetta.
Voglio dire che tu NON muti il nome della Variabile che punta alle risorse dell'Oggetto di tipo "Button", che hai voluto creare.

Il nome di una Variabile non è altro che l'alter-ego di una porzione di memoria riservata, la cui prima cella (di tale memoria) è puntata/rappresentata da questo elemento che noi chiamiamo Variabile.
Se tu crei un Oggetto, gli assegni automaticamente una Variabile (esempio: "BT_Quit") che punta alla prima cella di quella porzione di memoria, che così si è venuta a destinare, per "accogliere" tutto quanto (i dati) necessario affinché quell'Oggetto esista.
Se per esempio al Button tu gli assegni un colore di Background.... dove (in quale luogo della memoria) credi sarà scritto il valore del colore da te scelto ? ...all'interno di una sub-struttura della Struttura che costituisce l'impalcatura di ciò che chiamiamo "Oggetto".
L'Oggetto non è altro che una non-piccola porzione della memoria allocata per i dati che l'Oggetto medesimo dovrà avere, nonché i Metodi, etc..

Se vuoi modificare il nome di una Variabile, significa che vuoi... cambiare Variabile, crearne insomma un'altra; e quindi usare, sì, una medesima quantità di memoria, ma allocata altrove all'interno della memoria.

Dunque, il nome della Variabile del tuo Button corrisponderà all'elemento "Name" della scheda nell'IDE di Gambas; INVECE la vera "Proprietà" chiamata ".Name", capace in scrittura e in lettura di contenere un dato di tipo String, sarà in sostanza posta all'interno di quella Variabile (o meglio della porzione di memoria rappresentata dalla Variabile del Button).

...non so se mi spiego, kicco ! 


vedi anche per mera analogia:
https://www.gambas-it.org/wiki/index.php?title=Configurazione,_organizzazione_ed_impostazione_dell%27oggetto_Image_secondo_i_sorgenti_di_Gambas
http://www.gambas-it.org/wiki/index.php?title=Leggere_le_informazioni_di_una_Image_dalle_sue_risorse_dei_sorgenti_di_Gambas
http://www.gambas-it.org/smf/index.php?topic=7084.msg46021#msg46021
Titolo: Re:Nome di un oggetto
Inserito da: kicco - 24 Giugno 2019, 10:12:02
Citazione
...non so se mi spiego, kicco !
Ti sei spiegato molto bene e riflettevo anche su un errore concettuale che ho fatto.
Quando nell'ide pongo un Button nel form, non sto ancora istanziando l'oggetto, sto solo "preparando" il codice per farlo.
È solo nel momento dell'esecuzione che avviene la creazione dell'oggetto e a quel punto il Name dell'oggetto non è più modificabile penso proprio per quello che tu scrivi:
Citazione
Se vuoi modificare il nome di una Variabile, significa che vuoi... cambiare Variabile..
Adesso allora devo capire come cambiare il colore di un button che ho istanziato più di una volta così:
 
Codice: [Seleziona]
 With BT = New Bottone(PictureBox1) As "Tasto"
partendo dalla classe Bottone che ho creato.
Perchè avevo pensato di usare appunto .name per distinguerli!
...e invece...
Grazie ancora Vuott  :-*
 :ciao:
Titolo: Re:Nome di un oggetto
Inserito da: kicco - 24 Giugno 2019, 10:47:12
Forse ho capito!
Titolo: Re:Nome di un oggetto
Inserito da: Gianluigi - 24 Giugno 2019, 10:50:34
Perchè avevo pensato di usare appunto .name per distinguerli!
...e invece...


Questo argomento è già stato affrontato varie volte  :P

Completa questo codice: http://www.gambas-it.org/smf/index.php?topic=7116.msg46096#msg46096

Con:
Codice: [Seleziona]
Private myButton As CButton

Public Sub Form_Open()

  myButton = New CButton(Me) As "Button1"
  myButton.Text = "Pippo"
  myButton.X = 32
  myButton.Y = 32
  myButton = New CButton(Me) As "Button2"
  myButton.Text = "Pluto"
  myButton.X = 166
  myButton.Y = 32

End

Public Sub Button1_Click()

  Dim hCon As Control

  Message.Info("Hai fatto click sul pulsante <b>Button1")
  For Each hCon In Me.Controls
    If hCon.Name = "Button1" Then
      hCon.Background = Color.Green
    Else If hCon.Name = "Button2" Then
      hCon.Background = Color.Blue
    Endif
  Next
 
End

Public Sub Button2_Click()
 
  Message.Info("Hai fatto click sul pulsante <b>Button2")
 
End

Naturalmente si può fare in tanti altri modi, vedi questa discussione:
http://www.gambas-it.org/smf/index.php?topic=4615.msg37507#msg37507
Titolo: Re:Nome di un oggetto
Inserito da: vuott - 24 Giugno 2019, 11:46:58
Perchè avevo pensato di usare appunto .name per distinguerli!
Usare la Proprietà ".Name" per distinguere un Oggetto da un altro, può essere un'opzione.



Completa questo codice: http://www.gambas-it.org/smf/index.php?topic=7116.msg46096#msg46096

Con:
Codice: [Seleziona]
Private myButton As CButton

Public Sub Form_Open()

  myButton = New CButton(Me) As "Button1"
  myButton.Text = "Pippo"
  myButton.X = 32
  myButton.Y = 32
  myButton = New CButton(Me) As "Button2"
  myButton.Text = "Pluto"
  myButton.X = 166
  myButton.Y = 32

End

........

Però kicco assegna un unico Gruppo degli Eventi agli Oggetti creati:
come cambiare il colore di un button che ho istanziato più di una volta così:
 
Codice: [Seleziona]
 With BT = New Bottone(PictureBox1) As "Tasto"
partendo dalla classe Bottone che ho creato.

mentre il tuo esempio assegna uno specifico Gruppo per ciascun Oggetto creato.
Titolo: Re:Nome di un oggetto
Inserito da: Gianluigi - 24 Giugno 2019, 12:13:26
...
mentre il tuo esempio assegna uno specifico Gruppo per ciascun Oggetto creato.

Gruppo? Non capisco as assegna il nome per gli eventi che diventa automaticamente il nome dell'oggetto.  :-\
Titolo: Re:Nome di un oggetto
Inserito da: vuott - 24 Giugno 2019, 12:57:26
Gruppo? Non capisco as assegna il nome per gli eventi che diventa automaticamente il nome dell'oggetto.

Sì, insomma il nome per gli Eventi, sotto il quale possono essere raggruppati anche più Oggetti.

Devo dire che io non sapevo che il nome per gli Eventi diventasse anche automaticamente il nome dell'oggetto.   :-\
Titolo: Re:Nome di un oggetto
Inserito da: kicco - 24 Giugno 2019, 13:41:14
Citazione
Devo dire che io non sapevo che il nome per gli Eventi diventasse anche automaticamente il nome dell'oggetto.   :-\
Anch'io lo scopro or ora! :-[
Titolo: Re:Nome di un oggetto
Inserito da: Gianluigi - 24 Giugno 2019, 14:20:03
@vuott, @kicco,
la mia è stata una scoperta casuale, altrimenti come farebbe il codice postato a funzionare?

Circa Group per gli oggetti ereditati (creati col codice) dovrebbe essere Last, ma sono il meno adatto a parlarne in quanto non lo uso mai  :-[
Titolo: Re:Nome di un oggetto
Inserito da: Gianluigi - 24 Giugno 2019, 14:54:54
Mi sa che Last e Group sono cose diverse.  ;D
E a proposito di Last si può fare qualcosa del genere:
Codice: [Seleziona]
Private hButton[2] As Button

Public Sub Form_Open()

  hButton[0] = New Button(Me) As "MyButtons"
  hButton[0].Text = "Blue"
  hButton[0].Height = 32
  hButton[0].Width = 120
  hButton[0].X = 32
  hButton[0].Y = 32

  hButton[1] = New Button(Me) As "MyButtons"
  hButton[1].Text = "Green"
  hButton[1].Height = 32
  hButton[1].Width = 120
  hButton[1].X = 160
  hButton[1].Y = 32
  For Each obj As Object In Me.Controls
    obj.Picture = Picture["icon:/small/book"]
  Next
 

End

Public Sub MyButtons_Click()

  Select Last.Text
    Case "Blue"
      Last.Background = Color.Blue
    Case "Green"
      Last.Background = Color.Green
  End Select

End
Titolo: Re:Nome di un oggetto
Inserito da: vuott - 24 Giugno 2019, 15:04:01
Sì, anche io volevo suggerire a kicco l'uso di "Last".

(https://static.bakeca.it/immagini/45a/antiquariato-collezionismo-palermo-detersivo-in-polvere-last-45a171367b15cc1ef21ab5b1d82882b5.jpg)
Titolo: Re:Nome di un oggetto
Inserito da: kicco - 24 Giugno 2019, 15:28:33
 :D
Titolo: Re:Nome di un oggetto
Inserito da: Gianluigi - 24 Giugno 2019, 15:31:12
@vuott,
mi sa tanto che ti devi aggiornare, kicco ha la lavastoviglie  :P
Titolo: Re:Nome di un oggetto
Inserito da: kicco - 24 Giugno 2019, 18:33:54
È  che LAST non lo posso usare. Anche quello al limone verde!
Allego il progetto.
Il dato che mi fa cambiare il colore del Tasto1 o Tasto2 ecc è un dato che arriva dall'esterno e non è prodotto dall'interazione dell'utente col programma. Non c'è pressione di tasti.Quindi niente LAST
Nell'esempio ho utilizzato Button1 per simulare l'evento.
Così però non funziona.

Spero che così sia più chiara la mia esigenza!
Sempre grazie!
 :-*
Titolo: Re:Nome di un oggetto
Inserito da: Gianluigi - 24 Giugno 2019, 19:07:35
Un romano ti chiederebbe se "sei de coccio".
Non l'ho già spiegato con rimando anche a una discussione, avevi anche scritto di aver capito...
Ti allego il programma corretto (si fa per dire) che fine ha fatto CButton con Super?

Ciao testone  :)
Titolo: Re:Nome di un oggetto
Inserito da: kicco - 24 Giugno 2019, 20:16:47
Citazione
che fine ha fatto CButton con Super?
Ho presentato una versione ridotta che usa il componente standard!
Adesso devo capire quel pezzo che hai aggiunto!!!
Grazie!