Visual
Basic ed il Web: come VB accede a proprietà ed
eventi degli oggetti HTML |
Esamineremo
l'utilizzo di una Dll ActiveX per eseguire operazioni
non effettuabili né con l'utilizzo del DHTML, né
con script sul client; vedremo con due esempi pratici le modalità,
le possibilità ed i limiti di utilizzo.
In
questo ambito di sviluppo sono accessibili a routine in codice
Vb proprietà ed eventi degli oggetti delle pagine HTML,
con in più la possibilità di aggiungere Form
Visual Basic; è ovvio quindi che si tratta di uno strumento
flessibile e potente con cui sviluppare applicazioni Internet/Intranet
senza ricorrere alle risorse del server e prescindendo anzi
dal tipo di server e dai servizi offerti dal Provider.
Tuttavia questa tecnologia ha 2 importanti limitazioni proprio
perché è destinata ad essere eseguita sul client
(ovvero il computer di chi si collega): la prima (è
ovvia, succede lo stesso con qualsiasi applicazione VB!) riguarda
il sistema operativo che deve essere Windows (e di conseguenza
il browser deve essere MSIE), la seconda è che la nostra
Dll richiede l'istallazione di componenti (tra le quali il
modulo di run-time di Vb) sul computer dell'utente per essere
eseguita.
Poiché il minimo di tali componenti è 1,5 Mb
(ma possono anche essere molti di più) non potremo
certo usare questa tecnica in un normale sito Internet visto
che non tutti sono disposti a farsi istallare cose sconosciute
sul proprio PC ed anche chi è disposto non vuole certo
perdere il tempo necessario per il download e l'istallazione
prima di leggere una pagina su Internet.
Queste limitazioni divengono invece insignificanti in due
casi:
1. Applicazioni Intranet (ovvero rete interna locale);
2. Applicazioni Internet se trattasi di pagine riservate
all'amministratore del sito.
Prendiamo
in esame il primo esempio:
da una pagina HTML vogliamo passare dei dati ad un'altra pagina
HTML.
Il problema non è risolubile ricorrendo a script a
meno che la 2.a pagina non venga aperta in una finestra "figlia";
con Vb invece diventa di una semplicità sconcertante.
Creiamo una pagina PassaParametro.htm:
<HTML>
<HEAD>
<META http-equiv=Content-Type content="text/html;
">
</HEAD>
<BODY>
<INPUT id=TextField1 value="Testo" name=TextField1>
mettere il testo desiderato e cliccare<br>
<BR>
<A href="Parametropassato.htm"><b>GO</b></A> vai
a Page2<BR>
</BODY>
</HTML> |
Creiamo
un'altra pagina, ParametroPassato.htm:
<HTML>
<HEAD>
<META http-equiv=Content-Type content="text/html;
">
<script language="VbScript">
<!--
Function vedi()
Zona1.innerText = "il parametro passato è
" & Parametro.value
End Function
-->
</script>
</HEAD>
<BODY onload="vedi()">
<INPUT type=hidden id=Parametro value=Parametro>
<BR>
<DIV id=Zona1>
</DIV>
<BR>
</BODY>
</HTML> |
Adesso
lanciamo Visual Basic e scegliamo Nuovo / Applicazione DHTML;
nella finestra Progetto apriamo Moduli, eliminiamo il modulo
modDHTML inserito di default , poi aggiungiamo un nuovo modulo
e vi inseriamo il seguente codice:
Global
DHTMLParametro As String |
e
lo salviamo come Parametro.bas.
Nella finestra Progetto apriamo Finestre di progettazione
ed eliminiamo DHTMLPage1.
Poi Progetto / Inserisci DHTML Page, clicchiamo salva HTML
in un file esterno, clicchiamo Apri e scegliamo PassaParametro.htm;
eseguiamo la stessa sequenza con ParametroPassato.htm.
Clicchiamo DHTMLPage1, cambiamone il nome in PassaParametro,
clicchiamo l'icona codice e nella finestra Codice scegliamo
l'oggetto TextField1 e l'evento onclick; nella funzione Private
Function TextField1_onclick() As Boolean inseriamo la riga
di codice:
DHTMLParametro
= TextField1.Value |
e
salviamo quindi PassaParametro (verrà salvata con extension
.dsr).
Operiamo analogamente con DHTMLPage2 cambiando il nome in
ParametroPassato, scegliamo l'oggetto Document e l'evento
onfocusin; nella Private Sub Document_onfocusin() inseriamo
la riga di codice:
Parametro.Value
= DHTMLParametro |
e salviamo quindi ParametroPassato.
Nominiamo il progetto Parametro e lo salviamo.
Prima di creare Parametro.dll è necessario eseguire
il progetto perché utilizzerebbe come componente di
avvio ParametroPassato (è la prima pagina in ordine
alfabetico); nella finestra di esecuzione la cambiamo in PassaParametro,
poi terminiamo l'esecuzione perché non ci interessa
e creiamo Parametro.dll.
Con sole tre righe di codice è tutto fatto!
Qualcuno si domanderà: ma digitare il testo da passare
e poi cliccare col mouse è scomodo, non si poteva fare
come nei Form Vb con l'evento keypress testando se l'ASCII
è 13?
La risposta è NO; gli oggetti DHTML non hanno purtroppo
anche gli eventi dei corrispondenti oggetti Vb "normali".
Comunque se vi serve qualcosa del genere in una applicazione
reale tenete presente che TextField1 non è necessario
che sia visibile ed il suo valore può anche essere
impostato da uno script, così come uno script può
premere il bottone al posto vostro.
Avrete notato che abbiamo adoprato dei tag <INPUT> in
entrambe le pagine; è necessario in quanto così
sono degli oggetti e quindi hanno proprietà alla quali
possiamo accedere.
Parametro.dll è piccolo, appena 28 Kb, e quindi non
presenterebbe problemi in Internet, ma perché funzioni
è necessario che siano istallati sul PC msvbvm60.dll
(1,388 Mb), Asycfilt.dll (148 Kb), Oleaut32.dll (598 Kb),
Olepro32.dll (164 Kb), Stdole2.tlb (18 Kb) e Comcat.dll (22
Kb) ed infatti la creazione Pacchetti di Istallazione genera
un file cab di 1.155 Kb.
Come
secondo esempio utilizziamo un caso pratico: in un database
abbiamo un campo Memo destinato ad essere visualizzato in
una pagina HTML; abbiamo la necessità di editare il
campo inserendo tag HTML di formattazione del testo (grassetto,
corsivo, corpo più grande o più piccolo, colore)
e possiamo anche farlo manualmente ma è noioso.
In Vb un TextBox ha le proprietà SelText, SelStart,
SelLength e quindi è facile modificare il testo selezionato,
per cui decidiamo di creare una Dll ActiveX; nella pagina
HTML abbiamo la TextArea contenente il testo, passiamo il
testo ad un TextBox di un Form Vb, gestiamo tutto nel programma
Vb ed alla chiusura del Form ripassiamo il testo modificato
alla TextArea della pagina HTML.
Abbiamo già creato la pagina con la TextArea (nell'esempio
si chiama EditText_Page1.html) per cui apriamo un nuovo progetto,
nelle Finestre di progettazione eliminiamo DHTMLPage1 e ne
creiamo una nuova collegandola alla pagina HTML esterna esistente
come abbiamo già visto nel caso precedente.
Poi prendiamo il modulo mGlobal, cancelliamo tutto il contenuto
di default e ci scriviamo solo
Global
gSourcePage As Object |
e
lo salviamo come EditText.bas.
A DHTMLPage1 aggiungiamo il codice:
Private
Function
Button1_onclick() As Boolean
Set gSourcePage = TextArea1
EditText.Show 1
End Function |
dove
Button1 è il bottone Edit rendendo così accessibile
l'oggetto TextArea1 al programma Visual Basic.
Inseriamo un Form a cui diamo nome EditText e ci mettiamo
un grosso TextBox settando MultiLine=True e ScrollBars=Vertical.
Sopra ci mettiamo (alla maniera Word) tre Bottoni (Command1(0),
Command1(1), Command1(2)) con Caption B, I e Font; per gestire
il font inseriamo un Frame a cui diamo Nome FontFrame, Caption
Font e Visibile=false, ci aggiungiamo la Label color e sotto
4 OptionButton (default, red, blue green), poi un altro Frame
e dentro a questo l'analogo per size (-2, -1, 0, +1, +2) ed
aggiungiamo quindi a FontFrame il bottone Applica (Command1(3)).
Infine aggiungiamo al nostro Form 2 bottoni OK e Annulla (Command2(0)
e Commad2(1)) ed il Form è pronto:
Scriviamo
adesso il codice.
Nelle dichiarazioni definiamo una variabile stringa
Nella
Sub Form_Load() recuperiamo il testo passatoci e sostituiamo
eventuali tag <br> con Carriage return + Line feed:
TestoHTML
= gSourcePage.Value
Text1.Text = Replace(TestoHTML, "<br>",
vbCrLf) |
Nella
Sub Command2_Click(Index As Integer) modifichiamo il testo
nella TextArea della pagina HTML se OK e chiudiamo:
If
Index = 0 Then gSourcePage.Value
= TestoHTML
Unload Me |
Nella
Sub Text1_Change() sostituiamo gli a capo con il tag <br>:
TestoHTML
= Replace(Text1.Text, vbCrLf, "<br>") |
Nella
Sub Command1_Click(Index As Integer) gestiamo la visibilità
o meno del frame, le abilitazioni dei bottoni (per evitare
che a frame font visibile venga pigiato B o I) e l'inserimento
dei tag opportuni:
Private
Sub
Command1_Click(Index As Integer)
Dim sTag As
String, eTag As String
Dim sSave As
Integer, sText As String
If
Text1.SelLength = 0 Then Exit
Sub
If Index = 2 Then
' passiamo al frame Font
Command1(0).Enabled = False
Command1(1).Enabled = False
FontFrame.Visible = True
Exit Sub
End If
sSave = Text1.SelStart
If Index = 3 Then
FontFrame.Visible = False
sTag = "<FONT"
If Not Option1(0).Value
Then
If Option1(1).Value Then
sTag = sTag & " COLOR=" & Chr$(34)
& "red" & Chr$(34)
If Option1(2).Value Then
sTag = sTag & " COLOR=" & Chr$(34)
& "blue" & Chr$(34)
If Option1(3).Value Then
sTag = sTag & " COLOR=" & Chr$(34)
& "green" & Chr$(34)
End If
If Not Option2(2).Value
Then
If Option2(0).Value Then
sTag = sTag & " SIZE=" & Chr$(34)
& "-2" & Chr$(34)
If Option2(1).Value Then
sTag = sTag & " SIZE=" & Chr$(34)
& "-1" & Chr$(34)
If Option2(3).Value Then
sTag = sTag & " SIZE=" & Chr$(34)
& "+1" & Chr$(34)
If Option2(4).Value Then
sTag = sTag & " SIZE=" & Chr$(34)
& "+2" & Chr$(34)
End If
sTag = sTag & ">"
eTag = "</FONT>"
Else
sTag = IIf(Index = 0, "<b>", "<i>")
eTag = IIf(Index = 0, "</b>", "</i>")
End If
sText = sTag & Text1.SelText & eTag
Text1.SelText = sText
Text1.SelStart = sSave
Text1.SelLength = Len(sText)
Text1.SetFocus
Command1(0).Enabled = True
Command1(1).Enabled = True
End Sub
|
E
così abbiamo terminato e salviamo EditText.frm, salviamo
EditTextPage1.dsr. chiamiamo il progetto EditText e lo salviamo
e creiamo EditText.dll.
I
files del progetto, inclusa EditText.dll già compilata,
sono contenuti in EditText.zip
Articolo
cura di :
Paolo Malesci - http://digilander.iol.it/paolomalesci
|