Anwendungen mit ActiveX

ActiveX stellt eine eigene umfassende Objekthierarchie dar. Es beinhaltet zahlreiche Objekte mit unterschiedlichen Funktionalitäten. Dazu zählt das FileSystemObject, das für den direkten Zugriff auf eine beliebige vorhandene Datei zuständig ist, wodurch Daten ausgelesen, hinzugefügt oder verändert werden können. Und dieses soll uns allein in diesem Zusammenhang interessieren. Eine darüber hinaus gehende Darstellung des ActiveX-Objekts würde hier zu weit führen. Es ist sehr wichtig hierbei darauf hinzuweisen, daß die Anwendung eines der zur ActiveX-Technologie gehörenden Objekte, wie des FileSystemObjects, nur in bezug auf die im eigenen Computer gespeicherten Dateien möglich ist. Mit diesem Objekt geschriebene Programme sind über das Internet nicht ausführbar.

Das folgende Beispiel zeigt eine einfache Anwendung des FileSystemObjects.


Abb. 1


Formular starten  

Der Code hierfür lautet:

<html>
<head>

</head>
<body style="background-color: lightgreen;">

<div style="margin-left: 80px;"><htm></htm><br>
<br>
</div>

<form style="margin-left: 80px;" name="forma">
  <p style="font-family: Arial;"><strong>Geben Sie hier eine Liste oder

einen Text ein:</strong></p>

  <textarea name="area"></textarea>
  <p><strong><input value="Start1" onclick="datei1()" type="button">

</strong></p>

  <p><strong><input value="Start2" onclick="datei2()" type="button">

</strong></p>

  <input value="Zeige Datei" onclick="zeige()" type="button">
  <p style="font-family: Arial;"><strong>Start 1: Textdatei wird mit

eingegebenen Daten neu geschrieben&nbsp; (Writing-Modus)</strong></p>

  <p style="font-family: Arial;"><strong>Start 2: Textdatei wird

</strong><strong> mit eingegebenen Daten </strong><strong>erg&auml;nzt

(Appendix-Modus)</strong></p>

  <p style="font-family: Arial;"><span style="font-weight: bold;">Zeige

Datei: Textdatei wird angezeigt &nbsp;(Reading-Modus)</span> </p>

  <p style="font-family: Arial;"><strong><br>
  </strong></p>

</form>

<script>
function datei1()
{
ForReading = 1, ForWriting = 2;
fso = new ActiveXObject("Scripting.FileSystemObject");
f = fso.OpenTextFile("D:/EEZB/file1.txt", 2);
E=document.forma.area.value;
alert(E);
Ea=E.replace(/\n/g,">");
Eaa=Ea.replace(/>>+/g,">");
f.Write(Eaa);
window.location.reload();
}
function datei2()
{
ForReading = 1, ForWriting = 2 ; ForAppending = 8 ;
fso = new ActiveXObject("Scripting.FileSystemObject");
f = fso.OpenTextFile("D:/EEZB/file1.txt", 8);

E=document.forma.area.value;
alert(E);
Ea=E.replace(/\n/g,">");
Eaa=Ea.replace(/>>+/g,">");
f.Write(" "+Eaa);
window.location.reload();
}
function zeige()
{
ForReading = 1, ForWriting = 2 ; ForAppending = 8 ;
fso = new ActiveXObject("Scripting.FileSystemObject");
f = fso.OpenTextFile("D:/EEZB/file1.txt", 1);
A=f.ReadAll(); Aa=A.split(">");
for(x=0;x<Aa.length;x++)
document.write("<br>"+Aa[x]);
window.location.reload();
}
</script>
</body>

</html>

Der Button Start 1 ist durch den Eventhandler onclick mit der Funktion datei1() verknüpft, der Button Start 2 mit der Funktion datei2(). Beachten Sie zunächst die Zeilen 11 und 23! In Zeile 11 werden die numerischen Werte 1 und 2 den Variablen (Benennungen) ForReading und ForWriting zugewiesen. In Zeile 23 zusätzlich der Wert 8 der Benennung ForAppending. Diese drei Werte 1, 2 und 8 sind die drei Modi der OpenTextFile-Methode, die hier auf das FileSystemObject angewandt wird. In den jeweils folgenden Zeilen wird das FileSystemObject mit dem Constructor New als Teil des ActiveXObjects und als Teil der Scripting Library erzeugt und in der Variablen fso gespeichert. In den jeweils folgenden Zeilen 13, 18, 25 und 30 wird die Objektvariable fso mit der Methode OpenTextFile verbunden, was wie üblich durch einen einfachen Punkt geschieht. In Klammern dahinter folgt zunächst in Anführungszeichen der Name der Datei, auf die der Zugriff erfolgen soll. Normalerweise muß hier der gesamte Pfad angegeben werden, also Laufwerk, Verzeichnis, Unterverzeichnis, Datei. Lautet der Pfadname z.B. D:/Medline-Link/Med.txt, so bedeutet dies im einzelnen das Laufwerk D, das Verzeichnis Medline-Link und die Datei Med.txt. Dateinamen ohne Laufwerk und Verzeichnisangabe, wie in diesem Beispiel, werden vom IE automatisch mit dem Pfad C:/WINDOWS/Desktop verknüpft.

In der Klammer steht hinter einem Komma der auszuführende Modus. Dieser kann entweder mit den numerischen Werten 1, 2 und 8 bezeichnet werden, oder zur besseren Übersicht mit den Modusbenennungen ForReading, ForWriting und ForAppending, falls, wie in diesem Beispiel, eine vorangehende Zuweisung vorhanden ist.

In Zeile 13 wird mit 1 der Reading-Modus für die Datei aufgerufen und das Ergebnis in f1 gespeichert. In Zeile 14 wird auf die Objektvariable f1 die Methode Read angewandt. Zum Ergebnis T wird der in das Eingabefeld eingegebene String E hinzugefügt. Nach der Alert-Anzeige wird in Zeile 18 der Writing-Modus für dieselbe Datei aufgerufen. Auf die Objektvariable f2 wird jetzt die Methode Write angewandt. In Klammern steht der in die Datei zu transportierende Wert T + E. Mit diesem Wert wird die bestehende Datei filetest.htm überschrieben.

Die Funktion datei2() unterscheidet sich im ersten Teil nicht von der Funktion datei2(). In Zeile 30 (f2 = fso.OpenTextFile("testfile.htm", 8);) wird aber im Unterschied zur Zeile 18 der Append-Modus mit dem Wert 8 eingesetzt. In Zeile 31 kann dann mit der Methode Write der Inhalt der Datei durch den Wert E ergänzt werden. Hier kann auf die vorhergehende Ermittlung von T durch den Reading-Modus verzichtet werden. Es findet hierbei also keine Überschreibung der Datei filetest.htm statt, sondern nur deren Ergänzung um den Wert E.

In diesem einfachen Beispiel wird eine bestehende Datei um den in das Eingabefeld eingegebenen Text entweder erweitert oder durch diesen ganz ersetzt. In einem wesentlich komplizierteren Beispiel soll eine umfangreiche Liste von Zeitschriftentiteln zunächst mit der ISSN ergänzt werden und diese ergänzte Liste anschließend in einer Datei gespeichert werden, wobei eine bereits bestehende gleichnamige Datei durch diese ersetzt wird.


Abb. 2

Programm starten der zugehörige Code

Unter der Annahme, daß die ISSN-Liste sich fest eingeschrieben in einem Texteingabefeld iss des Formulars forma befindet, würde der betreffende Code folgendermaßen lauten:

1) function starte()
2) {
3) F=window.open("fenster2.htm");
4) treffer1=0;
5) treffer2=0;
6) TJ=document.forma.iss.value;
7) TJA=TJ.split(">");
8) alert(TJA.length);
9) TJ1=TJ.replace(/\s+/g," ");
10) TJ2=TJ1.replace(/\-SERIES|SERIES|\bPART|SECTION/g,"");
11) TJ3=TJ2.replace(/\bOF THE\b/g,"");
12) TJ4=TJ3.replace(/-\w\w+-/g,"");
13) TJ5=TJ4.replace(/-\w+\s\w+-/g,"");
14) TJ6=TJ5.replace(/-\w+\s\w+\s\w+-/g,"");
15) TJ7=TJ6.replace(/-/g,"");
16) TJ8=TJ7.replace(/:/g,"");
17) TJ9=TJ8.replace(/\s\s+/g," ");
18) T=document.forma.area.value;
19) p=T.indexOf("X Y Z");
20) Taa=T.slice(p+10);
21) Ta=Taa.replace(/\r\s+/g,">");
22) Tb=Ta.replace(/\s+>|>\s+/g,">");
23) Tc=Tb.toUpperCase();
24) Td=Tc.replace(/JOURNAL/g,"J");
25) TA=Td.split(">");
26) alert(TA.length);
27) for(x=0;x<TA.length;x++)
28) if(TA[x].length>1)
29) if(TA[x].search(/\w+/)!=-1)
30) {
31) Z2=TA[x].replace(/\s\s/g, " ");
32) Z3=Z2.replace(/Ü/g,"U");
33) Z4=Z3.replace(/Ä/g,"A");
34) Z5=Z4.replace(/Ö/g,"O");
35) Z6=Z5.replace(/,\sTHE\b|,\sDER\b/,"");
36) M=Z6.match(/OF THE\b/);
37) Z7=Z6.replace(/OF THE\b/, "");
38) Z8=Z7.replace(/&/g,"AND");
39) Z9=Z8.replace(/,/g,"");
40) Z10=Z9.replace(/'|`|´/g,"");
41) Z10a=Z10.replace(/-|\.|:.+/g,"");
42) Z10b=Z10a.replace(/SERIES|\bPART\b|SECTION/g,"");
43) Z10c=Z10b.replace("/","");
44) Z12=Z10c.replace(/\s+/g," ");
45) pa=Z12.search(/\(/);
46) pb=Z12.indexOf(":");
47) if(pa!=-1)
48) Z13=Z12.substring (0,pa);
49) if(pb!=-1)
50) Z13=Z12.substring(0,pb);
51) if(pa==-1&&pb==-1)
52) Z13=Z12;
53) p=TJ9.indexOf(">"+Z13);
54) px=TJ9.indexOf("=",p);
55) ZL=Z13.length+5;
56) D=px-p;
57) if(D>ZL)
58) {
59) treffer2++;
60) p2=TJ9.indexOf(">",p+1);
61) ZJ=TJ9.substring(p,p2);
62) F.document.write("<br>"+Z13+"**"+ZJ)
63) }
64) if(D<ZL)
65) {
66) p3=TJ9.indexOf("=",p);
67) p4=TJ9.indexOf(">",p3);
68) IS=TJ9.substring(p3,p4);
69) treffer1++
70) if(M)
71) F.document.write("<br>"+Z13+IS+" [OF THE]");
72) if(!M)
73) F.document.write("<br>"+Z13+IS);
74) }
75) }
76) alert(treffer1);
77) alert(treffer2+"**Treffer");
78) }

Soll dagegen der Zugriff direkt auf die in einer Datei GesamtISSN3.txt untergebrachte GesamtISSN-Liste mit dem Active-X-Objekt erfolgen, ist entsprechend die Zeile 6 durch folgende Zeilen zu ersetzen:

var ForReading = 1, ForWriting = 2;
fso =new ActiveXObject("Scripting.FileSystemObject");
f =fso.OpenTextFile("GesamtISSN3.txt",ForReading,true);
TJ=f.ReadAll();

In der letzten Zeile wird die Variable TJ nicht wie in der oben angegebenen Codezeile 6 durch Auslesen eines Formularfeldes, sondern durch Auslesen einer Datei mit der ReadAll-Methode erreicht. Davor stehen die 3 zur Definition des OpenTextFile-Objekts notwendigen Zeilen.

Nach dem Einfügen der EZB-Liste in das Eingabefeld, wird das Programm über den Start-Button gestartet, d.h. die Programmfunktion starte wird aufgerufen. Dieses beginnt mit dem Einlesen der in der Variablen f gespeicherten ISSN-Datei:

TJ=f.ReadAll();

Wie schon erwähnt, kann durch diesen direkten Zugriff auf eine Datei der Einlesevorgang sehr beschleunigt werden. Dieser würde bei einer Datenmenge von über 1 MB und bei einem Zugriff über ein Formularfeld und der Value-Methode mehrere Minuten betragen.

Eine weitere Änderung ergibt sich erst am Ende des Programms. Entsprechend dem Code in Zeile 73 F.document.write("<br>"+Z13+IS); werden im oben genannten Programm die einzelnen Ergebnisse in einem zweiten Fenster F sofort ausgeschrieben. In unserem jetzigen Beispiel sollen diese dagegen in einer eigenen Datei gespeichert werden. Zu diesem Zweck werden die Ergebnisse zunächst in einem Formularfeld deponiert, quasi als Zwischenspeicher, aus dem sie dann nach Durchlauf der Schleife abgerufen und in einer Datei gespeichert werden. Im Formularteil des Programms erhält das Formularfeld die frei gewählte Benennung S1 und wird mit folgender Zeile definiert:

<textarea name="S1" rows="1" cols="20"></textarea>

Im Skriptteil muß nun die Zeile F.document.write("<br>"+Z13+IS); durch folgende Zeilen ersetzt werden:

A=document.forma.S1.value;
document.forma.S1.value=A+">"+Z13+IS;

In der ersten Zeile liest das Programm (wohlgemerkt innerhalb einer Schleife!) den im Feld S1 vorhandenen Wert und speichert ihn in A. In der nächsten Zeile wird zu A das ermittelte Ergebnis Z13+IS, was einen Zeitschriftentitel mit zugehöriger ISSN bedeutet, mit einem vorangehenden > hinzugefügt. Im nächsten Durchlauf wird zu diesem neuen Wert ein weiterer Titel mit ISSN hinzugefügt und so fort. Die Variable A wird so zu einem kontinuierlich anwachsenden Wert. Schließlich befinden sich im Formularfeld alle ermittelten Ergebnisse.

Das Speichern kann entweder über einen besonderen Schalter eingeleitet werden oder automatisch erfolgen. Im letzteren Falle wird am Ende der Funktion starte() mit der Zeile window.setTimeout("speich()",2000); d.h. nach einer kleinen zeitlichen Verzögerung die folgende kleine Funktion aufgerufen:

1) function speich()
2) {
3) T=document.forma.S1.value;
4) var ForReading = 1, ForWriting = 2;
5) fso = new ActiveXObject("Scripting.FileSystemObject");
6) f= fso.OpenTextFile("Liste.txt",ForWriting,true);
7) f.Write(T);
8) }

In Zeile 3 wird der Inhalt des Formularfelds S1 gelesen und in T gespeichert. In den folgenden Zeilen wird das OpenTextFile-Objekt und zwar im ForWriting-Modus für die Datei Liste.txt definiert. In Zeile 7 wird diese Datei mit dem Inhalt T überschrieben.