102. HTA: Eine grafische Oberfläche und mehr 

Einleitung


Dieses Kompendium soll einen Batchschreiber dazu befähigen ein GUI (graphic user interface) für seine Skripte zu erstellen.  Nebenbei wird HTA zu 100 % und VBS-Code für Aufgaben erklärt, die Sie so nicht mit Batches erledigen können.

Die Sternenhimmelstuermerseite als Metaseite stellt Ihnen sämtliche angepassten Code-Schnipsel aus der Freeware HTA-Helpomatic (Scriptguys der Microsoft-Corporation mit den Scriptsprachen Javascript und VBS) angepasst für Batchschreiber - und da codete der Sternenhimmelstuermer schon ein wenig - zur Verfügung.
Die HTA-Helpomatic gibt es auch auf dieser Webseite zum Download, war Freeware und zur freien Weitergabe bestimmt.

Anmerkung: Der Sternenhimmelstuermer erklärt so, wie ihm der Schnabel gewachsen ist - das entspricht nicht immer der Nomenklatur - aber er kann damit sich die HTA-Welt erklären...
Nachtrag: Am 01.07.2012 wurde die Abhandlung ergänzt und voraussichtlich abgeschlossen. Nun wird noch die Verwendung von Frames und Ausgabe von Batch-Ergebnissen in einen Frame erklärt.
Nachtrag: letzte Ergänzung am 23.06.2013


Inhaltsangabe
Grundlagen kurz und knapp
HTA Code und Befehlsreferenz
Scriptreferenz Formularschnipsel und VBS-Schnipsel
Frameset und Übergabe von Ergebnissen von Batches an HTA
Spezialthema: VBS und Javascript in hta gemeinsam nutzen
Spezialthema: Mathe in VBS: von den Grundrechenarten über Punktzählung bis Auswertung von Dropdownfehler
Verschiedenes: Löschen von Dateien und Dokumente mit integrierter Batch im VBS
Fazit


Grundlagen kurz und knapp

Wird ein langer Artikel, daher halten wir uns nicht mit Nebensächlichkeiten auf:

Batchschreiben können Sie, ansonsten bräuchten Sie keine GUI (grafic user interface= grafische Oberfläche).

Das steht diesmal am Ende der Kette. Die Batch liegt also irgendwo in einem Ordner und wird durch VBS in der HTA gestartet. Wir arbeiten in dieser Abhandlung nur mit relativen Bezügen.

Sie werden die Anwendung letztlich nur unter Windows zum Laufen bringen - ihre Batch kann schließlich auch nicht unter MC OS oder Linux laufen, also nicht wirklich ein Beinbruch.


Was ist eine HTA?

Eine HTA ist eine HTML-Applikation, also im Prinzip eine ordinäre Webseite mit einem klein wenig geänderten Quellcode, den Sie in einer Stunde im Prinzip auswendig lernen können - die Befehlsreferenz von HTA und nicht von html 4 oder 5....

Die HTML-Applikation wird also vom Internet Explorer als HTA-Applikation geladen (keine Sorge, Schaltflächen kann man ausblenden, was bleibt ist ein Windowsfenster, wo Sie eine Titelleiste und ein Icon zusätzlich einblenden können).

Sie können also erstmal gerne mit einer Freeware wie Kompozer die Grafikoberfläche designen, beliebige Formularelemente, Grafiken...einfügen und dann den HTA-Code nachträglich eintragen.

Kompilieren entfällt, der Code ist für jedermann einsehbar und mit einem HTML-Editor wie Phase 5 können Sie die Anwendung jederzeit im Quelltext ansehen. Dieses geht natürlich auch mit dem simplen Editor von Windows.

HTA ist also ein Container ohne Inhalt, aber mit einer tollen Eigenschaft: Sie können VBS (Visual Basic Script) oder Javascripte in einem Script einbinden. Hier ist also der Haken: Mit Javascript kommen Sie leider nicht wirklich weiter - mit VBS schon! Eine Mischung der beiden Sprachen im VBS-Script ist möglich und harmoniert prima.

Visual Basic Script ist das Pendant zu Apples Apple-Skript. Nebenbei gesagt: ein wenig cooler...

Sie können damit so ziemlich auf alles im Betriebssystem zugreifen: von Anwendungen über Dokumente jeder Coleur bis zur Zwischenablage - und innerhalb einer HTA ist das im Gegensatz zu einer HTML-Seite erlaubt und erwünscht! Die Einschränkung im Internet für HTML-Seiten gibt es nur, damit niemand ihren PC beim Besuch einer Webseite übernimmt...

Für die Profis: Verarbeitet wird das Ganze über die mshta.exe "C:\Windows\System32\mshta.exe". Die könnten übrigens schlaue Programmierer übrigens mit VBS manipulieren -:)

*.HTA ist nicht ungefährlich. Administratoren öschen teilweise die Dateiendung aus der Registry...

Voraussetzungen für Einsatz einer HTA?

- windows
- Internet Explorer ist Voraussetzung, ansonsten keine VBS-Applikationen - diese Abhandlung beruht auf VBS!
- Scripting muss in ihrem Windowssystem erlaubt sein
- Beim Zugriff auf die Zwischenablage kommt eine Rückfrage vom System - zumindest das erste Mal...

Bearbeitungssoftware

Editor reicht erstmal. Phase 5 oder Kompozer als Ergänzung, um das ein wenig simpler zu machen, wenn Sie sich grafisch austoben wollen....

In der Software HTA-Helpomatic haben Sie eine grafische Oberfläche in englischer Sprache, in deren Frames bzw. Fenstern Sie den Quellcode verändern können und sich das Ergebis sofort zeigen können - das spart viel Arbeit und Sie können Codeschnipsel aus dem Internet umgehend testen...


HTA Code und Befehlsreferenz

Erstmal das Probebeispiel für das HTA-Gerüst aus dem o. a. Helper mit Erklärung und danach die Befehlsreferenz. Dieses Kapitel sollten Sie nur überfliegen und die Tabelle kopieren.
Richten Sie sich ruhig Vorlagen ein, wenn Sie gleichartige Batches schreiben. Der Code für den Run-Button, Radiobutton oder Entnahme aus der Zwischenablage kommt dann im nächsten Kapitel:

Basisquellcode von HTA Helpomatic der Scripting Guys von der Microsoft Corporation mit besten Dank im Sinne der Freewarebewegung zitiert:

<html>
<head>
<title>HTA Helpomatic</title>

<HTA:APPLICATION
     ID="objHTAHelpomatic"
     APPLICATIONNAME="HTAHelpomatic"
     SCROLL="yes"
     SINGLEINSTANCE="yes"
     WINDOWSTATE="maximize"
>
</head>

<SCRIPT Language="VBScript">
Hier Tragen Sie die VBS-Code-Schnipsel ein!
</SCRIPT>
<body>
<div>Hier Tragen Sie z. B. einen Formularschnipsel und den Runbutton ein </div>
<br>
<div>Mit br erzeugen Sie eine leere Zeile - diesen Tag brauchen Sie nicht zu schließen </div></body>
</html>


Ist nur mal ein wenig zur Orientierung...Eine HTML-Datei besteht aus Kopf und Körper.
 Eingeschlossen ist das in Tags (gesprochen: TÄKS).  Die Tags werden geöffnet(<html>) und geschlossen ( </html>). Dazwischen stehen dann - soweit zugelassen - andere Tags.

<head>....</head>  Im Kopf verbraten wir also den eigentlichen Code für den "Container HTA". Selbstverständlich können im Kopf weiterhin andere Angaben stehen bleiben.  <title>HTA Helpomatic</title> ist der Titel, der am oberen Rand angezeigt wird und hat mit der HTA nichts zu tun. Zwischen <HTA:APPLICATION  und >  stehen die HTA-Anweisungen, die in der folgenden Tabelle ausgeührt werden. Wie sie unschwer erkennen können sind nur die ersten 2 Zeilen wirklich interessant, der Rest sind schon Anweisungen über das Erscheinungsbild...

Jetzt wird es selbst für den Sternenhimmelstuermer ein wenig Spanisch. Das Script wird zwischen Head und Body gelegt.  Akzeptieren Sie es einfach - die Scriptguys haben sich bestimmt dabei was gedacht...

Im Body können Sie sich jetzt austoben. Zwischen <P> </p> tragen Sie Text ein. Mit <br> Erzeugen Sie Leerzeilen - das dient der Optik. Geht natürlich alles professineller...

So, jetzt werden wir erstmal uns der Befehlsreferenz zuwenden, die Befehlsreferenz stammt von der Microsoft-Corporation, wurde aber um eine Spalte ergänzt: Was nützt eine Befehlsreferenz bei der die Argumente fehlen?:

Eigenschaft

Beschreibung der im Head stehenden HTA-Vefehle

Code zum Kopieren/
Beispiel

ApplicationName

(Name der Applikation)

Name der HTA. In der Reiterkarte Anwendungen im Taskmanager wird dieser so angezeigt. Unter Prozesse werden Sie dann auch die mshta.exe finden...,

Wichtig auch für die Instanz SingleInstance

Wichtig

APPLICATIONNAME="beliebiger Name"

Border

(Rahmentyp)

 thickfür ein Fenster mit änderbarer Größe 
thin für ein Fenster mit fester Größe
none: keine Anzeige des Rahmens
dialog: verhindert die Umstellung der Fenstergröße

Optional
Border="none"
Border="dialog"
Border="thin"
Border="thick"

Caption

(Titelleiste)

Anzeige der Titelleiste: Standardwert: Yes

Optional
caption:"yes"
caption:"No"

MaximizeButton

Minimize Button

Anzeigen der Schaltflächen Minimieren bzw. Maximieren in der Titelleiste der HTA.

Standardwert: Yes.

Optional
MaximizeButton="Yes"
MaximizeButton="No"
Minimize Button="Yes"
Minimize Button="No"

Scroll

Anzeige der Bildlaufleiste bei Überschreitung con Text der Fenstergröße

Optional
Scroll="Yes"
Scroll="No"

ShowInTaskbar

(Anzeigen in Taskbar)

Anzeige der HTA in Taskleiste.Standardwert: Yes.

Optional
ShowInTaskbar="Yes"
ShowInTaskbar="No"

SingleInstance

(Einzelinstanz)

Standardwert: yes, verhindert die Öffnung weierer Instanzen

Optional
SingleInstance="Yes"
SingleInstance="No"

SysMenu

Anzeige des Systemmenü-Icon in der Titelleiste der HTA, Standardwert: Yes.

Optional
SysMenu="Yes"
SysMenu="No"

WindowState

Größe des HTA-Fensters fest beim Start. Mögliche Werte sind Normal, Minimize und Maximize. Der Standardwert: Normal.

Optional
WindowState="Minimize"
WindowState="Normal"
WindowState="Maximize"

Quelle der Tabelle: Microsoft Technet in abgewandelter Form. Der Sternenhimmelstuermer bedankt sich bei der Microsoft Corporation.
Vertiefung: Schwerpunkt-Seminar - Thema „HTA“, PDF - einfach bei Google eingeben- Ist wirklich eine nette Einführung auf 16 Seiten....



Scriptreferenz Formularschnipsel und VBS-Schnipsel


Erstmal unser Basisscript, dann eine kurze Erklärung der Grundelemente und danach eine Tabelle mit angepassten Code zur Ausgabe der erlangten Daten in ein Textdokument.

 Erstellen Sie dazu ein Textdokument in einem beliebigen Ordner, geben vorzugsweise den Namen der HTA ein und verändern die Dateiendung in *.hta. Danach kopieren Sie sich den Code in das Dokument.

Dazu erstellen Sie eine Batchdatei Namens ergebnis.bat mit folgenden Inhalt im selben Ordner: start "" "C:\"
Die Anweisung ist ein wenig unsinnig, da Sie nur den Ordner c:\ öffnet - egal, es geht nur drum, das Sie sehen, das eine Batch gestartet wird und ein Textdokument erstellt wird...


Den  folgende Code in ein Textdokument kopieren, den roten Pfad zur Batch anpassen - der muss leider absolut sein - HTA starten Text in Textärea eintragen und Run-Button drücken - fertig:

<html>
<head>
<title>HTA Hilfe für Batchschreiber</title>

<HTA:APPLICATION
         APPLICATIONNAME="HTAHilfe"
     SCROLL="yes"
     SINGLEINSTANCE="yes"
     WINDOWSTATE="maximize"
>
</head>

<SCRIPT Language="VBScript">
Sub RunScript
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("test.txt")
    Set objFile = objFSO.OpenTextFile("test.txt", 2)
    objFile.WriteLine  BasicTextArea.Value
objFile.Close
dim shell
set shell = createobject("wscript.shell")
shell.run """C:\ihr Pfad zur Batch\ergebnis.bat"""
End Sub
</SCRIPT>
<body>
<div> Erzeugt ein Eingabefeld für einen Text<div><textarea name="BasicTextArea" rows="5" cols="75"></textarea> </div>
<br>
<div>Jetzt noch ein Run-Button</div>
<input id=runbutton  class="button" type="button" value="Run Button" name="run_button"  onClick="RunScript">
</body>
</html>


Entweder sagen Sie jetzt: So einfach ist das oder bekommen einen Schreikrampf - die Wahrheit liegt dazwischen -:)

Der Aufbau einer HTA wurde bereits erklärt - jetzt beschränken wir uns nur auf die Teile, die durch Copy und Paste aus der Tabelle mit Codeschnipseln das Ergebnis liefern.

Fangen wir mit dem gelben Text in den Body-Tags an:


Die Textarea

<div><textarea name="BasicTextArea" rows="5" cols="75"></textarea> </div>

Wir erstellen eine Textärea, in dem der User die Eingabe macht.

Der Sternenhimmelstuermer baut die durch Das DIV-Tag in einen für sich geschlossenen Bereich ein - wie eben die Textbausteine. Das geht O. K.

Die Formularfunktion heißt Textärea.

Wichtig ist der Name in Anführungszeichen, den die Scriptguys BasicTextArea nannten. Sie können einen anderen Namen wählen -
 Denken Sie aber daran - wann immer Sie dieses Feld mit Usereingaben adressieren wollen, müssen Sie diesen Namen auch verwenden.
Das Script weiß letzten Endes nur, was Sie machen wollen, wenn es die Angaben bekommt....

rows und cols sind Reihen und Zeichen. In diesem Fall 5 Reihen a 75 Zeichen.
Das passen Sie nach ihren wünschen an - Anführungszeichen nicht vergessen!

Der Tag Texärea wird wieder geschlossen - Klasse, Sie haben ein beschreibbares Textfeld definiert.


Der Runbutton (Startschaltfläche für User)

<input id=runbutton  class="button" type="button" value="Run Button" name="run_button"  onClick="RunScript">

Nachdem der Text vom User eingegeben wurde, muss der Text nun bearbeitet werden. Dazu bietet sich ein Run Button an:

Der Buttun wird definiert. Den Text können Sie 1:1 immer übernehmen.  Ab Value wird es interessant: Das ist der Text auf dem Button (Run Button).

onClick="RunScript" ist die wichtigste Zeile überhaupt. Sobald der User auf den  Run Button drückt, wird ein VB-Skript ausgeführt, dass den Namen RunScript besitzt. Willkommen im VBS.


Das VB-Script

Das VB Script in kleinen Happen (weißer Text) zwischen Skripttags (<SCRIPT Language="VBScript">Skripttext</SCRIPT>).

Sub RunScript

Das Skript wird erst mit mit Betätigung des Run Button ausgeführt. Sub ist also eine Unterordnung des Skriptes unter den Runbutton.

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("test.txt")
    Set objFile = objFSO.OpenTextFile("test.txt", 2)
    objFile.WriteLine  BasicTextArea.Value
objFile.Close

Das ist der Kern unseres Scriptes und der Beispielskripte in der Tabelle. In der ersten Zeile wird nur ein Objekt definiert. Set objFSO ist Batchschreibern nicht ganz unbekannt. Richtig eine Variable wird mit set definiert. Das geht bekanntlich auch mit Dim..

Hinter dem Gleichheitszeichen wird bestimmt, dass ein Objekt erstellt wird CreateObject (). Das ist etwas geschriebenes (Scripting) in unserem Windowssystem ( Datei File.SystemObjekt). Dazwischen ein Punkt. Hier wird eine Hülle für ein Objekt kreiert.

Ist immer wichtig, um uns in einer Hierarchie langsam herabzuhangeln...

In der Zweiten Zeile wird das dann präzisiert. Eine Textdatei wird in unserer Hülle erstellt. In Klammen dann die Art: Ein Textdokument mit Namen Test.txt.

Hinweis: Sie können gern daraus test.html, test.csv, oder test.log machen - also jede beliebige Textdatei kann innerhalb des Skripting-Objektes erstellt werden...-Ist halt der Inhalt der Hülle.

In der nächsten Zeile wird die neu erstellte Textdatei  (openTextFile()) öffnet.

Nebenbei geben wir nun eine 2 als Schreibmethode ein, die ein wenig destruktiv ist. Alte Texte in dieser Datei werden gelöscht. Eine 8  hängt Text an, was nichts anderes heißt, das bei einem weiteren Betätigen des Run Button eine Zeile angehängt wird (sehen Sie im letzten Teil der Formularschnipsel in der Tabelle nach, da wird dann gezeigt, wie Sie eine durch kommagetrennte Datenbank mit zwei Textären  erstellen und bei neuen Eingaben des Users und Betätigen des Runbuttons weitere Zeilen angehängt werden).

In diese Variable wird mit dem untergeordneten Befehl WriteLine (wieder durch Punkt getrennt) unsere
BasicTextArea.Value (Also von unserem fest definierten Namen BasicTextArea nach einem Punkt der Value (also die Eingabe des Users) ausgegeben:

<textarea name="BasicTextArea" rows="5" cols="75"></textarea>

Sie erinnern sich an die orange Zeile? Dort stand der Name. Der Value wurde natürlich noch nicht definiert - Das geschieht erst mit der Eingabe des Users!

Am Ende wird das Textdokument geschlossen!

Dann kommt noch der Start unserer Batch:

dim shell
set shell = createobject("wscript.shell")
shell.run """C:\ihr Pfad zur Batch\ergebnis.bat"""
End Sub

Dim ist fast dasselbe wie set. Wir definieren ein Objekt (leere Hülle), in der diesmal ein Befehlszeilenscript liegt. Der Pfad ist dann der Pfad zur Batch, deren Inhalt dann mit dem Run-Befehl zum Laufen gebracht wird.  Die shell soll run (wieder mit einem Punkt getrennt), also die Batch starten.

End Sub

Alles, was nach der Ausführung des Runbuttons im Raum zwischen Sub RunScript und End sub stand ist nun abgearbeitet - man könnte jetzt auch munter weiterskripten, aber das wären dann Aktionen, die nicht vom Runbutton ausgelöst werden.

Was als Batchschreiber teilweise schwer verständlich ist, dürfte die Syntax sein, die ganz schön ähnlich wie Javascript ist. Alles muss adressiert, Variablen laufend definiert und in der richtigen Reihenfolge angesprochen werden, was im Grunde genommen auch in einer Batch gemacht wird - Sie würden ja auch nicht auf die Idee kommen, den Dateipfad rückwärts einzutragen!

Die nächste Tabelle gibt nun alle Elemente aus dem Formularbereich und darüber hinaus sinnvolle Anwendungsmöglichkeiten in VBS an. Dazu ein immer leicht modifizierten VBS-Schnipsel. Der Code für den Run Button und starten der Batch bleiben gleich. Ja, da bleiben viele Fragen offen, aber Sie werden diese Tabelle lieben:

Formularfeld/Funktion Code body
<body>....</body>

Code VBS
<SCRIPT Language="VBScript">....</SCRIPT>
Erklärung
Textarea <div> Erzeugt ein Eingabefeld für einen Text</div><div><textarea name="BasicTextArea" rows="5" cols="75"></textarea> </div>
<br>
<div>Jetzt noch ein Run-Button</div>

Sub RunScript
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("test.txt")
    Set objFile = objFSO.OpenTextFile("test.txt", 2)
    objFile.WriteLine  BasicTextArea.Value
objFile.Close
End Sub
Haben wir eben bereits erörtert. Das wird jetzt immer ein wenig kürzer. Im Textdokument zum Download dazu den Quellcode für eine Demo-Anwendung in HTA :
 Aerea.txt.

Im Body die Anweisung:

<input id=runbutton  class="button" type="button" value="Run Button" name="run_button"  onClick="RunScript">

-----
Der Start für eine Batch muss wie folgend beschrieben vor dem   End Sub eingefügt werden:

dim shell
set shell = createobject("wscript.shell")
shell.run """C:\ihr Pfad zur Batch\ergebnis.bat"""

Dieser Codeschnipsel muss wie gesagt vor dem End Sub eingefügt werden.

Vorsicht: 2 steht für destruktives Schreiben (alter Text in Dokument wird gelöscht! ) 
Textbox <div><input type="text" name="BasicTextBox" size="50"></div> Sub RunScript
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("test.txt")
    Set objFile = objFSO.OpenTextFile("test.txt", 2)
    objFile.WriteLine  BasicTextBox.Value
objFile.Close
End Sub
Testbox ist fast dasselbe wie eine Textärea, nur in diesem Fall einzeilig mit 50 Zeichen.
Der Name des auszudruckenden Textes wurde nun BasicTextBox genannt.

Der Name der Textbox(name="BasicTextBox") entspricht also immer dem Namen des druckbaren Bereiches und als nähere Beschreibung (nach dem Punkt) kommt der Value (Wert) , der erst vom User eingegeben wird.

HTA: Textbox.txt

Vorsicht: 2 steht für destruktives Schreiben (alter Text wird gelöscht! )
Listbox <div><select size="3" name="DropDown1" multiple>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
<option value="4">Option 4</option>
</select></div>
Sub RunScript
    For i = 0 to (Dropdown1.Options.Length - 1)
        If (Dropdown1.Options(i).Selected) Then
            strComputer = strComputer & Dropdown1.Options(i).Value & vbcrlf
        End If
    Next
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("test.log")
    Set objFile = objFSO.OpenTextFile("test.log", 2)
    objFile.WriteLine strComputer
    objFile.Close

End Sub
Das ist jetzt ein wenig angepasster Code. In einer Listbox stehen also die Bezeichnungen Option 1, Option 2...Option 4. Die Nummer hinter Option ist nur zur Orientierung gedacht, kann aber auch irretieren.
Die Zahlen 1-4 in den option value werden an das Textdokument über VBS übergeben - besser gesagt eine Zahl, je nach Auswahl des Users. strComputer ist die Variable für die Ausgabezahl. In der For Schleife steht: Für die Dropdownfelder 1-4 , wenn (if) im Dropdown1 eine unbekannte Option(i) vom User ausgesucht wurde , dann ist der Value  (1,2,3 oder 4) der Option auszugeben.

Den Code anzupassen ist mittelschwer. Die Zahlen von Option value würde der Sternenhimmelstuermer so lassen. 1-3 (select size) - mehr Optionswerte wären auch kein Problem - Optionswerte sind kein Problem, da die For-Schleife mit einer unbekannten Anzahl i von über 0 bis unbekannte Länge (length-1) arbeitet.

Ja, dass ist wieder so ein wenig dämlich: VBS und Javascript fangen an bei 0 zu Zählen. O-3 sind also 4 Auswahlmöglichkeiten - dabei ist die select size 3, also 0,1,2,3 und 4. Da kann der Durchschnittsuser ganz schön ins Schlittern kommen - also bei 5 Namen zum Aussuchen ist select size=" 4".

Die For-Schleife arbeitet nur mit DropDown1, dem option value in unbestimmter Anzahl und strComputer ist wieder so eine definierte Variable, die Sie umbenennen können - dann aber an drei Stellen: zwei Mal im Runscript bei der Definition und unten blau markiert bei der Ausgabe. vbcrlf gibt die unterstehemdem Werte aus - sonst würde immer derselbe Wert ausgegeben...

Wählt der User Option zwei, so wird die Zahl 2 und nicht der Wert ausgegeben!
Das sollten Sie in der Batch berücksichtigen!

Ist nicht 100 % richtig erklärt, aber der Rahmen stimmt-:)

HTA: Listbox.txt

Vorsicht: 2 steht für destruktives Schreiben (alter Text wird gelöscht! )


Dropdownmenü <div><select size="1" name="DropDown1" onChange="RunScript">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
<option value="4">Option 4</option>
</select></div>
Sub RunScript
        Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("test.log")
    Set objFile = objFSO.OpenTextFile("test.log", 2)
    objFile.WriteLine DropDown1.Value   
objFile.Close
End Sub
Hier ist alles wieder einfach. DropDown1 ist die Oberadresse und Value wieder der Wert aus dem Dropdownmenü. Wäre es doch immer so einfach...die Listbox ist im Vergleich dazu eine glatte Fehlkonstruktion - Das Dropdownmenü im Vergleich ist doch viel humaner.... Ach ja, Hier wird on change als Auslöser als Auslöser gewählt, was bedeutet, dass beim Wechsel automatisch die übergebene Zahl im Textdokument geändert wird. Können Sie natürlich tauschen...einfach mal bei Google nachschauen.

HTA Dropdownmue.txt

Vorsicht: 2 steht für destruktives Schreiben (alter Text wird gelöscht! )
Checkbox <div> Erzeugt eine checkbox</div><div><input type="checkbox"name="BasicCheckbox"value="1"> Option 1</div>
<br>
<div>Jetzt noch ein Run-Button</div>
<div><input id=runbutton  class="button" type="button" value="Run Button" name="run_button"  onClick="RunScript"></div>
Sub RunScript
    If BasicCheckbox.Checked Then
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("test.log")
    Set objFile = objFSO.OpenTextFile("test.log", 2)
    objFile.WriteLine   BasicCheckbox.value objFile.Close   
    Else
        Msgbox "Es wurde nichts ausgewählt"
    End If
End Sub
Ein Häkchen mit Meldung, wenn nichts ausgewählt wird: Beim Radio Button wird auf eine Mehrfachauswahl eingegangen - Hier wird nur eine Auswahl lals BasicCheckbox deklariert. Als 1 wird der Wert (Value) ausgegeben, Auslöser ist woeder onclick für das Runskript. Wenn (if) die Basic Checkbox ausgewählt wurde, dann (then) wird wieder unser Textdokument mit dem Value 1 ausgegeben, sonst (else) wird eine Warnung im Windowsstil (Fenster) ausgegeben, das nichts ausgewählt wurde - ziemlich unsinnig für einen Wert.
Ansonsten können Sie
Else
        Msgbox "Es wurde nichts ausgewählt"
löschen und die Meldung ist Passe...

Ging hier nur drum die Msgbox vorzustellen.

HTA: Checkbox.txt

Vorsicht: 2 steht für destruktives Schreiben (alter Text wird gelöscht! )
Radiobutton <div> <input type="radio" name="UserOption" value="1">Option 1<BR>
<input type="radio" name="UserOption" value="2">Option 2<BR>
<input type="radio" name="UserOption" value="3">Option 3<BR>
</div>
Sub RunScript
    If UserOption(0).Checked Then
        Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("test.log")
    Set objFile = objFSO.OpenTextFile("test.log", 2)
    objFile.WriteLine   UserOption(0).value
objFile.Close   
    End If
    If UserOption(1).Checked Then
        Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("test.log")
    Set objFile = objFSO.OpenTextFile("test.log", 2)
    objFile.WriteLine   UserOption(1).value
objFile.Close
    End If
    If UserOption(2).Checked Then
        Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("test.log")
    Set objFile = objFSO.OpenTextFile("test.log", 2)
    objFile.WriteLine   UserOption(2).value
objFile.Close
    End If
End Sub
Ganz schön viel Holz für die mickrige Ausgabe einer Zahl in einem Textdokument. Die Optionen 0, 1 und 2 werden gecheckt (Javascript wird immer bei Null angefangen zu zählen, so dass bei der Auswertung wieder UserOption(0) für den Wert (value) 1 genommen wird. Wenn Sie weitere Optionsfelder einfügen - nie das End If am Ende vergessen.

HTA: Radiobutton.txt

Vorsicht: 2 steht für destruktives Schreiben (alter Text wird gelöscht! )

Jetzt verlassen Sie den Tabellenbereich und noch ein paar Tipps zum Bearbeiten: Angefangen bei dem Auslesen der Zwischenablage und noch ein paar Tips zu Textdokumenten und der Ausgabe allgemein
Zwischenablage
auslesen (Text)
<html>
   <head>
     <title>TEST</title>
     <hta:application scroll="no" windowState="normal">
<style type="text/css">
 .auto {
 background: #00BFFF;
 height: 300px;
 overflow: auto;
 width: 400px;
 border: 1px solid #000;
 padding: 10px;
 }
</style>
  </head>
<script language="VBScript">
sub Rundoku
      DataArea.InnerHTML = document.parentwindow.clipboardData.GetData("text")
End Sub
  </script>
  <body>
     <div id=DataArea class="auto"><center><input id=runbutton  class="button" type="button" value="Ergebnis" name="run_button"  onClick="Rundoku"></center></div>
   </body>
</html>
<script language="VBScript">
sub Rundoku
      DataArea.InnerHTML = document.parentwindow.clipboardData.GetData("text")
End Sub
Der Text der Zwischenablage wird im Div-Container mit der ID "dem Namen" DataArea ausgegeben. Das Script schreibt den Inhalt  in die ID DataAerea in der HTML-Seite (InnerHTML). Dort wird im document - im selben Fenster (parentwindow) - Der Inhalt der Zwischenablage (clipboardData) herausgeholt (getData("text")), der in diesem Fall Text ist bzw. nur für Text gilt..

Zwischenablage.txt

Die Ausgabe erfolgt in einem DIV-Container, der nochmal ausführlich bei Ausgabe an HTA erklärt wird.
Textärea: Text hinzufügen <div> Erzeugt ein Eingabefeld für einen Text</div><div><textarea name="BasicTextArea" rows="5" cols="75"></textarea> </div>
<br>
<div>Jetzt noch ein Run-Button</div>
Sub RunScript
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("test.txt")
    Set objFile = objFSO.OpenTextFile("test.txt", 2)
    objFile.WriteLine  BasicTextArea.Value & " Hier wird ein Text eingefügt"
objFile.Close
End Sub
Die Erklärung haben Sie bereits unter Textaerea: Hier wird nur ein Text zum Text des Users hinzugefügt. Hinter objFile.WriteLine kann nach einem Leerzeichen beliebiger Text oder Variablen in unbegrenzter Anzahl stehen.

Das gilt selbstverständlich für alle Formularelemente.

Das & ist dasselbe wie bei Batches. Das Leerzeichen vor Hier ist wichtig, da sonst der Text des Users ohne Leerzeichen mit dem Text ausgedruckt wird!

Variationen:
objFile.WriteLine "Name: " & BasicTextArea.Value

Vorsicht: 2 steht für destruktives Schreiben (alter Text wird gelöscht! )
Textärea: Datenbank mit zwei Formularfeldern: nicht
distruktive Ausgabe
mit  Prüfung, ob Dokument existiert und Anlegung von neuem Dokument

<div> Erzeugt eine Datenbank mit Komma, bei der Text im Textdokument hinzugefügt wird </div>
<div>Nachname:</div><div><input type="text" name="BasicTextBox" size="50"></div>
<br>
<div>Vorname:</div><div><input type="text" name="BasicTextBox1" size="50"></div>
<br>
<div>Jetzt noch ein Run-Button</div>
<input id=runbutton  class="button" type="button" value="Run Button" name="run_button"  onClick="RunScript">

Sub RunScript

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
if fso.FileExists("test.csv") then
Set objFSO = CreateObject("Scripting.FileSystemObject")
        set objFile = objFSO.OpenTextFile("test.csv", 8, false)
    objFile.WriteLine  BasicTextBox.Value & "," & BasicTextBox1.Value
objFile.Close   
else
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("test.csv")
    Set objFile = objFSO.OpenTextFile("test.csv", 2)
    objFile.WriteLine  BasicTextBox.Value & "," & BasicTextBox1.Value
objFile.Close
end if
End Sub
Wir haben jetzt zweimal eine Textära erstellt, einmal mit dem Namen BasicTextBox und dann BasicTextbox1. RunScript wird wieder durch den Button ausgeführt.
Mit dim fso wird eine Variable definiert. Die ist ein Scripting.FileSystem Object.

Wenn (if)  relativ im Pfad eine Datei (fso.FileExists) mit Namen Test.csv (*.csv Tabellenformat mit Excel lesbar), dann (then) kreieren wir wieder eine Hülle (create object) mit dem Inhalt der CSV-Datei, die wir öffnen (OpenTextFile) und beschreiben, aber diesmal mit Hinzufügen eines Textes (8). Erinnern Sie sich? 8 steht für Text anfügen in neuer Zeile, 1 für lesen und 2 steht für destruktives Schreiben (alter Text wird gelöscht! ). In das geöffnete Dokument schreiben wir die beiden Eingaben des Users
(BasicTextBox.Value & "," & BasicTextBox1.Value) mit einem Komma getrennt, wie in der letzten Zeile beschrieben Wert 1, ein Komma, Wert 2.

Was aber, wenn dieses Dokument nicht existiert?

Dann erstellen wir es einfach mit (else) mit unserem standard-destruktiven Erstellen und Beschreiben eines neuen Dokumentes. Das end if ist nur das Ende des if... then... else... Abarbeitens und obligatorisch. Bei jeder neuen Eingabe wird also das Dokument von neuem geöffnet und der Text des Users angefügt: Das ist eine perfekte Anwendung zur Erstellung einer Datenbank, andere nehmen dafür Access, dabei gibt es das Umsonst -:)

HTA: Datenbank
Zip Engisch: Code in Textdatei kopieren und Dateiendung in *.vbs umwandeln Ja, mit vbs ist es möglich ohne Zip-Programm Dateien aus einem ZIP-Archiv zu extrahieren oder umgekehrt zu verpacken - manch ein Batchschreiber wird hier vor Neid platzen. Sie müssen nur noch den Pfad  anpassen - beim Entpacken Unzip ZipFile= ihren Pfad und bei ExtractTo= den Pfad zum Zielverzeichnis mit / am Ende,

beim Zippen ist src die Quelle (der Ordner der komptrmiert wird)  und  dest (Destination das Ziel mit Endung *.zip)-

Vorsicht: Sie brauchen sich nicht irgendwelche suspekten Exe-Dateien oder Bibliotheken oder dll`s downloaden. Das ging übrigens schon seit Urzeiten so und der Sternenhimmelstuermer staunt, dass teilweise gestandene Admins ein Zusatzprogramm nutzen.  Die Links hier sind seriös!

Die Nachteile: Ist halt aus Windows 98 -Zeiten und der Komprimierungsgrad und die Schnelligkeit ist bei PDF`s und Doc`s...suboptimal - ursprünglich war das Mal für *.bac- Dateien gedacht - windows 98 lässt grüßen...

Demo eine Zelle tiefer!
Das Einbinden in die HTA ist wie immer möglich. Sie erstellen zwei Textäreafelder und einen Run-Button. Danach tauschen Sie im Script die Pfade gegen unsere BasicTextArea.Value und BasicTextArea1.Value - müsste ohne Anführungszeichen sein - bin zu faul das auszuprobieren - falls Probleme, bitte posten....
Sie sollen ein wenig selbst das Gefühl zum Coden entwickeln...
Unzip Englisch: Text kopieren und Dateiendung in *.vbs umbenennen 
Dialogfenster für Ordnerexplorer aufrufen und Pfadausgabe Der Aufruf des Dialogfensters vom Explorer zum Suchen von Ordnern ist eine sinnvolle Ergänzung und sieht megaprofessionell aus.

In der Demo-HTA Ordner aussuchen und kompremieren wird aus zwei VB-Schnipseln eine "sinnvolle" Anwendung : Schauen Sie sich die Demo an...

Die Nachteile der Demo: Ist halt aus Windows 98 -Zeiten und der Komprimierungsgrad und die Schnelligkeit ist bei PDF`s und Doc`s... beim Zippen suboptimal - ursprünglich war das Mal für *.bac- Dateien gedacht - windows 98 lässt grüßen...

Wir brauchen diesmal keine grafische Oberfläche - die ist im Auswahlmenü implizit vorhanden -:)

In einer Batch würde der Sternenhimmelstuermer das mit einem wait-Befehl koppeln, die VBS starten und danach den Text abgreifen...

Die Ausgabe in eine Textdatei ist wie immer easy - Ordnerpfad.path ist unsere Ausgabevariable und mit objFile.WriteLine  Ordnerpfad.path ist das nach Schema F schnell erledigt. Wenn Sie das immer noch nicht können sollten, dann schauen Sie mal ein wenig weiter oben in der Tabelle - Wiederholung macht den Meister....

Auswahl = "Ordner auswählen und im selben Ordner befindet sich die gezippte Datei"
StartOrdner = "C:\"
Set Auswahl = CreateObject("Shell.Application").BrowseForFolder(0,Auswahl,16,Ordner)
If TypeName(Auswahl) = "Nothing" Then
    MsgBox "Abbruch"
    WScript.Quit

Else
    Set Ordnerpfad = Auswahl.Self

    End If

Dim src
Dim dest
src = Ordnerpfad.path
dest = Ordnerpfad.path & ".zip"

'write zip file header
Set fso = createobject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile(dest, 2, True)
file.write "PK" & chr(5) & chr(6) & string(18,chr(0))
file.close

Set shl = createobject("Shell.Application")
shl.namespace(dest).copyhere shl.namespace(src).items
Do until shl.namespace(dest).items.count = shl.namespace(src).items.count
wscript.sleep 100
Loop       

Dieser rote Teil ist für das Zippen zuständig - der erste Teil der an sich wichtige - ist aber zusammen eine neue Anwendung - irgendwie Cool - selbst zusammengebastelt...

Also, der Text in der ersten Reihe wird Ihnen in der Dialogbox angezeigt. Der Start des Dialogfensters ist Laufwerk c:\

Den Startpunkt können Sie beliebig ändern

Es wird ein BrowserForFolder - Menü angezeigt. Die Parameter sind erst einmal unerheblich - funktioniert so...

Wenn (if) nichts ausgewählt, dann kommt wieder eine MSGBOX mit Textinhalt Abbruch - ist wieder so eine Ausgabe im Windowsfensterstil..

 Folge: Script wird abgebrochen...ansonsten (else) wird der ausgewählte Ordnerpfad als Auswahl gespeichert ---Danach wird die Quelle (src) als unsererer Ordnerpfad definiert. Hier könnte auch manuell "c:\beliebiger Pfad" stehen.

Als Destination (dest=Ziel) wird wieder der Pfad zu unserem Ordner/Verzeichnis gelegt - diesmal aber die Endung .zip durch das &  angehängt.

Im Zielordner wird also eine Zip-Datei gleichen Namens erstellt. Bei dest könnten Sie wieder "c:\beliebiger Pfad" eintragen nur C:\ alleine würde nicht gehen, denn C:\.zip wäre kein logischer Pfad...Verstanden?
Sobald Sie aber eine Hierarchie tiefer gehen c:\belName ist der Pfad zur Zip C:\belName.zip!

Wie dem auch sei - der zweite Teil des Scripts zippt den Ordner: Schauen Sie dann im  Link nach oder googlen nach den Befehlen ist sonst zu lang....

Diesmal den Text kopieren und in beliebigerName.vbs umbenennen. Nach Doppelklick öffnet sich ein Dialogfenster Ordner aussuchen und mit O. K. bestätigen:

Demo : ordner.vbs

Die fertige kompremierte Datei liegt im Ordner - sehr fehlerträchtig, langsam, nicht sehr empfehlenswert aber nicht distruktiv - die alten Dateien bleiben, wo Sie sind! Kopien sind im Zip-Archiv - also keine wirkliche Gefahr...
Dialogfenster für Dateien und Ausgabe
des Pfades in einem Dialogfeld
Das Aufrufen eines Dialogfensters für Dateien und Kopieren des Pfades reinem VB-Script ist ein wenig schwierig und wurde auf dieser Seite mit VBS: VBS zeigt Dateipfad an,
Für HTA sind das nur zwei Zelien Code:

im Body: <div><input Application="True" type="file" id="FileName" /><div>
Diesmal etwas außergewöhnlich im Headbereich ohne VB-Script-Tag:

<hta:application applicationname="Open File" border="dialog" borderstyle="normal" caption="Open File" contextmenu="no" maximizebutton="no" minimizebutton="no" navigable="no" scroll="no" selection="no" showintaskbar="no" singleinstance="yes" sysmenu="no" version="1.0" windowstate="minimize">
Funktionsweise: Es wird Ihnen ein leeres Textfeld mit einem Button mit der Aufschrift "Durchsuchen" angezeigt. Wenn Sie den Button durchsuchen anklicken, so wird das Explorer-Dialogfenster zur Suche von beliebigen Dateien angezeigt. Dort suchen Sie wie gewohnt die Datei aus. Der Dateipfad wird dann im Inputfeld angezeigt.Der Umweg über das Inputfeld ist Pflicht...
Ansonsten wieder ein Beispiel, dass ein Textdokument erstellt oder in ein bestehendes den ausgewählten Pfad anzeigt
URL (Internetadressen) aus geöffnetem Broser
extrahieren
Internetadresse, Datum und Uhrzeit ergänzend bei Betätigung des VBS in ein Textdokument eintragen. Der Sternenhimmelstuermer schrieb dazu eine Abhandlung - auch die Weiterverarbeitung mit der CMD wird berücksichtigt!
Dim browserurl
Set browserurl = CreateObject("Shell.Application").Windows
If browserurl.Count > 0 Then
For Each oWindow In browserurl
    If UCase(Right(oWindow.FullName, 12)) = "IEXPLORE.EXE" Then
adresse = oWindow.LocationURL & " " & date & " " & time
End If
  Next
End If
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
if fso.FileExists("test.log") then
Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile("test.log", 8)
    objFile.WriteLine adresse 
objFile.Close
else
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("test.log")
    Set objFile = objFSO.OpenTextFile("test.log", 2)
    objFile.WriteLine adresse
objFile.Close
end if
Interessant sind die blauen Zeilem. Die weißen sind fast eine Originalkopie von dem Tabellenpunkt Datenbank: Textära.
Ist noch kein Log-Dokument da, so wird es erstellt, ist eins da, so wird es ergänzt. In der Kommandozeilensprache braucht man nicht so ein wust - da reichen die Ausgabezeichen >> (in verdoppelter Form - das erstellt auch - falls benötigt - ein neues Dokument.

Dim browserurl
Set browserurl = CreateObject("Shell.Application").Windows

Variable wird wieder erstellt wichtig ist nur die zweite Zeile nach dem Gleichheitszeichen.
If browserurl.Count > 0 Then
Kurze Überprüfung, ob eine Adresse im folgenden Objekt ist:

For Each oWindow In browserurl
    If UCase(Right(oWindow.FullName, 12)) = "IEXPLORE.EXE"
Ab if wird es absolut interessant: Hier wird endlich nach lauter Definitionen die Browseradresse extrahiert.
                                                          Then
adresse = oWindow.LocationURL & " " & date & " " & time

Das Ergebnis wird als Variable gespeichert. Zusätzlich werden Datum und Zeit mit Leerzeichen als Separatoren abgespeichert. Date und time sind fest definierte Variablen von Uhrzeit und Datum zum Zeitpunkt der Erfassung...
Adresse ist wiederum Grundlage für die Entscheidung, ob die Variable Adresse als Text hinzugefügt wird (8), also nicht distruktiv im test.log angehängt wird oder ein neues Dokument erstellt wird (2)

















mit Hyperlink in HTA
beliebige ausführbare Datei oder Ordner öffnen.
<html>
<head>
<title>HTA Helpomatic</title>
<HTA:APPLICATION
     ID="objHTAHelpomatic"
     APPLICATIONNAME="HTAHelpomatic"
     SCROLL="yes"
     SINGLEINSTANCE="yes"
     WINDOWSTATE="maximize"
>
<style type="text/css">
a {color:#FFFF33; font-size:10pt; font-family:verdana,sans-serif,tahoma; text-decoration:none}
a:hover {color:#FF0000; font-size:10pt; font-family:verdana,sans-serif,tahoma; text-decoration:none}
a.menu1 {color:#FFFFFF; font-family:verdana,sans-serif,tahoma; font-size:8pt; text-decoration:none}
a.menu1:hover {color:#FF0000; font-family:verdana,sans-serif,tahoma; font-size:8pt; text-decoration:none}
a.menu2 {color:#FFFFFF; font-family:verdana,sans-serif,tahoma; font-size:9pt; text-decoration:none}
a.menu2:hover {color:#FF0000; font-family:verdana,sans-serif,tahoma; font-size:9pt; text-decoration:none}
</style>
</head>
<body style="color: white; background-color: black;" alink="red"
link="yellow" vlink="#3333ff">
<p class=MsoNormal><span lang=DE style='font-weight:normal'><a
  href="c:\windows">Offline Hyperlink zum Oeffnen des Ordner windows</a></span></p>
<br>
</body>
</html>

Die Datei diesmal ein wenig mit CSS formatiert - egal, wichtig ist eigentlich nur die Zeile:

<p class=MsoNormal><span lang=DE style='font-weight:normal'><a
  href="c:\windows">Offline Hyperlink zum Oeffnen des Ordner windows</a>

Damit kann ein Ordner oder eine ausführbare Datei (*.bat) aus der HTA ausgeführt werden...

Tauschen Sie einfach den Dateipfad aus und geben dem Hyperlink einen aussagekräftigen nahmen. Funktioniert übrigens auch mit einem HTML-Dokument, aber nur mit dem Internet Explorer und offline, also auf dem heimischen PC...

So können Sie sich ein schönes Menü für Ihre BatchDateien basteln.

Bei Batchdateien kommt eine Warnmeldung (gelb umrandet und die Auswahloptionen Speichern oder Ausführen per Button - Wer jetzt den falschen Button drückt, speichert eben nochmal die Datei...

Die Abfrage ist eine logische Konsequenz der Sicherheitspolitik und keine Schikane. Ansonsten könnten böswillige Menschen ganz schönen Schadn anrichten...






Textdokument
in HTA-Textarea
impotieren
Es muss ein Textdokument mit irgendein.txt zusätzlich vorliegen,aus dem der Inhalt ausgelesen wird. Der Name des Textdokumentes kann natürlich angepasst werden...

Das Dokument muss ohne Pfadangabe relativ zur HTA liegen.

Mit Pfadangabe funktioniert es natürlich auch...

Es kursieren auch Skripte mit Schleifen und read im Internet, was aber totaler Quatsch ist, wenn man den ganzen Inhalt eines Textdokumentes in eine Textarea importieren will.

Siehe auch Spezialthema VBS und Javascript in HTA
<SCRIPT Language="VBScript">
Sub RunScript
    set oFSO1=CreateObject("Scripting.FileSystemObject")
     set oFile2=oFSO1.OpenTextFile("irgendein.txt",1)
     text1=oFile2.ReadAll
    document.all.BasicTextArea.value=text1   
     oFile2.Close
End Sub
</SCRIPT>
<body>
<div><textarea name="BasicTextArea" rows="5" cols="75"></textarea> </div>
<br>
<div>Jetzt noch ein Run-Button</div>
<input id=runbutton  class="button" type="button" value="Run Button" name="run_button"  onClick="RunScript">
</body>
Der Import eines Textdokumentesmit gesamten Inhalt wird mit dem Befehl readAll realisiert.

Statt text1 können Sie jeden beliebigen Variablennamen nehmen. Bei der mehrfachen Verwendung des Skriptes müssen Sie unterschiedliche Variablennamen verwenden. Deshalb wurden vom Autor Nummern an die freien Variablen angehängt. Diese Nummern müssen Sie bei mehrfacher Verwendung ändern - ansonsten funzt es nicht.

Eine einfache demo ohne irgendein.txt gibt es hier zum Download


Aufruf von Javascriptfunktion


irgendeinjs()




Richtig, eine Zeile mit Funktionsnamen des Javascriptes.
Das VBS arbeitet Zeile für Zeile - diesem entspricht der Inhalt der Funktion.
Kann überall dort stehen, wo Sie es brauchen, also am Anfang,  Mitte und Ende der Funktion.
Variablenübergabe geht am besten über oben angegebene Textarea. Danach wieder mit vbs auslesen - die Textarea wird zur Zwischenablage...genauso arbeitet VBS mit virtuellen Dokumenten oder der Sternenhimmelstuermer mit Batches.

Siehe auch Spezialthema VBS und Javascript auf dieser Seite!

Es können auch verschachtelte Funktionen erstellt werden - VBS startet Javascript - Javascript startet andere Javascripts...:
<script language="JavaScript">
 function irgendeinjs(){
 enctdrei();
  encode();
 enctwo();
    }
</script>

Frames
einfacher Framewechsel
mit Run-Button
Dateiname Frame.hta
<head>
<title>HTA Hilfe für Batchschreiber</title>
<HTA:APPLICATION
        APPLICATIONNAME="HTAHilfe"
    SCROLL="yes"
    SINGLEINSTANCE="yes"
    WINDOWSTATE="maximize"
>
</head>
<frameset rows="50%,50%">
 <frame application="yes"
src="frame_1.htm">
 <frame application="no" src="frame_2.htm" name="frame_2">
</frameset>

Dateiname: frame_2.htm

<htm>
<BODY>
<div>Das ist ein ursprünglicher Frame<div>
</BODY>
</htm>

Dateiname  frame_wechsel.htm

<html>
<BODY>
<div>Das ist ein Frame nach einem Framwechsel...</div>
</BODY>
</html>
Dateiname: frame_1.htm
<html>
<head>
<title>HTA Hilfe für Batchschreiber</title>
<HTA:APPLICATION
        APPLICATIONNAME="HTAHilfe"
    SCROLL="yes"
    SINGLEINSTANCE="yes"
    WINDOWSTATE="maximize"
>
</head>
<SCRIPT Language="VBScript">
Sub RunScript
    WINDOW.PARENT.FRAME_2.LOCATION.HREF="frame_wechsel.htm"
End Sub
</SCRIPT>
<body>
<div>Der Framewechsel erfolgt nach Betätigung des Buttons</div>
<br>
<input id=runbutton  class="button" type="button" value="start" name="run_button"  onClick="RunScript">
<br>
<br>
<body>
<html>
Alle Dateien in einen Ordner (relative Links).
Mit einem Doppelklick auf die Frame.hta wird die Anwendung gestartet.
frames.hta: Doppelklicken.

Die ausführenden VBScripts müssen in den anderen HTM-Frames sein, da nur das Frameset in Frame.hta   ausgelesen wird und andere Befehle ignoriert werden.

Es können keine HTA-Dateien mit der  Frame.hta in einen Frame geladen werden - es sei denn die hta soll wiederum als einzelne Instanz geöffnet werden-:)

Rows und cols: Das ist die Angabe, ob es zwei Frames übereinander (row) oder nebeneinander (cols) gibt. Der Sternenhimmelstuermer schlägt eine Angabe in Prozent danach vor, damit sich die Fenster im Browser anpassen.

Die beiden Frames frame_1.htm und frame_2.htm

Im ersten Frame_1 ist die Hauptanwendung, nämlich ein Start-Button, der den Framewechsel auslöst.

Unter dem Headbereich von frame_1.htm  ist die Ausführungsroutine im VBS.

WINDOW.PARENT.FRAME_2.LOCATION.HREF="frame_wechsel.htm"

ist der Pfad zur Framewechselseite. Das Sub RunScript wird durch Betätigen des Buttons im Bodybereich durch den User ausgelöst:

<input id=runbutton  class="button" type="button" value="start" name="run_button"  onClick="RunScript">


Tipp: Natürlich können Sie auch mit einem Betätigen des Buttons zwei Frames ändern: Einfach dem zweiten Frame einen Namen geben in frames.hta - in der Art: src="frame_1.htm" name="frame_1">
Dann noch in frame_1.htm eine Zeile in der Art:  WINDOW.PARENT.FRAME_1.LOCATION.HREF="frame_wechsel.htm" hinzufügen. Warum geht das? Im VBS Script werden die einzelnen Befehle
innerhalb des Sub Runscripts abgearbeitet - ob da nun ein Frame gewechselt wird oder zwei ist so ziemlich egal - Sie könnten auch eine Zeitschleife einbauen und das Ergebnis für zehn Sekunden anzeigen
lassen, um dann wieder zum alten Frame zurückzukehren...VBS ist echt flexibel, wenn man die Grundkenntnisse hat...
Ausgabe von Ergebnissen ohne Frame in DIV- Container

(Es können beliebige HTML, TXT oder andere unformatierte Dokumente verwendet werden;
HTML-Seiten werden in Exploreransicht mit ausführbaren Links angezeigt)
Eigenentwicklung aus
Fragmenten aus dem Internet ...
<html>
   <head>
     <title>TEST</title>
     <hta:application scroll="no" windowState="normal">
<style type="text/css">
 .auto {
 background: #00BFFF;
 height: 300px;
 overflow: auto;
 width: 400px;
 border: 1px solid #000;
 padding: 10px;
 }
</style>
  </head>
<script language="VBScript">
sub Rundoku
     set oFSO=CreateObject("Scripting.FileSystemObject")
     set oFile=oFSO.OpenTextFile("irgendein.htm",1)
     text=oFile.ReadAll
     document.all.DataArea.InnerHTML = text
    oFile.Close
     end sub
  </script>
  <body>
     <div id=DataArea class="auto"><center><input id=runbutton  class="button" type="button" value="Ergebnis" name="run_button"  onClick="Rundoku"></center></div>
   </body>
</html>
Statt irgendein.htm kann da auch stehen  irgendein.html oder irgendein.txt oder irgendein.log...eben alle unverschlüsselten  Textdokumente. HTMl wird im <div> Element als
HTML interpretiert.

Das Skript besteht aus vier Elementen
- HTA-Grundgerüst
- CSS
- VB-Skript
- Body mit DIV-Container

Im CSS-Bereich (<style type="text/css">) werden die Scrollbalken (automatisch) und die Größe in Pixel definiert.

Im VB-Skript wird der Ausführungscode (Rundoku) für den Button (Ergebnis) im DIV-Container des Bodys geschrieben.
Die erste Hälfte des VB-Skripts liest das Dokument ein. Das Ergebnis wird als Variable (text) an den Innerhtml - Befehl übergeben. Der adressiert lediglich, dass die Variable(text) in den Pfad der Anwendung geschrieben wird - nämlich in den DIV-Container(DataArea).

Ist wirklich easy, ersetzt Frames und ermöglicht im Design neue Möglichkeiten. Bei Frames haben Sie z. B. bei Verwendung von about blank nicht die Möglichkeit, eine andere Farbe zuzuweisen.

Ist wirklich lustig und easy vom Code her. Die ID vom Container können Sie natürlich beliebig ändern - wenn der Sternenhimmelstuermer DataArea verwendet, so ist das ein Zugeständnis an die Nomenklatur..


Sobald der Ergebnis - Button im Div-Container aktiviert wird, wird er durch den Text (Name des Textdokumentes mit Endung *txt, den Sie eingeben müssen und das im selben Ordner, liegt) oder die HTML-Seite abgelöst, die in dieser Variante relativ im gleichen Ordner liegen muss.

Der Ergebnis-Button kann natürlich auch außerhalb des Containers platziert werden. So verschwindet er mit Betätigung und wird durch das Ergebnis abgelöst.

Die CSS-Formatierung ist das Gelbe vom Ei dabei: Durch Sie wird die Höhe und Breite des DIV-Containers in Pixel bestimmt.

Durch den Overflow-Befehl im CSS werden Scrollbalken automatisch gesetzt.

Das ist bei einer HTA megawichtig, da die Alternative mit einem Span (<span id=DataArea> </span><p>) im Body ziemlich holprig und unformatiert ist...

Die dritte Alternative im Body wäre, wie oben im Link angegeben, eine Textärea zu definieren (<textarea name="DataArea" rows=20 cols=70></textarea><p>).
Der Nachteil wäre hier, dass Text oder html unformatiert und bei HTML der Quellcode eben als Text angezeigt wird, was ja durchaus erwünscht sein kann.
Vorsicht! Das o. a. Skript dürfte mit dieser Zeile nicht funktionieren. Der Sternenhimmelstuermer braucht das nicht einmal zu testen.
Warum? Der Run-Button würde jede Funktionalität verlieren, da er als simpler Text ausgedruckt wird. Ist also nichts mit Hyperlinks und Co...
Einen Frame bauen, um Ergebnisse aus einem Textdokument in einer HTA zu laden


Drei Dateien kopieren und in einen Ordner legen. Dann frame.hta starten

Frame.hta
(Der Name ist nicht wirklich interessant, aber die Endung ist  *.hta)

<head>
<title>HTA Hilfe für Batchschreiber</title>
<HTA:APPLICATION
        APPLICATIONNAME="HTAHilfe"
    SCROLL="yes"
    SINGLEINSTANCE="yes"
    WINDOWSTATE="maximize"
>
</head>
<frameset rows="50%,50%">
 <frame application="yes"
src="cassandra.htm">
 <frame application="no" src="about:blank" name="frame2">
</frameset>


----


cassandra.htm (Der Name ist Pflicht...)

<html>
<head>
<title>HTA Hilfe für Batchschreiber</title>
<HTA:APPLICATION
        APPLICATIONNAME="HTAHilfe"
    SCROLL="yes"
    SINGLEINSTANCE="yes"
    WINDOWSTATE="maximize"
>
<style type="text/css">
a {color:#FFFF33; font-size:10pt; font-family:verdana,sans-serif,tahoma; text-decoration:none}
a:hover {color:#FF0000; font-size:10pt; font-family:verdana,sans-serif,tahoma; text-decoration:none}
a.menu1 {color:#FFFFFF; font-family:verdana,sans-serif,tahoma; font-size:8pt; text-decoration:none}
a.menu1:hover {color:#FF0000; font-family:verdana,sans-serif,tahoma; font-size:8pt; text-decoration:none}
a.menu2 {color:#FFFFFF; font-family:verdana,sans-serif,tahoma; font-size:9pt; text-decoration:none}
a.menu2:hover {color:#FF0000; font-family:verdana,sans-serif,tahoma; font-size:9pt; text-decoration:none}
</style>
</head>
<SCRIPT Language="VBScript">
Sub RunScript
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("suchwort.log")
    Set objFile = objFSO.OpenTextFile("suchwort.log", 2)
    objFile.WriteLine  BasicTextBox.Value
objFile.Close
dim shell
set shell = createobject("wscript.shell")
shell.run """probe.bat""", 1, true
WINDOW.PARENT.FRAME2.LOCATION.HREF="NEW.HTM"
End Sub
</SCRIPT>
<body style="color: white; background-color: black;" alink="red"
link="yellow" vlink="#3333ff">
<br>
<br>
<br>
<center><div><big><big><big><span style="color: red;">&#x8CEC; cassandra &#x8CEC;</span></big></big></big></div><c/enter>
<br>
<br>
<div><input type="text" name="BasicTextBox" size="100"></div>
<br>
<div>Der Eingabetext wird in dem leeren Frame nach Betätigen des Buttons angezeigt</div>
<br>
<input id=runbutton  class="button" type="button" value="start" name="run_button"  onClick="RunScript">
<br>
<br>
<body>
<html>

----

probe.bat

set destination=%~dp0%
>"%destination%New.htm"  ECHO ^<html^>
>>"%destination%New.htm" ECHO ^<BODY^>
set /p ergebnis=<suchwort.log
>>"%destination%New.htm" ECHO %ergebnis%
>>"%destination%New.htm" ECHO ^</BODY^>
>>"%destination%New.htm" ECHO ^</html^>
del suchwort.log  
Frame.hta (Der Name ist nicht wirklich interessant, aber die Endung ist  *.hta)

<head>
<title>HTA Hilfe für Batchschreiber</title>
<HTA:APPLICATION
        APPLICATIONNAME="HTAHilfe"
    SCROLL="yes"
    SINGLEINSTANCE="yes"
    WINDOWSTATE="maximize"
>
</head>
<frameset rows="50%,50%">
 <frame application="yes"
src="cassandra.htm">
 <frame application="no" src="about:blank" name="frame2">
</frameset>

Hier wir der Frame definiert.

Verteilung 50%  zu 50 %. Die folgenden Frames sind oben und unten. Schauen Sie sich eine Dokumentation von Frameset an. Einfach mal googlen, wie Sie rechts und links oder sonst irgendwie Frames setzen (row untereinander, cols nebeneinander als grobe Richtung). Die Ausnahme zum herkömmlichen Frame ist <frame application="yes" . Hier bestimmen Sie, ob im Frame Applikationen ausgeführt werden können. Damit ist in der Regel VBS gemeint. Für den oberen Frame  src="cassandra.htm"> ist also VBS zugelassen.
Anders im unteren Frame <frame application="no" src="about:blank" name="frame2">. Hier ist kein VBS nötig: also ein klares nein bzw. no...Der Name des Frames ist die eindeutige ID und deshalb wichtig. Als Verlegenheitslösung nehmen wir eine leere unbeschriebene Seite als URL (internetadresse: about:blank). Spart Schreibarbeit



----
<SCRIPT Language="VBScript">
Sub RunScript
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("suchwort.log")
    Set objFile = objFSO.OpenTextFile("suchwort.log", 2)
    objFile.WriteLine  BasicTextBox.Value
objFile.Close
dim shell
set shell = createobject("wscript.shell")
shell.run """probe.bat""", 1, true
WINDOW.PARENT.FRAME2.LOCATION.HREF="NEW.HTM"
End Sub
</SCRIPT>
 Das Script in der VBS erzeugt ein Log-Dokument mit der Eingabe des Users. Dann startet es die Batch und wartet auf Das Ergebnis. Die Batch generiert ein HTML-Dokument mit der Eingabe des Users und schleißt sich. Danach verarbeitet das Skript  das neue HTM-Dokument und zeigt es im Frame an :
Diese drei Zeilen im Body generieren  ein Textfeld für die Eingabe des Users
<div><input type="text" name="BasicTextBox" size="100"></div>
<input id=runbutton  class="button" type="button" value="start" name="run_button"  onClick="RunScript">

Die Batch generiert eine neue HTML-Seite der Code wird im letzten Punkt außerhalb der Tabelle erklärt...

probe.bat

set destination=%~dp0%
>"%destination%New.htm"  ECHO ^<html^>
>>"%destination%New.htm" ECHO ^<BODY^>
set /p ergebnis=<suchwort.log
>>"%destination%New.htm" ECHO %ergebnis%
>>"%destination%New.htm" ECHO ^</BODY^>
>>"%destination%New.htm" ECHO ^</html^>
del suchwort.log  

Erstmal bestimmt die Batch ihre Lage und schreibt den Ordnerpfad in die Variable destination.
set destination=%~dp0%
In diesem Pfad (der muss absolut sein) wird ein New.htm geschrieben. Erste Zeile > destruktiv, weitere Zeilen ergänzend >> (>>"%destination%New.htm" ECHO ^<BODY^>)
Mit dem Echo-Befehl wird Zeile für Zeile geschrieben. Was hinter Echo steht, ist Text für New.htm.
Na ja, es gibt noch eine kleine Besonderheit: in htm steht fast alles in <Tags> . Und gerade die blöden Dinger sind Eingabe < oder Ausgabezeichen > für Batches.

Deshalb muss immer davor ein ^< Escapezeichen stehen.
In der nächsten Zeile wird die Variable %ergebnis% (in Batch mit zwei Prozentzeichen) nun im Echo-Befehl verbraten, also der Eingabetext in das Dokument geschrieben >>"%destination%New.htm" ECHO ^<div^>%ergebnis%^</div^>.
Dann wird noch schnell das Dokument beendet. Das ist jetzt ein mieses HTML-Gerüst, da der Headbereich fehlt, aber als Demo...

Zu guter letzt wird der suchwort.log vernichtet. Die Usereingabe wurde ja bereits ins HTML-Dokument übernommen.
Die drei Dateien müssen in einem Ordner liegen. Die Frame.hta wird mit Doppelklick ausgeführt. Der Rest ist easy: Geben Sie irgend einen Satz ein und drücken den Start-Button.

Ihre Eingabe wird in ein Log-Dokument geschrieben. Die Batch liest das Dokument aus und erstellt ein Html-Dokument. Das wird als Frame, nachdem die Batchbearbeitung fertig ist.

Dieses simuliert eine typische Batch und HTA als GUI Situation:

Eine Eingabe wird vom User der Batch übergeben. Diese verarbeitet die Eingaben und am Ende wird das Ergebnis in der HTA angezeigt.

Für diesen simplen Sachverhalt schrieb sich der Sternenhimmelstuermer die Finger wund....



Hinweise

Bei der Suche im Web werden Sie manchmal auf VBA Seiten geleitet. Ihre Spielwiese ist VBS! Für VBA  (Visual Basic Application) brauchen Sie spezielle Software zum Programmieren und Kompilieren. Der Text läuft nicht in VBS!!!

HTA bzw. VBS bei jeder Frage eingeben hilft manchmal weiter...Befehle einzeln nachgooglen hilft ungemein weiter, am besten mit dem Wort Befehlsreferenz.

Nicht englische Seiten meiden - das Englisch ist meist einfach...

Es gibt von der Microsoft Corporation eine *chm (Hilfedatei), die vier Programmiersprachen - einschließlich vbs - dokumentiert. Die funktioniert unter Windows 7 nicht - genau wie viele andere Befehle aus der guten alten Active x - Zeit. Die Microsoft Corporation schränkt seit Internetexplorer 6 ihr einstiges "Vorzeigeformat" ein, weil es zu gefährlich ist...Wie dem auch sei, die Microsoft Corporation erstellte erstellte damals mit dem HTML-Help workshop ein Klasse Tool, mit dem man das Script56.chm prima dekompilieren kann - das Update von Microsoft im eben genannten Link hilft nur für alte Help-Dateien, durch die die "C:\Windows\winhlp32.exe" installiert wird - die kann dann per Doppelklick geöffnet werden alte Help-Datei mit der Dateiendung *.help ausgelesen werden.

Nachtrag: Geht auch anders, wenn man aus dem Filestream den Vermerk für den Download reinigt...

Die mit dem HTML-Workshop dekompilierten HTML- Dateien aus der o. a. Script56.chm - ziemlich viele mit wilden Nummernnamen - sollten Sie mit dem IE öffnen und die Active X-Anfrage des Explorers mit ja beantworten. Wenn sie den dekompilierten Ordner html in den Pfad c:\ html verschieben werden die internen absoluten Links der HTML-Seiten valide. Erwischen Sie die richtigen Seiten eines Titelthemas, so können Sie sich durchhangeln - ohne lästige Neuanfragen des Browsers...Ist nur eine Spielerei - vieles ein wenig veraltet, einiges nicht mehr ausführbar - in Englisch....aber ansonsten für den geneigten Hobbybastler lustig -:)



Frameset und Übergabe von Ergebnissen von Batches an HTA

Sie bauen sich drei Dateien. Die können Sie in einem beliebigen Ordner platzieren. Danach starten Sie die Frame.hta mit einem Doppelklick. Die startet eine HTA mit zwei Frames. Der erste Frames wird mit der Cassandra.htm geladen (oberer Frame).
Der zweite Frame wird mit about:blank geladen, also eine leere imaginäre weiße Seite - Da könnte natürlich auch ein Link zu einer HTML-Seite drin sein...

In der Cassandra.html ist unserer HTA-Code. Die Rechte für die Ausführung bekommen wir aus der Frame.hta <frame application="yes" . Hm, der Sternenhimmelstuermer schreibt trotzdem den hta-Kopf noch einmal in die Html-Seite - kann nicht wirklich schaden...
Sie können übrigens nur eine HTML-Seite als Frame verwenden. Da drin kann dann zum Ausgleich vollwertiger HTA-Code stehen. Aber eine HTA kann nun mal keine HTA in einem Frame öffnen...

Wie dem auch sei, nun hat Cassandra.htm volle Rechte. Sie wartet nun auf eine Eingabe des Users <div><input type="text" name="BasicTextBox" size="100"></div>  und nach Eingabe des Users ins Textfeld und Betätigung des Run-Buttons <input id=runbutton  class="button" type="button" value="Suche" name="run_button"  onClick="RunScript">   wird das VB-Skript aktiv und ein Textdokument mit der Eingabe des Users wird generiert.

Dann wird die probe.bat gestartet und so lange gewartet, bis sich die Batch schließt shell.run """probe.bat""", 1, true  .

Die Batch erstellt nun  rein zufällig eine HTM-Seite mit dem Namen New.htm, in der der Eingabetext vom User aus der HTA steht,  und schließt sich.

Darauf hat unsere Cassandra.htm nur gewartet. Denn nun wird Sie wieder aktiv und lädt die New.htm WINDOW.PARENT.FRAME2.LOCATION.HREF="NEW.HTM" als neue Seite in den leeren Frame <frame application="no" src="about:blank" name="frame2">  - der User liest im neuen Frame also das, was er gerade eingab.

Für Profis ist bereits an dieser Stelle die Abhandlung beendet.

Frame.hta (Der Name ist nicht wirklich interessant, aber die Endung ist  *.hta)

<head>
<title>HTA Hilfe für Batchschreiber</title>
<HTA:APPLICATION
        APPLICATIONNAME="HTAHilfe"
    SCROLL="yes"
    SINGLEINSTANCE="yes"
    WINDOWSTATE="maximize"
>
</head>
<frameset rows="50%,50%">
 <frame application="yes"
src="cassandra.htm">
 <frame application="no" src="about:blank" name="frame2">
</frameset>


----


cassandra.htm (Der Name ist Pflicht...)

<html>
<head>
<title>HTA Hilfe für Batchschreiber</title>
<HTA:APPLICATION
        APPLICATIONNAME="HTAHilfe"
    SCROLL="yes"
    SINGLEINSTANCE="yes"
    WINDOWSTATE="maximize"
>
<style type="text/css">
a {color:#FFFF33; font-size:10pt; font-family:verdana,sans-serif,tahoma; text-decoration:none}
a:hover {color:#FF0000; font-size:10pt; font-family:verdana,sans-serif,tahoma; text-decoration:none}
a.menu1 {color:#FFFFFF; font-family:verdana,sans-serif,tahoma; font-size:8pt; text-decoration:none}
a.menu1:hover {color:#FF0000; font-family:verdana,sans-serif,tahoma; font-size:8pt; text-decoration:none}
a.menu2 {color:#FFFFFF; font-family:verdana,sans-serif,tahoma; font-size:9pt; text-decoration:none}
a.menu2:hover {color:#FF0000; font-family:verdana,sans-serif,tahoma; font-size:9pt; text-decoration:none}
</style>
</head>
<SCRIPT Language="VBScript">
Sub RunScript
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("suchwort.log")
    Set objFile = objFSO.OpenTextFile("suchwort.log", 2)
    objFile.WriteLine  BasicTextBox.Value
objFile.Close
dim shell
set shell = createobject("wscript.shell")
shell.run """probe.bat""", 1, true
WINDOW.PARENT.FRAME2.LOCATION.HREF="NEW.HTM"
End Sub
</SCRIPT>
<body style="color: white; background-color: black;" alink="red"
link="yellow" vlink="#3333ff">
<br>
<br>
<br>
<center><div><big><big><big><span style="color: red;">&#x8CEC; cassandra &#x8CEC;</span></big></big></big></div><c/enter>
<br>
<br>
<div><input type="text" name="BasicTextBox" size="100"></div>
<br>
<div>Der Eingabetext wird in dem leeren Frame nach Betätigen des Buttons angezeigt</div>
<br>
<input id=runbutton  class="button" type="button" value="start" name="run_button"  onClick="RunScript">
<br>
<br>
<body>
<html>

----

probe.bat

set destination=%~dp0%
>"%destination%New.htm"  ECHO ^<html^>
>>"%destination%New.htm" ECHO ^<BODY^>
set /p ergebnis=<suchwort.log
>>"%destination%New.htm" ECHO %ergebnis%
>>"%destination%New.htm" ECHO ^</BODY^>
>>"%destination%New.htm" ECHO ^</html^>
del suchwort.log  

Erklärung

Wir gehen chronologisch vor. Sie starten die frame.hta. Zur Erinnerung den ganzen Code

<head>
<title>HTA Hilfe für Batchschreiber</title>
<HTA:APPLICATION
        APPLICATIONNAME="HTAHilfe"
    SCROLL="yes"
    SINGLEINSTANCE="yes"
    WINDOWSTATE="maximize"
>
</head>
<frameset rows="50%,50%">
 <frame application="yes"
src="cassandra.htm">
 <frame application="no" src="about:blank" name="frame2">
</frameset>

Der blaue Teil ist der Kopf der HTA.

<frameset rows="50%,50%">


Wir eröffnen im Container - also unsere hta ein Frameset mit der Verteilung 50%  zu 50 %. Die folgenden Frames sind oben und unten (eben row und nicht cols für nebeneinander). Schauen Sie sich eine Dokumentation von Frameset an. Einfach mal googlen, wie Sie rechts und links oder sonst irgendwie Frames setzen. Die Ausnahme zum herkömmlichen Frame ist <frame application="yes" . Hier bestimmen Sie, ob im Frame Applikationen ausgeführt werden können. Damit ist in der Regel VBS gemeint. Für den oberen Frame  src="cassandra.htm"> ist also VBS zugelassen.
Anders im unteren Frame <frame application="no" src="about:blank" name="frame2">. Hier ist kein VBS nötig: also ein klares nein bzw. no...Der Name des Frames ist die eindeutige ID und deshalb wichtig. Als Verlegenheitslösung nehmen wir eine leere unbeschriebene Seite als URL (internetadresse: about:blank).

Als nächstes werden die beiden Frames beim Starten mit Leben erfüllt. Interessant ist unsere Eingabeseite cassandra.htm.

<html>
<head>
<title>HTA Hilfe für Batchschreiber</title>
<HTA:APPLICATION
        APPLICATIONNAME="HTAHilfe"
    SCROLL="yes"
    SINGLEINSTANCE="yes"
    WINDOWSTATE="maximize"
>
<style type="text/css">
a {color:#FFFF33; font-size:10pt; font-family:verdana,sans-serif,tahoma; text-decoration:none}
a:hover {color:#FF0000; font-size:10pt; font-family:verdana,sans-serif,tahoma; text-decoration:none}
a.menu1 {color:#FFFFFF; font-family:verdana,sans-serif,tahoma; font-size:8pt; text-decoration:none}
a.menu1:hover {color:#FF0000; font-family:verdana,sans-serif,tahoma; font-size:8pt; text-decoration:none}
a.menu2 {color:#FFFFFF; font-family:verdana,sans-serif,tahoma; font-size:9pt; text-decoration:none}
a.menu2:hover {color:#FF0000; font-family:verdana,sans-serif,tahoma; font-size:9pt; text-decoration:none}
</style>
</head>
<SCRIPT Language="VBScript">
Sub RunScript
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("suchwort.log")
    Set objFile = objFSO.OpenTextFile("suchwort.log", 2)
    objFile.WriteLine  BasicTextBox.Value
objFile.Close
dim shell
set shell = createobject("wscript.shell")
shell.run """probe.bat""", 1, true
WINDOW.PARENT.FRAME2.LOCATION.HREF="NEW.HTM"
End Sub
</SCRIPT>
<body style="color: white; background-color: black;" alink="red"
link="yellow" vlink="#3333ff">
<br>
<br>
<br>
<center><div><big><big><big><span style="color: red;">&#x8CEC; cassandra &#x8CEC;</span></big></big></big></div><c/enter>
<br>
<br>
<div><input type="text" name="BasicTextBox" size="100"></div>
<br>
<div>Der Eingabetext wird in dem leeren Frame nach Betätigen des Buttons angezeigt</div>
<br>
<input id=runbutton  class="button" type="button" value="start" name="run_button"  onClick="RunScript">
<br>
<br>
<body>
<html>

Der blaue Text ist nur Formatierung bzw. der Kopf der HTML-Seite, in der der Sternenhimmelstuermer den Kopf einer hta und ein VBS integrierte.

Wir fangen mal mit dem Body-Tag an, in dem die Eingabezeile für den User ( <div><input type="text" name="BasicTextBox" size="100"></div> ) steht.

Ist eine einzeilige Eingabezeile. Der ID-Name ( name="BasicTextBox" ) ist wichtig. Unter diesem Namen läuft in Zukunft unsere Zeileneingabe im VBS.

Dann haben wir noch einen Button zum Start des VBScript ( <input id=runbutton  class="button" type="button" value="start" name="run_button"  onClick="RunScript"> )
Der value="start" ist die Aufschrift des Buttons. Bei Betätigung des Buttons startet ein VBScript mit dem Namen RunScript ( onClick="RunScript" )

Zwischen Body und Head steht das Script, dass durch den Einleitungssatz <SCRIPT Language="VBScript"> geöffnet wird.

<SCRIPT Language="VBScript">
Sub RunScript
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile("suchwort.log")
    Set objFile = objFSO.OpenTextFile("suchwort.log", 2)
    objFile.WriteLine  BasicTextBox.Value
objFile.Close

Das Skript reagiert auf Betätigung des Buttons mit der Routine Sub RunScript.

Sub
ist fester Bestandteil und RunScript der kreativ erfundene Teil zur individuellen Unterscheidung.

Dann wird ein Container ( Set objFSO = CreateObject("Scripting.FileSystemObject") ) erstellt, in dem ein Dokument Namens suchwort.log ( objFSO.CreateTextFile("suchwort.log") )erstellt wird.

Das wird dann geöffnet und destruktiv (2) überschrieben (Set objFile = objFSO.OpenTextFile("suchwort.log", 2) ).

In das Textdokument wird der Wert des Eingabefeldes geschrieben (objFile.WriteLine  BasicTextBox.Value).

BasicTextBox
ist ja unsere eindeutige ID des Eingabefeldes deren Eingabewert .Value hineingeschrieben wird. Danach wird die Bearbeitung beendet und das Dokument geschlossen  (objFile.Close).

Danach wird  eine Variable  deklariert ( dim shell ). Es wird der Container für eine Batchanwendung geschaffen ( set shell = createobject("wscript.shell")  ) und in diesem Container die probe.bat gestartet ( shell.run """probe.bat""", 1, true)

Für diese Zeile ein wenig mehr Erklärung. Die 1 und true stehen für einen Wartebefehl , bis die Anwenung ausgeführt wurde. 1 und true bewirken also das Warten bis zum schließen der Anwendung...mehr brauchen Sie nicht zu wissen...

Der Sternenhimmelstuermer wandelt auf dem Pfad der Usereingabe - deshalb schauen wir uns nun zwischenzeitlich die Batch an.

probe.bat

set destination=%~dp0%
>"%destination%New.htm"  ECHO ^<html^>
>>"%destination%New.htm" ECHO ^<BODY^>
set /p ergebnis=<suchwort.log
>>"%destination%New.htm" ECHO ^<div^>%ergebnis%^</div^>
>>"%destination%New.htm" ECHO ^</BODY^>
>>"%destination%New.htm" ECHO ^</html^>
del suchwort.log 

Die  liegt im selben Ordner wie die übrigen Dateien? Dann wird Sie nun gestartet!

Erstmal bestimmt die Batch ihre Lage und schreibt den Ordnerpfad in die Variable destination.
set destination=%~dp0%
In diesem Pfad (der muss absolut sein) wird ein New.htm geschrieben.

Erste Zeile > destruktiv, weitere Zeilen ergänzend >> (>>"%destination%New.htm" ECHO ^<BODY^>)

Mit dem Echo-Befehl wird Zeile für Zeile geschrieben. Was hinter Echo steht, ist Text für New.htm.

Na ja, es gibt noch eine kleine Besonderheit: in det HTML-Sprache steht fast alles in <Tags> . Und gerade die blöden Dinger sind Eingabe < oder Ausgabezeichen > für Batches.

Deshalb muss immer davor ein ^< Escapezeichen stehen.

Das ist ein schöner Übergang zur nächsten Zeile set /p ergebnis=<suchwort.log. Die platzierte der Sternenhimmelstuermer vorsichtshalber ein paar Zeilen tiefer, damit auf jedem Fall ein suchwort.log von der HTA vorliegt (vassandra.htm).

Eine Batch oder die Kommandozeile sind fähig die erste Zeile eines Dokumentes  als Variable zu deklarieren  =<suchwort.log Die heißt jetzt ergebnis.

In der nächsten Zeile wird die Variable %ergebnis% (in Batch mit zwei Prozentzeichen) nun im Echo-Befehl verbraten, also der Eingabetext in das Dokument geschrieben >>"%destination%New.htm" ECHO ^<div^>%ergebnis%^</div^>.
Dann wird noch schnell das Dokument beendet. Das ist jetzt ein mieses HTML-Gerüst, da der Headbereich fehlt, aber als Demo...

Zu guter letzt wird der suchwort.log vernichtet. Die Usereingabe wurde ja bereits ins HTML-Dokument übernommen.

Wenn Sie mal testen wollen, ob die HTA wirklich auf die Batch wartet, dann fügen Sie unten den Befehl pause (nur das Wort in die letzte Zeile) hinzu Warum? Weil dann die Batch stehen bleibt, bzw. die cmd geöffnet stehen bleibt. Durch ein Enter mit der Returntaste oder Schließen des Fensters der CMD wird die Batch beendet und erst dann der neue Frame geladen. Das VBScript wartet eben auch Jahre, wenn es sein muss -:)

Wir haben nun das letzte Dokument für den Frame und kommen nun zu dem Teil, auf den 80 % der Leser dieser Abhandlung gewartet haben.

Der Code in der HTA wird nämlich nach Schließen der Batch wieder aktiv...

Der Befehl zum Öffnen eines neuen Frames wird mit einer belanglosen Zeile geöffnet: WINDOW.PARENT.FRAME2.LOCATION.HREF="NEW.HTM".

Ähem, muss der Sternenhimmelstuermer eigentlich noch ein Wort dazu sagen? Ist nur die Ortsangebe zum Hauptfenster WINDOW.PARENT, Unterabteilung ID des Frames  FRAME2 und dann die URLHREF="NEW.HTM.

Diese Zeile scheint so schwer zu sein, dass der Sternenhimmelstuermer erst im Jahr 2012 hunderten von Anfragern in Foren mal die Lösung präsentiert.

Wie dem auch sei, die New.htm wird geöffnet und mit dem festen Befehlssatz End Sub die Subroutine der Befehlskette nach dem Betätigen des Startbuttons beendet. Das VBScript muss natürlich geschlossen werden </SCRIPT>.



Spezialthema: VBS und Javascript in hta gemeinsam nutzen

Sie können in einer HTA VBS gemeinsam Nutzen - egal ob in einer HTA mit oder ohne Frames. Das ist keine Hexerei! Sie können z. B. VBS zum Importieren von Textdokumenten benutzen, die dann von Javascript weiterbearbeitet werden und per HTA ausgegeben werden.

Alles in einem Durchgang und als Auslöser z. B. Startbutton oder beim Öffnen der HTA. Variablen können über eine Textarea beliebig ausgetauscht werden. Das ist sinnvoll, da Sie fertige Javascriptseiten in einen Frame der HTA einbinden können und dann sich die Ergebnisse der Seite aus dem Textfeld abgreifen können.

Der Sternenhimmelstuermer tat das zum Beispiel im Projekt Babel

Mühsam nährt sich das Eichhörnchen - erstmal ein paar Grundregeln:

- Variablennamen in VBS und Javascript dürfen sich nicht überschneiden: Das ist eigentlich logisch - bei Javascript und VBS darf man ja auch nicht derselben Variable verschiedene Bedeutungen geben.

- als Übergabe von Textstrings (Variablen) bevorzugt der Sternenhimmelstuermer eine Textarea, da Javascript und VBS die Syntax der Textarea beherrschen.
Der Code der Textarea ist immer derselbe und das die ID und der Value mit unterschiedlicher Syntax von VBS und Javascript bearbeitet werden, ist uninteressant.

Die Textarea ist also eine Art unformatierte Zwischenablage, auf die beide Scriptsprachen in zeitlicher Reihenfolge zugreifen können und sich den Inhalt für die eigene Bearbeitung zu nutze machen können.

O. K., der Pragmatiker greift also z. B. mit VBS auf ein Textdokument zu und kopiert den Inhalt in die Textarea (Mit Javascript ist das so nicht möglich...):

sub test
     set oFSO1=CreateObject("Scripting.FileSystemObject")
     set oFile2=oFSO1.OpenTextFile("irgendein.txt",1)
     text1=oFile2.ReadAll
im Dokument:  document.all.formname.textareaname.value=text1       im Frame: WINDOW.PARENT.frame2.formname.textareaname.Value=text1
     oFile2.Close
      
sub end

Erklärung Zeile für Zeile:


set oFSO1=CreateObject("Scripting.FileSystemObject")


Das Öffnen eines Objektes in einer VBS-lesbaren Hülle wird vorbereitet

set oFile2=oFSO1.OpenTextFile("irgendein.txt",1)

Irgendein.txt, der paralel im Ordner liegen sollte (daher keine Pfadangabe) wird in die Hülle geschrieben, daher eine 1 für distruktives Überschreiben...

text1=oFile2.ReadAll

Der Inhalt der Hülle  oFile2  wird zur Variablen text1 erklärt, wenn ihnen das lieber ist können Sie jedes beliebige Wort nehmen - muss aber irgendwie einmalig als Variable erkennbar sein...

im Dokument:  document.all.formname.textareaname.value=text1       im Frame: WINDOW.PARENT.frame2.formname.textareaname.Value=text1

Die Variable  text1 wird nun in dasselbe  Dokument oder in einen Pfad geschrieben. Die roten Teile des Pfades sind alternativlos, der blaue Anteil des Pfades ergibt sich ein wenig aus dem Aufbau ihres Dokumentes:

frame2 ist der Name des Frames, der von ihrer Namensgebung abhängig ist...

Die meisten Javascriptschreiblinge packen eine Textarea in eine Form innerhalb des Bodys mit einer ID - die meistens identisch mit dem Namen ist. Der Internetexplorer begnügt sich meistens mit NAME, aber nicht immer - also immer schön eine ID vergeben. Der Name der Form wurde sinniger Weise mit formname dargestellt und muss so dann im Body des Dokumentes oder im Frame bestehen...man kann sich die Form getrost sparen, aber wenn man Sie verwendet, dann muss diese im Pfad verwendet werden...

Der Textareaname entspricht der ID=textareaname im Body. Das hängt dann wieder ein wenig davon ab, welche ID Sie der Textarea verpassen...Vorsicht: Eine ganz schlechte Idee ist z. B. in als ID-Name. Das schickt dann den Explorer bearbeitungsmäßig ins Nirwana, weil in als Befehl im Pfad aufgefasst wird...  

So, jetzt haben wir einen Text in der Textarea, nämlich den Inhalt des Dokumentes irgendein.txt.

Nehmen wir mal an, Sie wollen nun ein gleich mit Javascript loslegen, ohne irgendeinen  blöden Run-Button als lästige Zwischeninstanz zu betätigen, dann ergänzen Sie einfach das VB-Script mit der schönen Zeile:

jsfunktion()

also:

sub test
     set oFSO1=CreateObject("Scripting.FileSystemObject")
     set oFile2=oFSO1.OpenTextFile("irgendein.txt",1)
     text1=oFile2.ReadAll
  
  document.all.formname.textareaname.value=text1    
     oFile2.Close

jsfunktion()


sub end

Anmerkung: Sie können beliebig Leerzeilen in Javascript, VBS oder Batch verwenden Auch Leerzeichen am Anfang stören nicht. Machen Sie das so, wie es für Sie optisch am besten ist. In Javascript wird das mehr verwendet...

Ja, einfach den Namen der Funktion, der ja auch nur eine Variable ist mit den zwei obligatorischen Klammern in eine Zeile reinschreiben - und da sage noch jemand, dass das schwer sei...

Was in der Funktion steht, wissen Sie erstmal nicht. Was Sie aber wissen sollten ist, dass die Bearbeitung  des VBS erstmal ruht und die Funktion abgearbeitet wird.
Richtig in VBS wird wie in den anderen Subsprachen Zeile für Zeile abgearbeitet und die Zeile  jsfunktion() beinhaltet die komplette Javascriptfunktion!

Dahinter kann jetzt wieder weiteres VBS stehen.

Nehmen wir mal an, die Javascriptfunktion tut jetzt irgendwas mit dem Text in der Textarea, z. B.

<Script Language=JavaScript>
  jsfunktion(){
   irgendeine Bearbeitung mit Javascript
  }
  </Script>

, dann wartet VBS so lange, bis die Aufgabe erfüllt ist, auch ohne dass Sie irgendwelche  wait,sleep oder keine Ahnung was auch immer in VBS  benötigen (gibt es auch nicht in VBS, nur eine Schummellösung der Scripting Guys, die definitiv nicht auf dem PC des Sternenhimmelstuermers in einer HTA  funktionierte - work on it: vbs is not hta..., entspricht eben irgendso ein shell2.run """irgendeine.bat""" , 1, true - da wartet die hta auf die Ausführung einer Batch...

Danach können Sie dann wieder auf den Value der Textarea zugreifen - ein seeliges geben und nehmen...

Richtig, der Sternenhimmelstuermer sprach im ersten Absatz noch von den Zugriff auf Frames und im vorherigen Absatz wurde das dann auf dasselbe Dokument reduziert.

Der Sternenhimmelstuermer erfand für sich eine Brückenfunktion über Javascript, mit der er auf den Nachbarframe zugreifen kann, also nochmal den fiktiven Code des Hauptframes in VBS:

sub test
     set oFSO1=CreateObject("Scripting.FileSystemObject")
     set oFile2=oFSO1.OpenTextFile("irgendein.txt",1)
     text1=oFile2.ReadAll
  
  WINDOW.PARENT.frame2.formname.textareaname.Value=text1   
     oFile2.Close

bruecke()


sub end

Hier wurde Text in einen Nebenframe importiert (WINDOW.PARENT.frame2.formname.textareaname.Value=text1), der nun von einem Javascript im Nebenframe bearbeitet werden soll.

Dazu ruft der Sternenhimmelstuermer eine Brückenfunktion auf, die im selben Frame wie das VBS steht:

<Script Language=JavaScript>
  function bruecke(){
   top.frame2.allnow()
  }
  </Script>

Die Funktion Bruecke ist einzig für den Zweck konzipiert, das ein Javascript im Nebenframe aufgerufen wird. Nicht durch das top irretieren lassen, dass steht bloß für den Kopfbereich der HTML-Seite, in dem  das Javascript liegt  - das hat nichts mit dem top_frame  zu tun, wie man im ersten Augenblick denken könnte.  Erst der

Name des Frames frame2 im Pfad gibt den Bestimmungsort an. Ach ja,  allnow() ist der Name der Funktion, die im Nachbarframe aufgerufen wurde. In der HTA zur Sprachcodierung vom Sternenhimmelstuermer (bab64.bat bzw. deren Inhalt bab64.hta) , können Sie das nachvollziehen...
dort ist allnow() wieder eine Metafunktion mit der drei andere Funktionen im Nebenframe frame2  aufgerufen werden:

function allnow(){
 enctdrei();
  encode();
 enctwo();
    }

Das ist jetzt der Javascriptcode, mit dem man andere Javascriptfunktionen  nacheinander aufruft.

In diesem Fall im Nebenframe  frame2,  dessen Funktion allnow() eben durch die Javascriptfunktion bruecke() aufgerufen wurde, die wiederum durch die hta im sub test aufgerufen wurde.

Dort werden nacheinander drei Funktionen aufgerufen - die Syntax ist ähnlich, aber es kommt noch ein Semikolon. Auch hier gilt, dass die Funktionen nacheinander aufgerufen werden, also jede "Zeile" mit einer Funktion abgearbeitet wird.

Innerhalb der Funktionen können Sie nun mit dem Inhalt der Textarea anstellen, was Sie wollen.

Mit CSS kann man natürlich so eine Textarea auch ausblenden - Stichwort nondisplay. Das gilt nur für den User - ID und Funktionalität bleiben erhalten, wichtig für den Programmierer.

Wie gesagt, Das VBS der HTA wartet auf die Ausführung von der Funktion allnow(), welche erst beendet ist, wenn die drei Funktionen von allnow (enctdrei(), encode(); und enctwo();) abgearbeitet sind. Dann ist die Funktion allnowa beendet und dann geht es wieder zurück zum VBS.

Dort könnte man dann wieder das Ergebnis per vbs in ein Textdokument schreiben...

Lassen Sie das erstmal sacken. Für mich ist das einfach, aber nur weil ich die Variablennamen kenne-:)

Hm,  mit einer HTA mit verschachtelteten  Funktionen zu arbeiten ist erstmal eine Herausforderung, aber wenn Sie  Javascript, VBS und Batch mixen, die stärken der einzelnen Sprachen erkennen und kombinieren, dann sind Sie jedem Profi  überlegen...


Spezialthema: Mathe in VBS: von den Grundrechenarten über Punktzählung bis Auswertung von Dropdownfehler


Keine Sorge, Sie bleiben auch in diesem Artikel vor der höheren Mathematik verschont (dafür gibt es den Spezialisten Javascript), aber zumindest die Grundrechenarten sollten Sie beherrschen, um so schöne Sachen wie Punktezähler zu kreieren oder die Auswertung  von Rechnungen per  Textdokument zu sichern  -

Grundlegendes

+ * - / werden wie in allen Sprachen als Operatoren ganz normal verwendet. Strings zu bilden ist also einfach nach dem Schema Ergebnisstring=  1+ 1 keine Hürde.

Schwerer wird es schon, wenn Sie Dropdownzahlen oder von Textareas verwenden wollen, da dieses den Befehl  CLng(Zahlenvariable aus Textstring) erfordert:

vielleicht eine kleine lauffähige Demo, an der wir uns dann innerhalb dieses Themas langsam abarbeiten:

Erstmal die Bodyzeilen:

<div><textarea name="BasicUnvisibleTextArea" rows="5" cols="75"  id="BasicUnvisibleTextArea" style="visibility:hidden"></textarea>

Unschwer zu erkennen: Da wurde eine ganz normale Textarea erstellt. Die ist beim öffnen der HTA erstmal unsichtbar und wird dann beim Betätigen des Buttons nach der ersten Eingabe sichtbar und bleibt es dann auch - Sie wollen ja das Ergebnis irgendwann sehen -:)

<input id=runbutton  class="button" type="button" value="Zaehle Buttonbet&auml;tigung" name="run_button"  onClick="RunScript">


gestartet wird das Ergebnis mit o. a. Runbutton - fangen wir mal im Javascriptbereich an, dass am Ende des VBS im Head gestartet wird : show me()

<script type="text/javascript">
function showme () {
  if (document.getElementById)
        document.getElementById("BasicUnvisibleTextArea").style.visibility = "visible";
}
</script>

Aha, es wurde mit der getElementbyID Methode ein Element auf visible  gesetzt siehe hierzu die ausführliche Anleitung auf Self-Htlml gegeben.

Wir halten fest:

VBS und Javascript sind gut verträglich in einer HTA
Man kann eine Textarea auf unsichtbar ohne Funktionsverlust setzen



Dann den Sub im VB-Script:

 Sub RunScript

Dim Addone
Addone= 1
document.all.BasicUnvisibleTextArea.value=Addone

Dim rechnungszahl
Dim datname
datname="zahl.txt"
Dim zahlarea
zahlarea=BasicUnvisibleTextArea.value

  Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

if fso.FileExists(datname) then
Dim fso1
set oFSO1=CreateObject("Scripting.FileSystemObject")
     set oFile1=oFSO1.OpenTextFile(datname,1)
        text1=oFile1.ReadAll
          rechnungszahl= CLng(text1) + CLng(Addone)
        document.all.BasicUnvisibleTextArea.value=rechnungszahl
oFile1.Close

Dim datname10
datname10="zahl.txt"
Dim fso10
Set fso10 = CreateObject("Scripting.FileSystemObject")
Set objFSO10 = CreateObject("Scripting.FileSystemObject")
    objFSO10.CreateTextFile(datname10)
    Set objFile10 = objFSO10.OpenTextFile(datname10, 2)
    objFile10.WriteLine  BasicUnvisibleTextArea.Value
objFile10.Close

else
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile(datname)
    Set objFile = objFSO.OpenTextFile(datname, 2)
        objFile.WriteLine  BasicUnvisibleTextArea.Value
objFile.Close

            end if
    
showme()
 End Sub
 
Das Script ist jetzt umfassend und enthält so ziemlich alle Variationen, die Sie brauchen!

Der erste Block sind die üblichen Definitionen der Variablen:

Dim Addone
Addone= 1
document.all.BasicUnvisibleTextArea.value=Addone

Dim rechnungszahl
Dim datname
datname="zahl.txt"
Dim zahlarea
zahlarea=BasicUnvisibleTextArea.value

Als erste wird eine Variable geschaffen( Dim Addone), die eine 1( Addone= 1) ist. Die wird in die noch unsichtbare Textarea geschrieben.( document.all.BasicUnvisibleTextArea.value=Addone)

 Dann wird Rechnungszahl eingeführt. Dann eine Variable für den Namen des Textdokumentes geschaffen, das mal relativ zur HTA liegt.
Die Zahl  datname="zahl.txt" aus der Textarea wird aus der Textarea gezogen ( zahlarea=BasicUnvisibleTextArea.value).

Dann wird in einer If-Funktion überprüft, ob schon ein Textdokument vorliegt - das ist nötig, da beim ersten start ja noch kein Textdokument vorliegt, dass dann im Else-Teil kreiert werden muss!

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

if fso.FileExists(datname) then

Ab then komm dann, was passiert, wenn ein Textdokument vorliegt:

Dim fso1
set oFSO1=CreateObject("Scripting.FileSystemObject")
     set oFile1=oFSO1.OpenTextFile(datname,1)
        text1=oFile1.ReadAll
          rechnungszahl= CLng(text1) + CLng(Addone)
        document.all.BasicUnvisibleTextArea.value=rechnungszahl
oFile1.Close

Jetzt kommt der Rechenteil, wenn ein Dokument mit einer Zahl (zahl.txt) vorliegt. Dann wurde z. B. beim zweiten Durchgang bereits ein Dokument mit einer eins geschaffen.

Dieses wird nun geöffnet (OpenTextFile(datname,1)) und mit ReadAll ausgelesen. Das Ergebnis wird als Variable gespeichert (text1=oFile1.ReadAll).

Der Text wird in eine Zahl umgewandelt (CLng(text1)), mit der Zahl Addone adiert (müsste eigentlich nicht behandelt werden...) und in der Variable Rechnungzahl gespeichert ( document.all.BasicUnvisibleTextArea.value=rechnungszahl).

Dann wird  die neue Zahl in die Textarea (document.all.BasicUnvisibleTextArea.value=rechnungszahl) geschrieben. Die neue Zahl überschreibt im folgenden Abschnitt die Zahl des alten Textdokumentes.

Das wurde alles schon in der Javascriptbiliothek auf dieser Seite erklärt...

Dim datname10
datname10="zahl.txt"
Dim fso10
Set fso10 = CreateObject("Scripting.FileSystemObject")
Set objFSO10 = CreateObject("Scripting.FileSystemObject")
    objFSO10.CreateTextFile(datname10)
    Set objFile10 = objFSO10.OpenTextFile(datname10, 2)
    objFile10.WriteLine  BasicUnvisibleTextArea.Value
objFile10.Close

als wichtige Ergänzung vielleicht noch der Hinweis, dass die Zahlen hinter den festen Variablen unheimlich wichtig sind, da es sonst zu Überschneidungen der verschiedenen Module kommt. Im Internet wird immer nur ein Modul erklärt, aber wenn zweimal dieselben oder ähnliche Funktionsabschnitte sich überschneiden, dann funktionieren ihre Funktionen nicht mehr. Hier sind Webseiten wie die des Sternenhimmelstuermers eindeutig überlegen - da wird nicht mit Codschnipseln gearbeitet, was natürlich auch unheimlich wichtig ist...

else
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CreateTextFile(datname)
    Set objFile = objFSO.OpenTextFile(datname, 2)
        objFile.WriteLine  BasicUnvisibleTextArea.Value
objFile.Close

            end if

Danach kommt noch die Alternative, dass kein Textdokument besteht. Dann wird es erstellt und eine 1 eingetragen... Mit end if muss der  If else end if Block geschlossen werden.

Damit ist der kleine Zähler fertig und mit showme() wird garantiert, dass die Textarea angezeigt wird...

Wie verhält es sich nun mit Dropdownfeldern?

Dropdownfelder, Hm, das dürfte nach den vorherigen Ausführungen wirklich keine Hürde sein,


im Body sehen Sie im Prinzip schon alles, worauf es ankommt!

 <td style="vertical-align: top; text-align: center;"><div><br><br><select size="1" name="DropDown1" id="DropDown1" onChange="zahlScript">
<option value="0">Punkt eingeben!</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
 <option value="10">10</option>
</select></div></div>

Der User sucht sich also eine Zahl von 1-10. Die blauen Zahlen vor dem letzten Option sind der angezeigte Text, uns interessiert der Value, nicht die sichtbaren Zahlen.
Mit onChange="zahlScript" wird das VB-Script gestartet.

Beim Wechsel wird automatisch ein Textdokument erstellt, welches die jeweilige Zahl des Dropdownfelds  enthält:

Sub zahlScript
datname10="zahl.txt"
Set objFSO10 = CreateObject("Scripting.FileSystemObject")
     objFSO10.CreateTextFile(datname10)
     Set objFile10 = objFSO10.OpenTextFile(datname10, 2)
     objFile10.WriteLine DropDown1.Value
 objFile10.Close
 End Sub  

Das ist jetzt eine Ausführung ohne Demo, da es doch ziemlich einfach ist und sobald das Textdokument steht greifen die Ausführungen zuvor.

kleines Fazit: Mit den hier aufgeführten Bausteinen können Sie die kleinen mathematischen Herausforderungen nicht mehr schrecken - einfach Module kopieren, bei Bedarf abändern und neu kombinieren - egal ob eine Textarea/ Textblock als Schmierzettel verwenden oder ein Textdokument zum festen Speichern...dann vielleicht die eingetragenen Werte über eine unsichtbare Textarea an ein Javascript übergeben...lassen Sie ihre Fantasie spielen

Lesen Sie auch diese Abhandlung zu diesem Thema.

Löschen von Dateien und Dokumente mit integrierter Batch im VBS


VBS ist nicht unbedingt auf das Löschen von Dokumenten spezialisiert - im Gegenteil - ist eher ein Krampf im Gegensatz zum einfach gehaltenen Delete Befehl aus der CMD-Welt mit seinen vielfältigen Parametern.

Dann brauchen Sie in VBS eine Pfadangabe, was bei relativen Dokumente nicht so prickend ist.

Der Sternenhimmelstuermer weicht in solchen fällen lieber auf die cmd aus, besser auf eine Batch, die u. a. den Vorteil bietet mehrere Befehle auszuführen, nicht im Systemordner von der Kommandozeile ausgeführt wird, sondern im Ordner wo die Batch liegt - damit entfällt in vielen Fällen die leidige Pfadsucheund irgendwelche Wechselaktionen (cd)

Mal den Quellcode einer Funktion zum Löschen mit einer Batch:

Sub weg
dim variable
dim entfernen

entfernen = thema.value
variable = "del " & entfernen& "_*.txt"
 outputFile = "del.bat"
 set fso = CreateObject("scripting.FileSystemObject")
 set datei = fso.opentextfile(outputFile, 2, 1)
 datei.write "chcp 28591 > NUL" & vbCrLf
 datei.write variable & vbCrLf
 datei.write "exit" & vbCrLf
 datei.close
 
dim shell
set shell = createobject("wscript.shell")
shell.run """del.bat""", 1, true

End Sub

Mit dem Dim Befehl werden wie üblich zwei Variablen definiert, deren Namen der Fantasie überbleibt...

Thema.value ist lediglich der Textinhalt des Inputfeldes, in der der User  den  Themennamen eingab.  Der Themenname wird in der Pro und Contra HTA  als  Dateiname der einzelnen Textdokumente verwendet.

Das Thema Umweltverschmutzung beinhaltet also z. B. die Textdokumente:

Umweltverschmutzung_contra.txt
Umweltverschmutzung_contrazahl.txt
Umweltverschmutzung_pro.txt
Umweltverschmutzung_prozahl.txt
Umweltverschmutzung_zahl.txt

All diese Dokumente haben den Themennamen mit Unterstrich als Seperator vor der nächsten "Gliederungsebene" gemeinsam. Mit dem einfachen Befehl del Umweltverschmutzung_*.txt werden sämtliche Textdokumente gelöscht - der Stern steht für einen beliebig langen Text hinter dem Separator _.Bidestrich.

Dieser ist auch der ziemlich einzig erlaubte Separator in einem Dateinamen - alles andere ist so ziemlich verboten...

"del " & entfernen& "_*.txt"

Ist also der zusammengesetzte Text, wobei die Variable entfernen wie gesagt für den Themennamen steht, der den User bekanntlich selbst festlegt und aus Sich des HTA-Schreibers ziemlich uninteressant ist...

outputFile = "del.bat"

Der Dateiname der Objekthülle ist del.bat - eben ein Name für die neue Batch, die in den folgenden Zeilen geschrieben wird.

chcp 28591 > NUL ist ein Befehl der Batch, damit ü,ä usw. erkannt werden. Da das ein Text ist, muss der Befehl in Anführungszeichen stehen.
Das & vbCrLf  ist dem Umstand geschuldet, dass  nach jedem Befehl eine neue Zeile begonnen wird und ist somit der Semantik des VBS geschuldet.

In der zweiten Zeile steht die Variable mit dem Namen Variable für den Löschbefehl. Die cmd bekommt den Namen in Klarschrift übermittelt - mit dem Platzhalter Stern.

Am Ende wird mit dem shell.run Befehl die Batch gestartet und das VB-Script wartet auf die Ausführung der Batch - entspricht mit den Parametern dem start wait aus der CMD-Welt...

Fazit: Durch intelligente Vergabe von Dateinamen im Vorfeld können Sie später leicht eine Löschfunktion erstellen. Verwenden Sie lieber eine Batch, als einen einfachen Befehlssatz, damit wie in diesem Befehl die Ausführung auch one Pfadangaben klappt  -  vergessen Sie bei einem einzeiler, dass die cmd im Ordner System 32 liegt, so können Sie bei einem allgemeingültigen Löschbefehl viel Schaden anrichten - oder bekommen bei anderen Befehlen lustige Ergebnisse.

Setzen Sie zum Testen ruhig bei längeren Befehlen ein Pause-Befehl, um zu kontrollieren was bei Fehlern in der Batch nicht stimmt - Beim kurzen aufflackern des CMD-Fensters sehen Sie sonst erstmal nichts...

Dann kann man auch kleine Batches in einer HTA integrieren, aber dann muss wahrscheinlich wieder eine Menge escaped werden...




Fazit:

HTA bietet viele Möglichkeiten und macht Lust auf mehr. Das Kompendium über HTA ist die vollständigste Beschreibung über HTA im Internet. Der Sternenhimmelstuermer  wünscht Ihnen viel Erfolg!

Das könnte Sie interessieren:

Auf der Sternenhimmelstuermer wurde viel lauffähige Software im offenen Quellcode mit Erklärungen veröffentlicht. Alle gängigen Probleme wurden in tausenden von Zeilen in  teilweise individuellen Ansätzen gelöst.

Sie haben auf der Sternenhimmelstuermerseite die Chance bis hin zur anspruchsvollen Anwendung alles nachvollziehen zu können. Das erspart sehr viel Arbeit.

Der Autor dieser Abhandlung arbeitet bevorzugt mit dem simplen Texteditor von Microsoft Windows. Dieser wird grob unterschätzt. Der Texteditor ist unverwüstlich (auch ohne Zwischenspeichern ging nicht eine Zeile Code verloren).
Die Suchen und Ersetzenfunktion ist die zuverlässigste in diesem Bereich - vermeiden Sie beim Suchen und Ersetzen die bunten Alternativen,  die alle eine Sache gemeinsam haben  - Suchen und Ersetzen insbesondere von Sonderzeichen führt zu interessanten Ergebnissen... Schaffen Sie sich Bibliotheken, wie der Autor dies in der o. a.  Abhandlung  öffentlich machte.

Dann können Sie mit Copy und paste schnell den Editor füllen. Veröffentlichen Sie vorzugsweise auch die Bibliotheken (im Javascriptbereich wird das laufend praktiziert)! Klar, die werden dann von anderen geplündert, aber ein guter Programmer zeichnet sich durch seinen Stil aus. Es geht viel u viel Zeit verloren, wenn man wegen eines Codeschnipsels stundenlang im Internet sucht - das hilft niemand und wenn jeder  so handelt wie der Autor dieser Seite sind alle Gewinner...

Der Sternenhimmelstuermer programmierte eine lauffähige Probeanwendung mit Frames: eine Suchmaschine für den Desktop mit der Fähigkeit Dateien zu archivieren. Ganze 19 KB groß und eine prima Demonstration für HTA!

Des weiteren ein komplettes Sprachverschlüsselungsprogramm in einer HTA mit Frames, bei der Base64 verwendet wird und eine Batch - Ein muss für Schreiber höherwertiger Applikationen.

Dann eine Pro und Contra HTA als Demo für das Löschen von Dokumenten, Erstellen von Datenbanken, mathematischer Auswertung und Lebenshilfe...







Haftungsausschluss - Das verwenden von Tipps oder Software auf dieser Seite auf eigene Gefahr.




Impressum
Datenschutz