Gambas-it

Gambas3 => Programmazione => Topic aperto da: vuott - 01 Settembre 2016, 15:23:53

Titolo: Moduli: Simboli, riferimento e significato di statico
Inserito da: vuott - 01 Settembre 2016, 15:23:53
Per facilitare future ricerche questa discussione è stata divisa, ne è stato cambiato il titolo dell'oggetto, per comprendere a cosa si riferisce vedere questa discussione (http://www.gambas-it.org/smf/index.php?topic=3714.msg34015#msg34015)

Con riferimento alla parola chiave Me ti segnalo questa pagina della nella nostra WIKI:
(cerca al suo interno il paragrafo: ME - Riferimento a se stesso)
http://www.gambas-it.org/wiki/index.php?title=Gli_Oggetti_e_le_Classi
laddove si evidenzia che solo per le Classi "si può avere un riferimento allo stesso oggetto con ME.".
Titolo: Re:Re:Gridview riottosa
Inserito da: Gianluigi - 01 Settembre 2016, 16:34:48
Rimane il fatto che secondo logica in un modulo non si dovrebbero scatenare gli eventi, guisto? e invece:

Poniamo questo nella classe del form:
Codice: [Seleziona]
Public Sub Form_Open()
 
  Mporca.Miseria

End

Quindi creiamo un modulo nominandolo "Mporca" e inseriamo questo codice:
Codice: [Seleziona]
Private hMappaPesi As GridView
 
Public Sub Miseria()
 
  Dim i, e As Integer 
 
  hMappaPesi = New GridView(FMain) As "MappaPesi"
 
  With hMappaPesi
    .Header = 3
    .W = 410
    .h = 200
    .X = (FMain.W - .W) / 2
    .Y = (FMain.H - .H) / 3
    .Rows.Count = 10
    .Columns.Count = 3
    .Columns.Width = 120
    .Columns[0].Text = "Primo Dato"
    .Columns[1].Text = "Secondo Dato"
    .Columns[2].Text = "Terzo Dato"
    For i = 0 To 9
      For e = 0 To 2
        hMappaPesi[i, e].Text = "Dato in R" & CStr(i + 1) & "C" & CStr(e + 1)
      Next
    Next
   
  End With
 
End

Public Sub MappaPesi_Arrange() 
 
  Message("Cosa succede. Sono in un modulo e sto funzionando come in una classe!?")
 
End

 :ciao:
Titolo: Re:Re:Gridview riottosa
Inserito da: vuott - 01 Settembre 2016, 19:04:28
Rimane il fatto che secondo logica in un modulo non si dovrebbero scatenare gli eventi, guisto? e invece:
.......
......
Ottima osservazione, che richiede una precisazione.

Un Modulo è incapace di sollevare un proprio Evento mediante la parola chiave Event, poiché la risorsa dell'Evento non gli appartiene. Ciò però non impedisce che al suo interno possano essere sollevati Eventi appartenenti a delle Classi.
Ciò spiega perché hai potuto sollevare l'evento della GridView, la quale non è, né appartiene al Modulo (cha fa da mero... "ospitante"), ma è invece essa un Oggetto appartenente (come "individuo che sembra esistere in concreto", utilizzabile) di una Classe, e di questa esso partecipa.
Titolo: Re:Re:Gridview riottosa
Inserito da: Gianluigi - 02 Settembre 2016, 11:16:41

Un Modulo è incapace di sollevare un proprio Evento mediante la parola chiave Event, poiché la risorsa dell'Evento non gli appartiene. Ciò però non impedisce che al suo interno possano essere sollevati Eventi appartenenti a delle Classi.
Ciò spiega perché hai potuto sollevare l'evento della GridView, la quale non è, né appartiene al Modulo (cha fa da mero... "ospitante"), ma è invece essa un Oggetto appartenente (come "individuo che sembra esistere in concreto", utilizzabile) di una Classe, e di questa esso partecipa.

Giusto un modulo non può essere istanziato, non può creare il proprio osservatore ecc. ecc. quindi può solo “partecipare” agli eventi pubblici di altre classi.
Questo, del poter partecipare agli eventi altrui, non lo avevo mai considerato, ho sempre usato i moduli per ordinare il codice in blocchi omogenei di metodi per rispondere alle richieste provenienti dalle classi, la classe che sfrutta il modulo, mai avrei notato di poter fare il contrario.
;D Pertanto devo proprio ringraziare il silente Top Fuel per il suo indicibile errore :P

 :ciao: :ciao:
Titolo: Re:Re:Gridview riottosa
Inserito da: vuott - 02 Settembre 2016, 12:11:29
Giusto un modulo non può essere istanziato, non può creare il proprio osservatore ecc.
A mio modesto giudizio, per comprendere a pieno il concetto di "istanza" di una Classe, è opportuno, come si fa in filosofia, comprendere l'etimo della predetta parola, che proveniendo dal latino "in + sto", vuol significare stare in, e quindi "stare nel (mondo)", starci, "esistere nella (realtà)".
Una Classe in quanto Modello non esiste nel/sul mondo, ossia concretamente, è semplicemente un predicato astratto.
Se la Classe si fa concreta, si in-stanzia, ossia si in-pone nella realtà concreta del programma, diventa gestibile in modo effettivo, virtualmente tangibile: diventa un Oggetto. L'Oggetto si pone, sta nel mondo del programma informatico con una sua individualità definita e condizionata da funzionalità e caratteristiche che rimandano necessariamente alla sua Classe di appartenenza.
Titolo: Re:Re:Gridview riottosa
Inserito da: kicco - 02 Settembre 2016, 14:20:03
Citazione
A mio modesto giudizio, per comprendere a pieno il concetto di "istanza" di una Classe...
Bella lezione Vuott!
Questo argomento, che dovrebbe essere posto prima di tutte le lezioni, permette di comprendere (e quindi capire), in modo figurato la costruzione astratta della programmazione a oggetti!
È quello che cerco sempre e trovo poco poco.
 :-*
Titolo: Re:Re:Gridview riottosa
Inserito da: vuott - 02 Settembre 2016, 14:48:19
Questo argomento, che dovrebbe essere posto prima di tutte le lezioni, permette di comprendere (e quindi capire), in modo figurato la costruzione astratta della programmazione a oggetti!
È quello che cerco sempre e trovo poco poco.
Sante parole !   (http://forum.ubuntu-it.org/images/smilies/sisi.gif)

Titolo: Re:Re:Gridview riottosa
Inserito da: Top Fuel - 03 Settembre 2016, 16:09:21
Se non scateno un putiferio non sono contento. :D :D
Ho capito, devo modificare un pò di roba. :)
Titolo: Re:Re:Gridview riottosa
Inserito da: vuott - 03 Settembre 2016, 19:32:28
Se non scateno un putiferio non sono contento. :D :D
Devo dire che sulla questione relativa alla presunta incapacità di un Modulo di avere propri Oggetti, rappresentati da rispettive variabili, io devo fare marcia indietro.   :-[

Parto da questa esatta precisazione di Gianluigi:
Gambas ti sta dicendo che cerca un contenitore e invece riceve una classe.
In effetti, Gambas non dice che la parola Me non è applicabile ad un Modulo, bensì che hai tentato - scrivendo all'interno di Modulo - di impostare come "Parent " della GridView un Me che non è e non si riferisce ad un Contenitore: ma che è il Modulo medesimo.

Dunque va ricordato e sottilineato che la parola Me può riferirsi comunque anche ad un Modulo.

Questione degli Oggetti di Modulo:
ho dovuto elimare le righe ove affermavano che un Modulo è incapace di istanziarsi come Oggetto, rappresentato da una propria variabile.
Infatti propongo l'esempio che segue.

Nel Modulo secondario, chiamato Module1, scriviamo questo codice:
Codice: [Seleziona]
Public Function Prova_1(n As Integer) As Integer
 
  Dim a As Integer
 
    a = Me.Prova_2(n)   '  Utilizzo anche la parola chiave "Me" ! ...che si riferisce dunque al Modulo secondario "Module1"
 
  Return a + 100
 
End


Public Function Prova_2(c As Integer) As Integer
 
  Return c * 10
 
End

In un Modulo (si può ovviamente utilizzare anche un'apposita Classe) principale poniamo questo codice:
Codice: [Seleziona]
Public Sub Main()

  Dim mn1 As New Module1   ' Creiamo un "Oggetto" del Modulo chiamato "Module1" '
  Dim i As Integer

   i = mn1.Prova_1(10)

  Print i

End

Funziona tutto.
Titolo: Re:Re:Gridview riottosa
Inserito da: Top Fuel - 03 Settembre 2016, 20:14:54
Prova a proporre (da bravo ambasciatore) questa cosa nella M.L. e vediamo cosa ti dicono. :)
Titolo: Re:Re:Gridview riottosa
Inserito da: vuott - 03 Settembre 2016, 20:28:00
Sì, ci stavo pensando anch'io: la questione va chiarita bene.
Titolo: Re:Re:Gridview riottosa
Inserito da: Gianluigi - 03 Settembre 2016, 20:40:48
Sì, ci stavo pensando anch'io: la questione va chiarita bene.

Fermi tutti, qui si sta facendo confusione, il codice che hai postato non dimostra affatto l'istanziazione del modulo.
Perché un oggetto sia istanziato deve poter rispondere all'istanziazione che si ottiene con la sub _new dell'oggetto stesso.
Titolo: Re:Re:Gridview riottosa
Inserito da: vuott - 03 Settembre 2016, 20:57:35
il codice che hai postato non dimostra affatto l'istanziazione del modulo.
Perché un oggetto sia istanziato deve poter rispondere all'istanziazione che si ottiene con la sub _new dell'oggetto stesso.
Quindi quanto affermato precedentemente era giusto ?
Titolo: Re:Re:Gridview riottosa
Inserito da: Gianluigi - 03 Settembre 2016, 21:02:28

Quindi quanto affermato precedentemente era giusto ?

Secondo me si.
Si potrebbe chiedere a Minisini come mai puoi ottenere un riferimento ad un modulo con la procedura dell'istanziazione, che se non erro è pratica non corretta trattandosi di classe statica.
Titolo: Re:Re:Gridview riottosa
Inserito da: Gianluigi - 04 Settembre 2016, 14:17:56
Sapete cosa vi dico? Che non ci capisco più niente, credevo che... e invece...

Codice: [Seleziona]
Public Sub Main()

  Dim hclasse As New Class1("Ma come!")

End
E in Class1:
Codice: [Seleziona]
Create Static

Public Sub _new(sPippo As String)
 
  Print sPippo
 
End
Titolo: Re:Re:Gridview riottosa
Inserito da: vuott - 04 Settembre 2016, 15:15:54
Sapete cosa vi dico? Che non ci capisco più niente, credevo che... e invece...

     :rotfl:



" il mondo si è fermato io ora scendo qui
   prosegui tu, ...
"

(Gino Paoli -  Ti lascio una canzone)




Titolo: Re:Re:Gridview riottosa
Inserito da: Gianluigi - 04 Settembre 2016, 15:47:53
Va bene ridere che fa buon sangue, ma poi come sintetizziamo il tutto?
Intendi scriverne a Minisini come avevi pensato?
Titolo: Re:Re:Gridview riottosa
Inserito da: Gianluigi - 04 Settembre 2016, 23:10:22
Potrei stare per dire parecchie scemenze:
Il modulo a detta dello stesso Minisini è una classe statica senza eventi e in effetti se noi proviamo a inserirgli un evento questo si limita a non funzionare o da anche errore.
Una classe statica è una classe che si istanzia da sola.
Anche i Form sono classi statiche con la possibilità di ricevere parametri opzionali, il che vuol dire che in pratica possono essere istanziati.
Potrebbe essere che, per semplificare, Minisini si sia limitato ad aggiungere alle classi statiche (moduli compresi) l'auto istanziazione e, a togliere gli eventi ai moduli e stop.
Questo spiegherebbe perché sia i moduli che le classi statiche possono essere istanziati.
In verità quella dei moduli non può essere che una falsa istanziazione in quanto, come ho già detto, non avendo l'evento _new (il famoso costruttore) penso si limiti solo ad accettare nomi alternativi che fanno capo sempre a lui, però questa è solo un'illazione non sperimentata, magari _new è solo nascosto e invece crea nuove istanze.  :-\

 :ciao: :ciao:
Titolo: Re:Re:Gridview riottosa
Inserito da: Gianluigi - 05 Settembre 2016, 11:49:35
È tutto qui, in queste (http://gambaswiki.org/wiki/doc/object-model) prime frasi al punto 1 e più precisamente questa frase:

Codice: [Seleziona]
A static class cannot be instantiated: it would create an object with no dynamic variable, which is useless.
Minisini dice che istanziare una Classe statica od un Modulo sarebbe inutile in quanto creeremmo un oggetto senza variabile dinamica.
Caro Vuott potresti essere così cortese di ripartire con le spiegazioni filosofiche e farci capire cosa qui si intende per variabile dinamica?

 :ciao: :ciao:
Titolo: Re:Re:Gridview riottosa
Inserito da: vuott - 05 Settembre 2016, 16:06:32
.....Mistero del Cosmo, mistero dell'Universo !   

(http://www.visionealchemica.com/wp-content/uploads/2013/02/sigillo-salomone.jpg)
Titolo: Re:Re:Gridview riottosa
Inserito da: kicco - 05 Settembre 2016, 16:46:46
 sanmidi
Proteggici tu!
Titolo: Re:Re:Gridview riottosa
Inserito da: Gianluigi - 15 Febbraio 2017, 16:43:30
I moduli altri non sono che delle classi con i simboli statici.
Per simboli si intende Variabili, Proprietà, Metodi, Costanti, Eventi.
I simboli in un modulo non possono essere dinamici.
Allego il test che mi ha gentilmente inviato Tobias Boerge per spiegarmelo in questa discussione (http://gambas.8142.n7.nabble.com/dynamic-created-Menus-tp58398.html).
Titolo: Re:Re:Gridview riottosa
Inserito da: vuott - 15 Febbraio 2017, 21:04:43
La questione fondamentale risiede nella differenza in tale contesto fra "Statico" e "Dinamico".
Data l'importanza dell'argomento Boege avrebbe dovuto spendere qualche parola in più per specificare e chiarire il significato di quelle due accezioni in Gambas.

Ad ogni modo mi pare che il nucleo del suo ragionamento sia il seguente:
" Now, a module is a normal class in which every symbol is implicitly madestatic by the compiler.
  You can still create objects from a module but thatisn't useful because you don't have dynamic symbols
  in a module. You will just end up with multiple objects that all reference the same data.
"
combinato con queste righe del suo esempio:
Codice: [Seleziona]
Dim x As New Mod
  ......
  Mod.A = 12
  x.Func()
  Mod.Func()

Si ha dunque che è possibile creare regolarmente Istanze individuali, singoli Oggetti di un Modulo mediante la parola-chiave "New"; ma i Simboli delle Istanze di un Modulo non sono suscettibili di diretta lettura né di assegnazione diretta di valori, restando questa caratteristica una prerogativa del Modulo, del quale quegli Oggetti sono Istanze.
In ciò si sostanzia l'affermazione di Boege per cui la creazione di Istanze individuali di un Modulo "that isn't useful", ossia non possiede alcuna utilità pratica.
Provate infatti ad aggiungere e provare queste righe:
Codice: [Seleziona]
......
   x.A = 1990
  Print x.A
  Mod.Func()
  ......


Titolo: Re:Re:Gridview riottosa
Inserito da: Gianluigi - 15 Febbraio 2017, 21:14:21
Tutto giusto quello che dici, ma io personalmente, avendo sempre usato normalmente i moduli per routine di appoggio non avevo mai notato sostanziali differenze con le classi.
Invece grazie a Tobias ora è chiaro che le differenze ci sono e come, basta cambiare il modulo con una classe e provare lo stesso codice per rendersi conto di quello che invece io non riuscivo a capire.

Per essere più chiari copiate in Class1 il codice del modulo e cambiate così:
Codice: [Seleziona]
Public Sub Main()
  Dim cl As New Class1
  Dim x As New Class1

  ' Show that Mod and x share the same (static) variable A:
  cl.A = 10
  x.Func()
  cl.A = 12
  x.Func()
  cl.Func()

  ' Dump all symbols (they show up as static)
  DumpSymbols(x)
End
Titolo: Re:Re:Gridview riottosa
Inserito da: Gianluigi - 15 Febbraio 2017, 22:05:44
Ritiro quanto ho detto poc'anzi, la mia comprensione è di tipo pendolare nel senso che viene ma poi va.  :-[

Ma se i metodi nei moduli sono statici, potete spiegarmi perché il secondo Print Module1.myAdd() non restituisce 24?

Va beh ora me ne vado a dormire vediamo se la notte porta consiglio...
Titolo: Re:Re:Gridview riottosa
Inserito da: vuott - 15 Febbraio 2017, 23:08:47
perché il secondo Print Module1.myAdd() non restituisce 24?

...perché, a mio parere, la Staticità del Modulo si afferma - come ho lasciato implicitamente intendere nel mio precedente intervento - più in relazione alle sue ipotetiche Istanze individuali (che - come ormai sappiamo - risultano essere inutili), che alla presunta capacità di conservare i valori precedentemente assegnati.
Anzi, con riferimento a tale capacità si può anche aggiungere, richiamando una norma più generale che ben conosciamo, che la Staticità di un Simbolo di un Modulo sussiste solo qualora la sua Visibilità sia Pubblica.


Titolo: Re:Re:Gridview riottosa
Inserito da: Gianluigi - 16 Febbraio 2017, 12:31:42
La notte più che consiglio a me, ha portato in dono un'ampia ed esaustiva spiegazione (http://gambas.8142.n7.nabble.com/dynamic-created-Menus-td58398i20.html) di Tobias.
In pratica conferma quanto già diceva Vuott poc'anzi e cioè; nel mio esempio il metodo MyAdd() calcola solo la somma dei suoi argomenti e non accede ad alcuna variabile (statica).

Come suggeritomi da Vuott appena ho un po di tempo vedo come dividere coerentemente questa discussione in modo che possa essere più utile a future ricerche, sperando che nel frattempo il buon Vuott ne faccia una guida per la wiki.  :)

 :ciao:
Titolo: Re:Re:Gridview riottosa
Inserito da: vuott - 16 Febbraio 2017, 15:08:35
.... dei suoi argomenti e non accede ad alcuna variabile (statica).
...e gli argomenti (o meglio in questo caso: i "parametri") di una funzione non hanno una "visibilità" PubblicaGlobale.