<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://www.gambas-it.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Metodi_nascosti%3A_New%28%29_e_Free%28%29</id>
	<title>Metodi nascosti: New() e Free() - Cronologia</title>
	<link rel="self" type="application/atom+xml" href="https://www.gambas-it.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Metodi_nascosti%3A_New%28%29_e_Free%28%29"/>
	<link rel="alternate" type="text/html" href="https://www.gambas-it.org/wiki/index.php?title=Metodi_nascosti:_New()_e_Free()&amp;action=history"/>
	<updated>2026-10-23T06:31:56Z</updated>
	<subtitle>Cronologia della pagina su questo sito</subtitle>
	<generator>MediaWiki 1.39.15</generator>
	<entry>
		<id>https://www.gambas-it.org/wiki/index.php?title=Metodi_nascosti:_New()_e_Free()&amp;diff=42122&amp;oldid=prev</id>
		<title>Vuott il 14:35, 22 ago 2025</title>
		<link rel="alternate" type="text/html" href="https://www.gambas-it.org/wiki/index.php?title=Metodi_nascosti:_New()_e_Free()&amp;diff=42122&amp;oldid=prev"/>
		<updated>2025-08-22T14:35:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;it&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Versione meno recente&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Versione delle 08:35, 22 ago 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Riga 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Riga 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ogni '''Oggetto''' ha alcuni Metodi che possono essere utilizzati tranquillamente, e che corrispondono a precise fasi della vita dell'Oggetto medesimo. &amp;lt;SUP&amp;gt;&amp;amp;#091;[[#Note|&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Nota &lt;/del&gt;1]]&amp;amp;#093;&amp;lt;/sup&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ogni '''Oggetto''' ha alcuni Metodi che possono essere utilizzati tranquillamente, e che corrispondono a precise fasi della vita dell'Oggetto medesimo. &amp;lt;SUP&amp;gt;&amp;amp;#091;[[#Note|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;nota &lt;/ins&gt;1]]&amp;amp;#093;&amp;lt;/sup&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;In Gambas, per tutti gli Oggetti base, sono presenti alcuni Metodi, che di norma non vengono presi in considerazione e che, in effetti, non vengono neppure dichiarati durante la costruzione di un Oggetto.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;In Gambas, per tutti gli Oggetti base, sono presenti alcuni Metodi, che di norma non vengono presi in considerazione e che, in effetti, non vengono neppure dichiarati durante la costruzione di un Oggetto.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l27&quot;&gt;Riga 27:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Riga 27:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;='''_new()'''  - Il Costruttore=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;='''_new()'''  - Il Costruttore=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Il ''Costruttore'' &amp;quot;_New()&amp;quot;  è un Metodo nascosto che viene eseguito al momento della costruzione dell'Oggetto (come fosse un Evento speciale della Classe a cui appartiene).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Il ''Costruttore'' &amp;quot;_New()&amp;quot;  è un Metodo nascosto che viene eseguito al momento della costruzione dell'Oggetto (come fosse un Evento speciale della Classe a cui appartiene).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;BR&amp;gt;Esso può ricevere argomenti passati all'atto della creazione dell'Oggetto della Classe specifica mediante la parola-chiave &amp;quot;New&amp;quot;. &amp;lt;SUP&amp;gt;&amp;amp;#091;[[#Note|&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Nota &lt;/del&gt;2]]&amp;amp;#093;&amp;lt;/sup&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;BR&amp;gt;Esso può ricevere argomenti passati all'atto della creazione dell'Oggetto della Classe specifica mediante la parola-chiave &amp;quot;New&amp;quot;. &amp;lt;SUP&amp;gt;&amp;amp;#091;[[#Note|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;nota &lt;/ins&gt;2]]&amp;amp;#093;&amp;lt;/sup&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Come già detto, il Metodo nascosto '''[https://gambaswiki.org/wiki/dev/api/cat/special/_new _New()]''' si comporta come un Evento: esso - se previsto in codice - si solleva all'atto della creazione di una Classe.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Come già detto, il Metodo nascosto '''[https://gambaswiki.org/wiki/dev/api/cat/special/_new _New()]''' si comporta come un Evento: esso - se previsto in codice - si solleva all'atto della creazione di una Classe.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Vuott</name></author>
	</entry>
	<entry>
		<id>https://www.gambas-it.org/wiki/index.php?title=Metodi_nascosti:_New()_e_Free()&amp;diff=42121&amp;oldid=prev</id>
		<title>Vuott: Creata pagina con &quot;Ogni '''Oggetto''' ha alcuni Metodi che possono essere utilizzati tranquillamente, e che corrispondono a precise fasi della vita dell'Oggetto medesimo. &lt;SUP&gt;&amp;#091;#Note|Nota...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.gambas-it.org/wiki/index.php?title=Metodi_nascosti:_New()_e_Free()&amp;diff=42121&amp;oldid=prev"/>
		<updated>2025-08-22T14:34:11Z</updated>

		<summary type="html">&lt;p&gt;Creata pagina con &amp;quot;Ogni &amp;#039;&amp;#039;&amp;#039;Oggetto&amp;#039;&amp;#039;&amp;#039; ha alcuni Metodi che possono essere utilizzati tranquillamente, e che corrispondono a precise fasi della vita dell&amp;#039;Oggetto medesimo. &amp;lt;SUP&amp;gt;[#Note|Nota...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nuova pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Ogni '''Oggetto''' ha alcuni Metodi che possono essere utilizzati tranquillamente, e che corrispondono a precise fasi della vita dell'Oggetto medesimo. &amp;lt;SUP&amp;gt;&amp;amp;#091;[[#Note|Nota 1]]&amp;amp;#093;&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Gambas, per tutti gli Oggetti base, sono presenti alcuni Metodi, che di norma non vengono presi in considerazione e che, in effetti, non vengono neppure dichiarati durante la costruzione di un Oggetto.&lt;br /&gt;
&amp;lt;BR&amp;gt;Dato che ogni Oggetto deriva in ogni caso dalla Classe base '''Object''' di Gambas, anche queste Proprietà ''nascoste'' vengono definite nelle nuove sotto-Classi.&lt;br /&gt;
&amp;lt;BR&amp;gt;L'utilità di questi Metodi è enorme, dato che tramite queste è possibile modificare le proprietà di base dell'oggetto stesso, passare parametri, definire condizioni di funzionamento, chiudere file aperti, rilasciare risorse, ecc. Questa particolarità è inclusa sia nelle Classi ''dinamiche'' che in quelle ''statiche''.&lt;br /&gt;
&lt;br /&gt;
I Metodi ''nascosti'' più importanti, sono:&lt;br /&gt;
 Public Sub &amp;lt;FONT color=red&amp;gt;'''_new()'''&amp;lt;/font&amp;gt;&lt;br /&gt;
e&lt;br /&gt;
 Public Sub &amp;lt;FONT color=red&amp;gt;'''_free()'''&amp;lt;/font&amp;gt;&lt;br /&gt;
rispettivamente:&lt;br /&gt;
&lt;br /&gt;
* _new(): creazione dell'oggetto;&lt;br /&gt;
* _free(): distruzione dell'oggetto;&lt;br /&gt;
&lt;br /&gt;
* _new() può essere usato per passare dei parametri all'oggetto, proprio nella fase di creazione (non di apertura), e può essere utilizzato anche per creare oggetti all'interno di una ''Form''.&lt;br /&gt;
* _free() viene chiamato giusto nella fase finale di eliminazione dell'oggetto dalla memoria. Può essere utilizzato, ad esempio, per terminare un ''timer'' (se si verifica un errore), oppure per chiudere un'attività, a prescindere dal resto.&lt;br /&gt;
&lt;br /&gt;
Queste due funzioni, dunque, sono sempre e comunque chiamate (indipendentemente se dichiarate esplicitamente nel codice o meno) da Gambas, quando l'oggetto viene creato e distrutto, anche se non sono presenti nel codice dell'oggetto, perché esistono comunque nella classe base di tutti gli oggetti creati in Gambas (''Object'' ).&lt;br /&gt;
&lt;br /&gt;
L'Oggetto deve essere esplicitamente ''creato'', ovvero ''fornita sufficiente memoria per contenerlo'', poi deve essere chiamato il suo costruttore. In Gambas questo procedimento è implicito con l'uso dell'istruzione NEW. Tale istruzione, infatti, provoca prima la creazione in memoria dell'Oggetto, poi esegue il suo costruttore, in tutti i casi il metodo nascosto &amp;quot;_new()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inoltre, ogni oggetto prevede anche un metodo distruttore, che in gambas viene assunto da un altro metodo nascosto _free().&lt;br /&gt;
&amp;lt;BR&amp;gt;Gambas infine chiama automaticamente &amp;quot;_free()&amp;quot; e &amp;quot;_delete()&amp;quot;, quando l'Oggetto non viene più usato.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
='''_new()'''  - Il Costruttore=&lt;br /&gt;
Il ''Costruttore'' &amp;quot;_New()&amp;quot;  è un Metodo nascosto che viene eseguito al momento della costruzione dell'Oggetto (come fosse un Evento speciale della Classe a cui appartiene).&lt;br /&gt;
&amp;lt;BR&amp;gt;Esso può ricevere argomenti passati all'atto della creazione dell'Oggetto della Classe specifica mediante la parola-chiave &amp;quot;New&amp;quot;. &amp;lt;SUP&amp;gt;&amp;amp;#091;[[#Note|Nota 2]]&amp;amp;#093;&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Come già detto, il Metodo nascosto '''[https://gambaswiki.org/wiki/dev/api/cat/special/_new _New()]''' si comporta come un Evento: esso - se previsto in codice - si solleva all'atto della creazione di una Classe.&lt;br /&gt;
&amp;lt;BR&amp;gt;In esso si possono definire e impostare i valori base e le proprietà dell'Oggetto, e questo anche se è un Oggetto grafico (es. una ''Form'' ).&lt;br /&gt;
&lt;br /&gt;
L'istruzione &amp;quot;_new()&amp;quot; viene sempre eseguita, sia negli oggetti statici, che negli altri, solo che verrà eseguita esclusivamente alla prima chiamata di un qualsiasi loro Metodo.&lt;br /&gt;
&lt;br /&gt;
Per fare un esempio, la classe '''Form''' non accetta di norma alcun parametro, ma vediamo come è possibile modificare questa impostazione in modo tale, ad esempio, da potergli passare un array di stringhe:&lt;br /&gt;
&lt;br /&gt;
Creiamo una '''Form''', e apriamo l'editor di testo per modificare il codice della '''Form''', e scriviamo le istruzioni seguenti:&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
  '''PRIVATE $arr AS String[]'''&lt;br /&gt;
  ...&lt;br /&gt;
  ...&lt;br /&gt;
  '''PUBLIC SUB _new( arr AS String[] )'''&lt;br /&gt;
    ...&lt;br /&gt;
    '''$arr = arr'''&lt;br /&gt;
    ...  &lt;br /&gt;
  '''END'''&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Cosa abbiamo ottenuto? Bè, nulla di particolare... abbiamo solo detto a Gambas che la '''Form''' ora accetta un parametro, di tipo '''String[]''' !&lt;br /&gt;
&lt;br /&gt;
Questa possibilità è solo permessa attraverso questo metodo nascosto, altrimenti la cosa non sarebbe stata fattibile, se non attraverso metodi poco ortodossi (come, ad esempio, delle variabili globali), e questo permette di condizionare enormemente un oggetto.&lt;br /&gt;
Se, come da esempio, salviamo il parametro in una variabile privata della classe (nell'esempio: $arr), possiamo poi gestire i suoi dati all'interno della classe, modificarli e, magari restituirli alla chiusura della '''Form'''.&lt;br /&gt;
Un'altra ottima caratteristica di questo metodo, è il fatto che il suddetto viene sempre e comunque invocato alla creazione della classe, prima di qualunque altro, per cui rende possibile condizionare totalmente la gestione della classe stessa; nessun evento e nessun'altra funzione sarà chiamata o attivata, se non dopo l'esecuzione del Metodo nascosto &amp;quot;_new()&amp;quot; (il Costruttore!).  &amp;lt;SUP&amp;gt;&amp;amp;#091;[[#Note|nota 3]]&amp;amp;#093;&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Non esistono limitazioni sulla posizione del metodo all'interno del codice, ma, se presente, verrà comunque invocato.&lt;br /&gt;
&lt;br /&gt;
L'unica cosa da tener presente è che, data l'inerenza dalla classe base '''Object''', e da eventuali altre, verranno chiamati prima i metodi '''_new()''' delle classi superiori, partendo da quella più in alto, fino ad arrivare alla nostra (come per l'esempio).&lt;br /&gt;
Eventuali parametri, già previsti nelle classi superiori, verranno caricati prima di quelli della nostra classe.&lt;br /&gt;
E' anche da ricordare che l'elenco dei parametri passati alla nostra classe deve comprendere anche quelli delle classi superiori, e il loro posizionamento deve seguire la logica: da destra verso sinistra, ovvero la prima che sarà letta e utilizzata è la prima a destra.&lt;br /&gt;
&lt;br /&gt;
Come esempio, costruiamo una classe MyButton, derivata dalla classe base '''Button''' di Gambas.&lt;br /&gt;
&lt;br /&gt;
Tramite l'IDE di Gambas, creiamo una classe MyButton, quindi apriamo l'editor per modificarne il codice:&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
  '''INHERITS Button'''&lt;br /&gt;
  ...&lt;br /&gt;
  '''PUBLIC SUB _new( etichetta AS String )'''  'passiamo l'etichetta che verrà impostata come testo del pulsante&lt;br /&gt;
    ...&lt;br /&gt;
    WITH '''ME'''&lt;br /&gt;
      .Text = '''etichetta'''&lt;br /&gt;
    END WITH&lt;br /&gt;
    ...&lt;br /&gt;
  '''END'''&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
A questo punto, per utilizzare l'oggetto MyButton, è necessario il codice seguente:&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
  PUBLIC SUB CreaMyButton()&lt;br /&gt;
    ...&lt;br /&gt;
    '''DIM MyBtn AS MyButton'''&lt;br /&gt;
    ...&lt;br /&gt;
    '''MyBtn = NEW MyButton(&amp;quot;OK&amp;quot;, hForm)'''&lt;br /&gt;
    ...&lt;br /&gt;
  END&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Come è possibile capire dall'esempio, nella funzione &amp;quot;CreaMyButton()&amp;quot;, viene definito un oggetto MyBtn di tipo MyButton (la nostra classe), e nella sua creazione vengono passati due parametri: la stringa &amp;quot;OK&amp;quot; e hForm. Il primo rappresenta l'etichetta da stampare sul pulsante, il secondo il riferimento all'oggetto contenitore (una Form). E' da notare la posizione dei due parametri, in cui nel primo posto viene passata l'etichetta, nel secondo il riferimento al contenitore; nella creazione della classe MyButton, come prima cosa viene creata la classe base '''Button''', a cui verrà passato il riferimento alla '''Form''' (il secondo parametro), quindi verrà creata la classe derivata MyButton, a cui verrà passata l'etichetta che abbiamo definito come parametro nel metodo '''_new()''' (primo parametro).&lt;br /&gt;
&lt;br /&gt;
Con questa logica è anche possibile definire parametri opzionali ('''OPTIONAL'''), magari con valori di default che verranno impostati se non presenti nella creazione dell'oggetto:&lt;br /&gt;
&lt;br /&gt;
Esempio:&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
  '''INHERITS Button'''&lt;br /&gt;
  ...&lt;br /&gt;
  '''PUBLIC SUB _new( OPTIONAL etichetta AS String = &amp;quot;OK&amp;quot; )'''  'se non passata, l'etichetta sarà impostata a &amp;quot;OK&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    WITH '''ME'''&lt;br /&gt;
      .Text = '''etichetta'''&lt;br /&gt;
    END WITH&lt;br /&gt;
    ...&lt;br /&gt;
  '''END'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Passare dati ad un Oggetto all'atto della sua creazione==&lt;br /&gt;
Se si intende passare dati a un Oggetto di una Classe specifica, ciò va fatto all'atto della sua creazione con la parola-chiave &amp;quot;New&amp;quot; passando uno o più argomenti:&lt;br /&gt;
 oggetto = New Classe_Specifica(argomento_1, argomento_2, etc...)&lt;br /&gt;
Tali dati passati come argomenti, affinché possano essere effettivamente ricevuti ed utilizzati dall'Oggetto, dovranno essere previsti esplicitamente come parametri del Medoto nascosto &amp;quot;_new()&amp;quot; nel codice della sua Classe specifica:&lt;br /&gt;
 Public Sub &amp;lt;FONT color=#B22222&amp;gt;_new&amp;lt;/font&amp;gt;(parametro_1 As tipo_di_dato, parametro_2 As tipo_di_dato, etc...)&lt;br /&gt;
 &lt;br /&gt;
 End&lt;br /&gt;
all'interno possono essere assegnati i parametri ad altrettante Proprietà dell'oggetto, o condizionarne il funzionamento (es. definire le dimensioni iniziali di una ''Form'').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
='''_free()'''  - Il Distruttore=&lt;br /&gt;
Come esiste un '''Costruttore''', esiste un '''Distruttore''', a completamento del filo logico. In Effetti, come anche in altri linguaggi, questo &amp;quot;Distruttore&amp;quot; esiste, e in Gambas è assunto dal metodo &amp;quot;_free()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Il metodo '''_free()''' ha il non semplice compito, almeno per quanto riguarda le operazioni a basso livello, di chiudere e rilasciare le risorse occupate e utilizzate dalla classe. In definitiva è un pulitore.&lt;br /&gt;
&lt;br /&gt;
Il motore di '''Gambas''' ha una sua logica interna, che provvede automaticamente questo tipo di pulizia, che avviene normalmente per gli oggetti grafici, come ad esempio le Form e gli oggetti che racchiudono; ma, in alcuni casi, è necessario provvedere manualmente (inteso come codice) a liberare le risorse utilizzate. Questo è il caso, per esempio, di file aperti nella classe, di link a oggetti esterni alla classe, e così via. In questi casi, l'oggetto, non essendo in effetti consapevole degli elementi inseriti, al di fuori degli elementi previsti (esempio precedente, oggetti grafici), non prevede di gestirne la loro eliminazione, oltre al fatto che questa non è dipendente da situazioni o logiche previste nella loro impostazione di base.&lt;br /&gt;
Per questi motivi, viene d'aiuto il metodo &amp;quot;'''_free()'''&amp;quot; che, come per &amp;quot;'''_new()'''&amp;quot;, viene chiamato sempre e comunque, ma solo quando l'oggetto (o la classe) viene distrutta ed eliminata.&lt;br /&gt;
Il metodo '''_free()''' non prevede parametri, nè li accetta, perchè la sua esecuzione è automatica e non può essere alterata da programma. Al suo interno, però, è possibile eseguire tutte le operazioni e il codice necessario alla corretta chiusura dell'oggetto.&lt;br /&gt;
&lt;br /&gt;
Credo sia inutile fare esempi, dato che comunque il codice non dipenderebbe dall'oggetto, ma sarebbe solo codice esterno ad esso; l'unico esempio è quello della dichiarazione del metodo stesso:&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
  '''PUBLIC SUB _free()'''&lt;br /&gt;
    ...&lt;br /&gt;
    'codice libero&lt;br /&gt;
    ...  &lt;br /&gt;
  '''END'''&lt;br /&gt;
Il ''Distruttore''  è solo un Metodo nascosto che viene eseguito al momento della distruzione dell'Oggetto (come fosse un Evento speciale della Classe a cui appartiene) &amp;lt;SUP&amp;gt;&amp;amp;#091;[[#Note|nota 3]]&amp;amp;#093;&amp;lt;/sup&amp;gt;, e che di solito viene usato per liberare la memoria allocata dalla Classe (ma non la memoria della Classe !). Più in particolare '''il ''Distruttore'' non distrugge l'Oggetto (che viene cancellato dal Metodo &amp;quot;.Delete()&amp;quot;, risorsa dell'Oggetto medesimo), ma la memoria allocata dai Metodi dell'Oggetto'''.&lt;br /&gt;
&lt;br /&gt;
Il Metodo nascosto '''[https://gambaswiki.org/wiki/dev/api/cat/special/_free _Free()]''' è utilizzabile per pulire determinate situazioni (es. una connessione), che magari non sono state completate correttamente a causa di un'errore nella classe. Il Metodo nascosto &amp;quot;_free()&amp;quot; è in pratica il distruttore della Classe, cioè viene chiamato un attimo prima che questa venga eliminata dalla memoria, ed è utile per pulire l'Oggetto da eventuali riferimenti ad altre Classi, o per chiudere eventuali aperture di ''stream''.&lt;br /&gt;
&lt;br /&gt;
All'interno di questo Metodo nascosto, bisogna controllare (un &amp;quot;IF&amp;quot; di controllo può bastare sicuramente) se le variabili e le proprietà dello stesso siano ancora valide, ovvero non siano già state ''Nullate'' dalla procedura automatica di eliminazione dell'oggetto. Infatti potrebbe esserci una Proprietà della Classe che si sta cancellando, che punta ad un Oggetto esterno che non è più valido. In questo caso, andando ad effettuare dei controlli su questa Proprietà, in realtà si potrebbero trovare in due stadi:&lt;br /&gt;
&amp;lt;BR&amp;gt;'''1''') la proprietà è ancora valida, ovvero il riferimento punta ad un oggetto ancora valido;&lt;br /&gt;
&lt;br /&gt;
'''2''') l'oggetto non esiste più, per cui il &amp;quot;''riferimento'' &amp;quot; contiene un indirizzo non più valido, e quindi si potrebbe trovare ''Null'' oppure qualcosa di indefinito. In quest'ultimo caso è possibile usare i metodi di ''Object'', per controllare in che stato l'oggetto sia.&lt;br /&gt;
&amp;lt;BR&amp;gt;Per &amp;quot;''riferimento'' &amp;quot; si intende tutto quello che &amp;lt;SPAN style=&amp;quot;text-decoration:underline&amp;quot;&amp;gt;non&amp;lt;/span&amp;gt; è intrinseco alla Classe stessa.&lt;br /&gt;
&amp;lt;BR&amp;gt;Se ad esempio si ha un Oggetto grafico di tipo ''Button'' nella ''Form'', che è stata inserita fissa tramite l'editor grafico di [[GAMBAS|Gambas]], questa viene eliminata automaticamente da Gambas.&lt;br /&gt;
&amp;lt;BR&amp;gt;Se si ha una variabile che contiene il riferimento ad un altro Oggetto fuori della Classe, Gambas &amp;lt;SPAN style=&amp;quot;text-decoration:underline&amp;quot;&amp;gt;non&amp;lt;/span&amp;gt; lo elimina, perché potrebbe essere un Oggetto valido, a prescindere dalla cancellazione di quella Classe. In tal caso, se questo riferimento è da considerarsi non più utile, nel senso che il programmatore non lo intende valido, allora deve essere eliminato.&lt;br /&gt;
&amp;lt;BR&amp;gt;Se si ha un array di tipo ''String'', questo viene pulito perché contiene dati di livello base (''String'' fa parte di questo gruppo, anche se è in realtà un Oggetto).&lt;br /&gt;
&amp;lt;BR&amp;gt;Se si ha un array di tipo ''Integer'', anche questo viene eliminato e pulita automaticamente.&lt;br /&gt;
&amp;lt;BR&amp;gt;Se però la proprietà contiene un oggetto che è utilizzato esclusivamente all'interno della Classe, e non viene né istanziato, né utilizzato da codice esterno, allora anche questa proprietà viene pulita correttamente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR&amp;gt;Facciamo un paio di esempi.&lt;br /&gt;
&lt;br /&gt;
Come primo esempio poniamo il caso di avere due classi: Classe1 e Classe2.&lt;br /&gt;
&amp;lt;BR&amp;gt;Mettiamo che Classe2 abbia una proprietà di tipo Classe1, e che in qualche Metodo gli venga assegnato un oggetto valido ovviamente dello stesso tipo. Quando si va ad eliminare Classe2, l'oggetto Classe1 è sempre vivo, perché assegnato in maniera dinamica dall'esterno, quindi Gambas non può e &amp;lt;SPAN style=&amp;quot;text-decoration:underline&amp;quot;&amp;gt;non&amp;lt;/span&amp;gt; deve eliminarlo, in quanto è valido all'interno del progetto. In questo caso è necessario de-referenziare la proprietà della Classe2, mettendola a ''NULL'', e quindi eliminando il puntamento.&lt;br /&gt;
&amp;lt;BR&amp;gt;Comunque, Classe1 continua sempre a vivere, e continuerà ad esserlo anche se viene posta a ''NULL'' la proprietà di Classe2, perchè non è essa quella che ha creato Classe1, ma ne teneva solo l'indirizzo in memoria.&lt;br /&gt;
&amp;lt;BR&amp;gt;&amp;lt;SPAN Style=&amp;quot;text-decoration:underline&amp;quot;&amp;gt;L'eliminazione di Classe1 deve essere fatta solo da chi l'ha creata !&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nel secondo esempio, poniamo il caso di avere prima l'assegnazione del testo presente in una ''TextLabel1'' alla proprietà ''.Text'' di un ''Button1'', e successivamente la cancellazione di ''TextLabel1.Text''.&lt;br /&gt;
&amp;lt;BR&amp;gt;In questo caso viene assegnato un valore stringa, che è un tipo di dato base, e che in Gambas viene passato come valore, quindi una copia conforme all'originale. Se si cancella ''TextLabel1.Text'', il valore in ''Button1.Text'' viene mantenuto, perchè è un clone indipendente. Stessa cosa se si modifica l'uno rispetto all'altro, i due valori sono distinti, dalla copia in poi.&lt;br /&gt;
&amp;lt;BR&amp;gt;Poniamo il caso che si intenda mantenere un riferimento all'oggetto ''TextLabel1'', per generica utilità all'interno del progetto. Supponiamo quindi sia stata creata una variabile ''$Txlb'', a cui poi si assegni l'oggetto ''TextLabel1'', questa variabile riceverà il puntatore a ''TextLabel1'', ovvero l'indirizzo in memoria dell'oggetto ''TextLabel1'' (non una copia), per cui qualsiasi operazione si fa attraverso ''$Txlb'' si rifletterà su ''TextLabel1''. Se, in ipotesi, si decide di eliminare ''$Txlb'', questo non eliminerà però l'oggetto originale, e quindi ''TextLabel1'' continuerà ad esistere. Per tanto, se si intende eliminare ''TextLabel1'', bisognerà per forza utilizzare la Classe che lo contiene, di cui ha la ''paternità'', e che avrà il compito di eliminare i suoi oggetti. Per lo stesso motivo, se elimina il ''padre'', ad esempio una ''Form'', questa eliminerà prima tutti i suoi ''children'', e poi se stessa.&lt;br /&gt;
&amp;lt;BR&amp;gt;Ritornando alla variabile ''$Txlb'', che supponiamo sia una Proprietà di una Classe ''specifica''. Se si va ad eliminare la detta Classe specifica, bisognerà anche pulire tutti i riferimenti che ha, compresi quelli dei suoi ''figli''. Quindi, essendo ''$Txlb'' un ''riferimento'' ad un oggetto esterno, bisognerà eliminare l'aggancio che ''$Txlb'' ha con questo oggetto, semplicemente mettendolo a ''Null'' (riferimento nullo, o ''void''). Questa operazione è necessaria, in quanto Gambas non lo fa in questo caso, perchè non può sapere che uso si sta facendo della classe, ed è per questo motivo che ogni oggetto ha un metodo distruttore: appunto &amp;quot;_free()&amp;quot;.&lt;br /&gt;
&amp;lt;BR&amp;gt;In altri linguaggi il concetto è identico, anche se la sintassi è diversa. In C++ e Java, per esempio, la definizione del costruttore e del distruttore è obbligatoria, anche se non necessariamente codificata. Il costruttore è in pratica il punto d'ingresso della classe, e che si occupa dell'attivazione della stessa e dei suoi elementi. Il distruttore è quello che si occupa di eliminare tutte le tracce in memoria della classe, una volta che non serve più.&lt;br /&gt;
&lt;br /&gt;
Come si è detto in precedenza, vanno fatti dei controlli, ma le operazioni vanno fatte solo se gli oggetti sono &amp;lt;SPAN style=&amp;quot;text-decoration:underline&amp;quot;&amp;gt;validi&amp;lt;/span&amp;gt;, e non se sono invalidi. Se v'è un oggetto valido, è possibile pulire la proprietà che lo contiene, relativa all'oggetto che contiene &amp;quot;_free()&amp;quot;.&lt;br /&gt;
&amp;lt;BR&amp;gt;Riguardo al dopo non si deve fare nulla, e non si deve restituire nulla. Il metodo &amp;quot;_free()&amp;quot; non è reversibile, ma permette di fare gli ultimi ritocchi per pulire bene la memoria. A volte la pulizia automatica di Gambas non fa completamente il suo dovere, anche perché molte cose non può, e non deve, toccarle. A questo punto sta al programma controllare lo stato delle cose e agire di conseguenza. La mancata pulizia degli oggetti, fa sì che vengano emessi messaggi di ''Warning'' alla chiusura dell'applicazione che, appunto, indicano che ci sono oggetti ancora attivi in memoria.&lt;br /&gt;
La cosa, ad ogni modo, non è sia bloccante, è esclusivamente una questione di pulizia. Tutto quello che è stato utilizzato dal programma, viene ignorato dal sistema operativo, e reso mediamente disponibile.&lt;br /&gt;
&amp;lt;BR&amp;gt;Questo però non realmente valido, se vi sono dei processi in ''background'', cui nessuno si occupa di eliminarli fisicamente dalla memoria. Di solito questi processi, se non vengono chiusi e puliti correttamente, restano come &amp;quot;''zombie''&amp;quot; nel sistema, e solo un &amp;quot;''kill -9'' &amp;quot; può eliminarli. ...ma per fortuna stiamo parlando di Linux, per cui processi impazziti non sono realmente un problema.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Note=&lt;br /&gt;
[1] Riportiamo in questa pagina in modo più organico semplicemente diversi interventi e messaggi scritti su quest'argomento dall'utente ''md9327'' del forum ''Gambas-it.org'' .&lt;br /&gt;
&lt;br /&gt;
[2] In sostanza va tenuto presente che, se in una ''Classe'' è stato posto il Metodo nascosto ''_new( )'':&lt;br /&gt;
&amp;lt;BR&amp;gt; &amp;lt;FONT Color=transparent&amp;gt;- - - &amp;lt;/font&amp;gt; - all'atto della creazione di tale ''Classe'' - per mezzo della parola-chiave ''New'' - viene immediatamente invocato il predetto Metodo nascosto ''_new( )'';&lt;br /&gt;
&amp;lt;BR&amp;gt; &amp;lt;FONT Color=transparent&amp;gt;- - - &amp;lt;/font&amp;gt; - è possibile passare mediante il Metodo nascosto ''_new( )'' uno o più parametri alla nuova ''Classe'' immediatamente e contestualmente all'atto della sua creazione (effettuata con la parola-chiave ''New''), come nell'esempio che segue:&lt;br /&gt;
&amp;lt;BR&amp;gt; &amp;lt;FONT Color=transparent&amp;gt;- - - - &amp;lt;/font&amp;gt;se ad esempio nella ''Classe'' principale viene creata la ''Classe'' secondaria passando a quest'ultima un parametro di tipo ''Stringa'':&lt;br /&gt;
 Dim cl As Classe_secondaria&lt;br /&gt;
  &lt;br /&gt;
 cl = &amp;lt;Font Color=#B22222&amp;gt;'''New''' Classe_secondaria(&amp;quot;testo qualsiasi&amp;quot;)&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;FONT Color=transparent&amp;gt;- - - - &amp;lt;/font&amp;gt;nella ''Classe'' secondaria il parametro verrà immediatamente recepito, prima di ogni altro metodo in essa eventualmente presente, appunto con il Metodo nascosto ''_new( )'' e gestito di conseguenza come di consueto:&lt;br /&gt;
 Public Sub &amp;lt;Font Color=#B22222&amp;gt;'''_new'''(s As String)&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  Print s&lt;br /&gt;
  &lt;br /&gt;
 End&lt;br /&gt;
&lt;br /&gt;
[3] Facciamo ora un semplice esempio utilizzando due Classi: una Classe principale e una Classe secondaria.&lt;br /&gt;
&amp;lt;BR&amp;gt;La Classe principale (chiamata &amp;quot;FMain&amp;quot;) avrà al suo interno il seguente codice:&lt;br /&gt;
 Private cl1 As Class1&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;FONT Color=gray&amp;gt;' ''Questo Metodo nascosto della Classe principale viene sollevato all'atto della creazione della Classe principale medesima:''&amp;lt;/font&amp;gt;&lt;br /&gt;
 Public Sub &amp;lt;FONT Color=#B22222&amp;gt;'''_new()'''&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  Print &amp;quot;Classe Principale in creazione&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt;FONT Color=gray&amp;gt;' ''In questo caso all'atto della creazione della Classe principale si provvede anche creare una Classe &amp;quot;secondaria&amp;quot; (chiamata &amp;quot;Class1&amp;quot;) inviandole pure alcuni argomenti:''&amp;lt;/font&amp;gt;&lt;br /&gt;
  cl1 = New Class1(&amp;quot;Testo qualsiasi&amp;quot;, 4444)&lt;br /&gt;
  &lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Public Sub Button1_Click()&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;FONT Color=gray&amp;gt;' ''Si provvede a distruggere la Classe &amp;quot;secondaria&amp;quot; assegnando &amp;quot;Null&amp;quot; alla variabile che punta al suo Oggetto. (è opportuno ricordare che una Classe secondaria può essere distrutta soltanto dalla Classe che l'ha generata).''&amp;lt;/font&amp;gt;&lt;br /&gt;
  cl1 = &amp;lt;FONT Color=#B22222&amp;gt;Null&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
 End&lt;br /&gt;
Mentre il codice nella Classe &amp;quot;secondaria&amp;quot; sarà il seguente:&lt;br /&gt;
 &amp;lt;FONT Color=gray&amp;gt;' ''Questo Metodo nascosto della Classe &amp;quot;secondaria&amp;quot; viene sollevato all'atto della creazione della Classe &amp;quot;secondaria&amp;quot; medesima, e riceve gli argomenti passati con l'istruzione della creazione della Classe &amp;quot;secondaria&amp;quot; mediante la parola-chiave &amp;quot;New&amp;quot;:''&amp;lt;/font&amp;gt;&lt;br /&gt;
 Public Sub _new(s As String, i As Integer)&lt;br /&gt;
  &lt;br /&gt;
  Print &amp;quot;Classe secondaria in creazione&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  Print s, i&lt;br /&gt;
  &lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;FONT Color=gray&amp;gt;' ''Questo Metodo nascosto della Classe &amp;quot;secondaria&amp;quot; viene sollevato all'atto della &amp;quot;distruzione&amp;quot; della Classe &amp;quot;secondaria&amp;quot; medesima:''&amp;lt;/font&amp;gt;&lt;br /&gt;
 Public Sub &amp;lt;FONT Color=#B22222&amp;gt;'''_free()'''&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  Print &amp;quot;Classe secondaria in distruzione&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
 End&lt;br /&gt;
Insomma, i Metodi nascosti &amp;quot;_new()&amp;quot; e &amp;quot;_free()&amp;quot; non creano e non distruggono direttamente alcunché: essi, comportandosi come degli Eventi, sono sollevati rispettivamente all'atto della creazione e all'atto della distruzione della Classe di riferimento.&lt;/div&gt;</summary>
		<author><name>Vuott</name></author>
	</entry>
</feed>