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.

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.


Inhaltsangabe
Grundlagen kurz und knapp
HTA Code und Befehlsreferenz
Scriptreferenz Formularschnipsel und VBS-Schnipsel
Frameset und Übergabe von Ergebnissen von Batches an HTA
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 tödlich...entscheiden Sie nach Ihren Bedürfnissen - bei Arbeiten mit Windowsobjekten (z. B. Textdateien) ist die richtige Antwort: VBS

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. Webmaster lö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...
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.

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>.

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!

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!






Zur besseren Orientierung auf den über 911  (Din A 4) Tippseiten in Abhandlungen von drei Generationen Windows der Sternenenhimmelstuermerpage die individualisierte Suchmaschine von Google mit Suchergebnissen nur von dieser Homepage: Selbst der Sternenhimmelstuemer findet sich bei diesem umfassenden Content trotz präziser Sortierung der Abhandlungen nur mit Hilfe von Suchmaschinen zu recht...


Loading


Disclaimer: Sie geben bei der Suche Daten ein, deren Verwendung nach den Regeln von Google weiterverwendet werden können. Der Sternenhimmelstuermer hat darauf keinen Einfluss, aber kommt mit diesem Hinweis der Verpflichtung aus dem Datenschutz und Telekommunikationsgesetz nach,  auf diesen Umstand aufmerksam zu machen. Mit der Eingabe eines Suchwortes stimmen Sie dieser Verfahrensweise zu, der Sternenhimmelstuermer kann hierfür nicht haftbar gemacht werden. Der Sternenhimmelstuermer distanziert sich von den Werbeinhalten.


Beim Betätigen dieses Buttons geben Sie Daten an Google weiter über deren Verwendung der Webmaster keinen Einfluss hat. Nach dem Datenschutzgesetz und Telekommunikationsgesetz ist der Webmaster verpflichtet, Sie darauf aufmerksam zu machen - Der Sternenhimmelstuermer traut Google +