JavascriptProva

venerdì 28 giugno 2013

StringBuilder, impiego per modificare le stringhe.

Ecco quello che ho capito di StringBuilder.

    Sub Main()
        Dim variabile As New StringBuilder
        variabile.Append("Ciao")
        Dim variabile2 As New StringBuilder
        variabile2 = variabile
        Console.WriteLine(variabile2 Is variabile)
        Console.WriteLine(variabile2.ToString)
        variabile.Replace(variabile.ToString, "Deficiente")
        Console.WriteLine(variabile2 Is variabile)
        Console.WriteLine(variabile2.ToString)
        Console.ReadKey()

    End Sub
Dichiaro una variabile Variabile (che fantasia!) come StringBuilder, e vi attribuisco il valore "Ciao".

Dichiaro una variabile Variabile2 come StringBuilder e la assimilo a Variabile.

Ora testo se Variabile2 punta lo stesso oggetto di Variabile, e ottengo True.

E metto a video il valore di Variabile2 per vedere qual è: ottengo Ciao.

Quindi sostituisco su Variabile il valore "Ciao" con "Deficiente".

Testo sempre se Variabile2 punta lo stesso oggetto di Variabile e ottengo True.

Testo il valore di Variabile2 e ottengo il valore mutato di Variabile, ossia Deficiente.

Ecco:
True
Ciao
True
Deficiente



Bene. Questo è un modo di modificare le stringhe senza creare tremila oggetti nello heap da gettare nella monnezza una volta abbandonati.

Tipi Value e tipi Reference, ancora...

Bene, dunque esistono dei tipi Value e dei tipi Reference. I primi vengono memorizzati come valori scritti nello stack, i secondi vengono memorizzati nell'heap e il loro indirizzo viene memorizzato nello stack.

Per il tipo Value, nel momento in cui io dichiaro una variabile senza assegnazione, il suo valore appare zero. Per il tipo reference, nel momento in cui io dichiaro una variabile senza assegnazione, ottengo una segnalazione di errore, perchè non esiste niente nello heap il cui indirizzo io possa memorizzare nello stack.

In pratica, la variabile con cui io indico un tipo Value è una variabile, mentre quella con cui io indico un tipo Reference è un puntatore. La differenza viene fatta dal sistema, non da me esplicitamente come nel C++.

venerdì 21 giugno 2013

Variabile come tipo value in VB.NET (prova)

Ed ecco la dimostrazione che le variabili sono un tipo value e non reference.
Creo due variabili, me le mostro.
Assimilo una variabile all'altra, e me le mostro di nuovo.
Quindi cambio una variabile e ottengo due risultati diversi.
        Dim A As String
        A = "primo"

        Dim B As String
        B = "secondo"

        MsgBox("A " & A & ";B " & B)

        B = A

        MsgBox("A " & A & ";B " & B)

        A = "ciccio"

        MsgBox("A " & A & ";B " & B)
Alla fine, dopo aver modificato A, B rimane inalterata, quindi B è stato reso uguale ad A per valore, non per riferimento.

Array come tipo reference in VB.NET (prova)

Elaboriamo un test per le matrici.
Dichiaro due piccole matrici:
        Dim A() As String
        A = {"uno", "due", "tre"}

        Dim B() As String
        B = {"alfa", "beta", "gamma"}


        MsgBox("A(0) " & A(0) & "; B(0) " & B(0))


        B = A

        MsgBox("A(0) " & A(0) & "; B(0) " & B(0))

        A(0) = "ciccio"

        MsgBox("A(0) " & A(0) & "; B(0) " & B(0)) 
Ho creato due array diversi, A e B.
Mi mostro i valori con indice 0 di ambedue gli arrays, che sono diversi.
Eguaglio B ad A.
Mi mostro di nuovo i valori con indice 0 di ambedue gli arrays, che ora sono uguali.

Ecco la prova:
Cambio il valore con indice 0 di uno degli arrays.
Mi mostro il valore con indice 0 di ambedue gli arrays e scopro che è cambiato anche quello dell'array B, il che significa che sono stati resi lo stesso array, ossia che l'array è un tipo reference.
In sintesi: prima dichiaro i due array, quindi li eguaglio, quindi modifico un elemento di un array e vedo se risulta modificato anche l'elemento dell'altro array.
Lo faccio ora con le variabili.

lunedì 20 maggio 2013

Funzioni successive al menu.

Una volta che siamo usciti dal menu, abbiamo:
  • La casella il cui click ha evocato il menu
  • Le ccrdinate dell'evento che ha evocato il menu
  • L'evento click sul menu.
Ora bisogna inserire sulla casella chiamante il contenuto del menu.
Come fare?

Funzione CreateMenu, ultima evoluzione.

Ecco la nuova versione della funzione che crea il menu:
//funzione che crea il menu popup. Funzione è ciò che si vuole che accada quando si clicca sul Menu.
function CreaMenu(evento,mouseSopra,mouseFuori,funzione){
 var casellaCliccata=evento.srcElement;
 var coordinataX=evento.clientX;
 var coordinataY=evento.clientY
 Mnu=document.createElement("div");
 Mnu.id="menu";
 Mnu.onmouseover=mouseSopra;
 Mnu.onmouseout=mouseFuori;
 Mnu.className="Menu";
 Mnu.innerHTML=TestoDelMenu;
 document.body.appendChild(Mnu);
 Mnu.style.left=evento.clientX+"px";
 Mnu.style.top=evento.clientY+"px";
 
 Mnu.onmousedown=function(){
  document.body.removeChild(Mnu);
  funzione(event,casellaCliccata,coordinataX,coordinataY)
 };
}
La funzione accetta come parametri l'evento che l'ha evocata, la funzione da eseguire al MouseOver, la funzione da eseguire al MouseOut, e la funzione da eseguire all'evento MouseDown sul menu.
A questa funzione vengono forniti, quando chiamata, i parametri della casella cliccata all'evento chiamante il menu e delle sue coordinate, oltre all'evento del click sul menu.

domenica 19 maggio 2013

Ricostruendo la funzione che crea i menu

Bene.
Ho troncato il programma.

Adesso devo creare una funzione che mi crei un menu.

Ho la posizione del mouse.
Ma la passo ugualmente come parametro.
Ecco la funzione finora:
function CreaMenu(evento,mouseSopra,mouseFuori){
 
 Mnu=document.createElement("div");
 Mnu.id="menu";
 Mnu.onmouseover=mouseSopra;
 Mnu.onmouseout=mouseFuori;
 Mnu.className="Menu";
 Mnu.innerHTML=TestoDelMenu;
 document.body.appendChild(Mnu);
 Mnu.style.left=event.clientX+"px";
 Mnu.style.top=event.clientY+"px";
}
Conviene passare alla funzione che crea il menu anche la casella che è stata cliccata.
Passando l'evento, si passano sia le coordinate sia la casella.
Dunque la funzione che crea il menu conosce sia le coordinate sia l'elemento bersaglio dell'evento.


Ecco come ho ricostruito la funzione finora:
//funzione che crea il menu popup. Funzione è ciò che si vuole che accada quando si clicca sul Menu.
function CreaMenu(evento,mouseSopra,mouseFuori){
 var casellaCliccata=evento.srcElement;
 var coordinataX=evento.clientX;
 var coordinataY=evento.clientY
 Mnu=document.createElement("div");
 Mnu.id="menu";
 Mnu.onmouseover=mouseSopra;
 Mnu.onmouseout=mouseFuori;
 Mnu.className="Menu";
 Mnu.innerHTML=TestoDelMenu;
 document.body.appendChild(Mnu);
 Mnu.style.left=evento.clientX+"px";
 Mnu.style.top=evento.clientY+"px";
 
 Mnu.onmousedown=function(){
  var menuCliccato=event.srcElement;
  casellaCliccata.innerHTML=menuCliccato.innerHTML;
 };
}