JavascriptProva

domenica 8 gennaio 2012

getElement(s) by il cavolo che ti pare...

Voglio fare qualche prova.
getElementById dovrebbe darmi un elemento singolo.
getElementsByName e getElementsByTagName, invece, dovrebbero darmi un insieme di elementi.

Se voglio impostare un attributo di stile di un singolo elemento ci riesco, mentre farlo per un insieme risulta più problematico...

Ecco: posso accedere in questo modo a ogni singolo elemento dell'insieme:
<html>
<head>
<script>
function funzione(){
  var insieme = document.getElementsByTagName("div");
 insieme[0].style.color="blue";
 insieme[1].style.color="green";
}
</script>
</head>
<body>
<div onClick="funzione()">Ciao bestiolina</div>
<div id="primo">Ciao fesso</div>
</body>
</html>
...che funziona: al click sul primo elemento mi cambia il colore di ambedue gli elementi di un insieme insieme ottenuto mettendo insieme tutti gli elementi che hanno per tag name DIV.

Reintroduciamoci al JavaScript...

Da dove comincio?
Cominciamo dall'oggetto Document.


Ecco, ho usato getElementById per arrivare a un DIV che ha un certo Id:
<html>
<head>
<script>
function funzione(){
 document.getElementById("primo").style.backgroundColor="red"
}
</script>
</head>
<body>
<div id="primo" onClick="funzione()">Ciao bestiolina</div>
</body>
</html>

Programma di conversione tag reso raggiungibile da tutto il computer!

Ora devo semplicemente porlo fra le variabili di sistema.

Prima però voglio cambiargli nome: l'ho chiamato comando.exe soltanto in virtù del fatto che volevo far sì che fosse utilizzabile da linea di comando, ma questo nome di per sè non dice niente circa la funzione del programma.
Posso chiamarlo tagconv.exe

C:\Users\Io>tagconv miofile.txt

C:\Users\Io>
Bene! Ora mettiamolo fra le variabili di sistema in modo che possa essere riconosciuto anche al di fuori della directory in cui risiede.
Al momento non è riconosciuto se mi sposto in un'altra cartella, come quella del livello superiore:

C:\Users\Io>tagconv miofile.txt

C:\Users\Io>cd ..\

C:\Users>tagconv
"tagconv" non è riconosciuto come comando interno o esterno,
 un programma eseguibile o un file batch.

C:\Users>


Andiamo su "pannello di controllo" a fare l'operazione e vediamo se riesce...
Ecco...
C:\Users\Io>tagconv

C:\Users\Io>cd ..\

C:\Users>tagconv
...e ottengo "nessun nome di file specificato"
Questo significa che il programma è ora riconosciuto anche al di fuori della directory di origine! Tutto OK!

Programma convertitore di tags ultimato!

Bene, adesso ho dotato il mio programma convertitore della capacità di aprire direttamente il file modificato.
Inoltre, metto al riparo il file dal creare ex novo un file in caso il nome del file da convertire fosse sbagliato, verificando prima l'esistenza del file che gli si dà "in pasto":
Sub main(ByVal parametro() As String)
        If parametro.Length <> 0 Then
            If Dir(parametro(0)) <> "" Then
                Dim variabile As Byte
                My.Computer.FileSystem.DeleteFile("C:\Users\Io\Documenti\output.txt")

                FileOpen(1, parametro(0), OpenMode.Binary)
                FileOpen(2, "C:\Users\Io\Documents\output.txt", OpenMode.Binary)
                Dim n As Integer = 1, k As Integer = 1
                Do Until EOF(1)
                    FileGet(1, variabile, n)
                    Debug.Print(variabile)
                    If variabile = 60 Then
                        variabile = 38
                        FilePut(2, variabile, k)
                        k = k + 1
                        variabile = 108
                        FilePut(2, variabile, k)
                        k = k + 1
                        variabile = 116
                        FilePut(2, variabile, k)
                        k = k + 1
                        variabile = 59
                        FilePut(2, variabile, k)
                    Else
                        FilePut(2, variabile, k)
                    End If
                    n = n + 1
                    k = k + 1
                Loop
                FileClose(2)
                FileClose(1)
                Shell("notepad.exe C:\Users\Io\Documents\output.txt", AppWinStyle.NormalFocus)
            Else
                MsgBox("non esiste")
            End If
        Else
            MsgBox("nessun nome di file specificato!")
        End If
End Sub
Sembra funzioni alla perfezione!

sabato 7 gennaio 2012

Programma da linea di comando con parametri

Ho risolto l'esecuzione di un programma da linea di comando.
Module Module1
    Sub main(ByVal parametro() As String)
        If parametro.Length <> 0 Then MsgBox(parametro(0))
    End Sub
End Module
Ecco la linea di comando: se il parametro è nullo non succede niente, altrimenti appare una MessageBox con il parametro.

venerdì 6 gennaio 2012

Convertitore di parentesi angolari completato!

Ecco il codice definitivo, bello e aggiustato, del mio convertitore di parentesi angolari in sequenze di escape:
Module Module1
    Sub main()
        Dim variabile As Byte
        FileOpen(1, "C:\Users\Io\Documents\file.txt", OpenMode.Binary)
        FileOpen(2, "C:\Users\Io\Documents\output.txt", OpenMode.Binary)
        Dim n As Integer = 1, k As Integer = 1
        Do Until EOF(1)
            FileGet(1, variabile, n)
            Debug.Print(variabile)
            If variabile = 60 Then
                variabile = 38
                FilePut(2, variabile, k)
                k = k + 1
                variabile = 108
                FilePut(2, variabile, k)
                k = k + 1
                variabile = 116
                FilePut(2, variabile, k)
                k = k + 1
                variabile = 59
                FilePut(2, variabile, k)
            Else
                FilePut(2, variabile, k)
            End If
            n = n + 1
            k = k + 1
        Loop
    End Sub
End Module
Questo è il file output.txt che sul web appare con le giuste parentesi angolari:
<html>
<head>
<title>
Pagina di prova
</title>
</head>
<body>
<div style="color:red">Questo è un testo di prova</div>
</body>
</html></html>
E questo è il file output.txt come è realmente sullo schermo del computer:



Ottimo!
Adesso devo ristudiare il modo di usarlo dalla linea di comando!

Ma un momento! Perchè mi ha scritto due volte </html> alla fine?

Rifacciamo... mmmhhh... no, era perchè in precedenza avevo usato un numero di caratteri più lungo, e le nuove scritture hanno sovrascritto tutto tranne l'ultimo tag che ci avanzava.
Questo pone il problema di cancellare tutto il file prima di sovrascriverlo...
L'ho sistemato in breve!
Module Module1
    Sub main()
        Dim variabile As Byte
        My.Computer.FileSystem.DeleteFile("C:\Users\Io\Documenti\output.txt")
        FileOpen(1, "C:\Users\Io\Documents\file.txt", OpenMode.Binary)
        FileOpen(2, "C:\Users\Io\Documents\output.txt", OpenMode.Binary)
        Dim n As Integer = 1, k As Integer = 1
        Do Until EOF(1)
            FileGet(1, variabile, n)
            Debug.Print(variabile)
            If variabile = 60 Then
                variabile = 38
                FilePut(2, variabile, k)
                k = k + 1
                variabile = 108
                FilePut(2, variabile, k)
                k = k + 1
                variabile = 116
                FilePut(2, variabile, k)
                k = k + 1
                variabile = 59
                FilePut(2, variabile, k)
            Else
                FilePut(2, variabile, k)
            End If
            n = n + 1
            k = k + 1
        Loop
        FileClose(2)
        FileClose(1)
    End Sub
End Module
Il file output.txt precedente viene cancellato e quindi ricreato.
Facile!

Ecco le basi del mio convertitore!

Fatto!.

Non ricordavo come avevo risolto il problema l'altra volta con il VB6, e il fatto di avere a che fare con il VB 2010 mi inibiva psicologicamente, ma ora ho ricostruito perfettamente la procedura.
Ecco il prototipo del mio convertitore, al quale basta solo sostituire i codici ASCII per averlo funzionante sulle parentesi angolari da sostituire con le sequenze di escape &lt; e &gt;
Module Module1
    Sub main()
        Dim variabile As Byte
        FileOpen(1, "C:\Users\Io\Documents\file.txt", OpenMode.Binary)
        FileOpen(2, "C:\Users\Io\Documents\output.txt", OpenMode.Binary)
        Dim n As Integer = 1, k As Integer = 1
        Do Until EOF(1)
            FileGet(1, variabile, n)
            Debug.Print(variabile)
            If variabile = 65 Then
                variabile = 66
                FilePut(2, variabile, k)
                variabile = 67
                k = k + 1
                FilePut(2, variabile, k)
                variabile = 68
                k = k + 1
                FilePut(2, variabile, k)
            Else
                FilePut(2, variabile, k)
            End If
            n = n + 1
            k = k + 1
        Loop
    End Sub
End Module
Per ora questo sostituisce una A con la sequenza BCD in un nuovo file chiamato output.txt.
Funziona! Sono soddisfatto!