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
Der Code hierfür lautet:
<html> </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.