Skripting - Grundlagen und Allgemeines

opi-hs

Mitglied
Dabei seit
09.02.05
Beiträge
558
Standort
Köln
#1
Hallo in die Forumsrunde,
ich möchte jetzt einmal mit einigen grundsätzlichen Überlegungen, die mich schon seit einiger Zeit beschäftigen, hier eine Diskussion eröffnen. Nicht zuletzt hat mich eine vorhergehende Absprache mit Michael (m.s) dazu ermutig:

Wie wäre es, wenn unter diesem Thread oder -die weitere Entwicklung in der Zukunft wird es zeigen - sogar in einem separaten Themenkreis oder gar Unterforum alles Grundsätzliche und Allgemeines zum Thema Skripting, so unter dem Motto: Fragen, Anregungen, Probleme, Tipps und Tricks zur Skript-Erstellung zusammengetragen würde. Sicher könnten eine ganze Reihe von Forumsmitglieder einiges an Beiträgen leisten, die sonst einfach untergehen, weil sie möglicherweise zu wenig mit dem einen oder anderen sonstigen Threads in diesem Unterforum zu tun haben; diese sind ja in der Regel einem speziellen Skript zugeordnet. Ich gehe davon aus, auch einiges dazu beitragen zu können. Ein solcher Themenkreis könnte durchaus zur gegenseitigen Anregung und Vertiefung in die Materie beitragen; doch vor allem - denke ich -, würde es anderen dabei helfen, die Unsicherheiten und Schwierigkeiten zum Überwinden von Anfangshürden zu beseizigen.

Das Folgende soll jetzt keine allgemeine Schelte sein, aber ich kann mich häufig nicht des Eindrucks erwehren, als säßen manchmal einige unserer Spezialisten auf einem recht hohen Ross. Zumindest vermitteln sie des öfteren diesen Anschein. Viefach schreckt man davor zurück, sie mit Fragen oder Problemchen anzugehen. Entweder ist ihnen der Aufwand zu lästig, "dumme" Fragen zu erörtern oder sie wissen auch nicht weiter und genieren sich, es zuzugeben. Egal welchen Hintergrund die Fragen haben, ob es Bequemlichkeit oder Unvermögen mangels richtigem Suchbegriff ist, das Forum zu durchstöbern oder ob es schlicht und einfach wirkliche Unwissenheit von Neulingen ist. Wie dem auch sei, einigen unserer "Wissenden" ist vielfach nicht klar, dass mit schnoddrigen oder gar überheblichen Antworten mehr Porzellan zerschlagen wird als einen lobenswerten Beitrag zu hinterlassen; ihnen wird dabei gar nicht bewusst, dass überall nur mit Wasser gekocht wird.

Der lange Rede kurzer Sinn:
Sicher ist FFSF und erst recht FF keine Plattform zum Erlernen von Skripting-Kenntnissen oder gar des Programmierens - so wie JKS mir das auch schon mal vorgehalten hat. Doch wenn FF nun schon mal eine Schnittstelle zur Erstellung von Skripten - sei es nun in JS oder VBS - anbietet, dann sollte diese Thema auch nicht zu kurz kommen. In einem eigens dafür eingerichteten Thread oder Arbeitskreis könnten dann alle damit zusammenhängenden Fragen erörtert werden. Beispielsweise so etwas wie:

* Was ist die sinnvollere Alternative - VBS oder JS
* Vor- und Nachteile der einen oder anderen Script-Sprache
* Programmierstile, guter oder schlechter Prgm-Stil
* Lesbarkeit von Skriptings
* Vor- und Nachteile einer Verschlüsselung von Quelltexten
* Eventhandling und Dialoge in FF-Skripts
* Stolperstellen und Fehler, die häufig unterlaufen
* Erörterung, warum etwas so oder so gelöst wurde
* Erörterung von Lösungsmöglichkeiten
* fachmännische Ratschläge und Beispiele
* und, und, und

So ließe sich dieser Katalog bestimmt noch um einiges verlängern. Vieles was zu diesem Themenkomplex passt, hat sicher auch im "ImageSelector" seinen Niderschlag gefunden und alleine daraus könnte ich einiges an Beiträgen leisten.


So will ich beispielsweise mit ein paar Anmerkungen zum Thema Ausführungszeit und Geschwindigkeit beim Ablauf von Skripten anfangen:
Diese Thema ist etwas "hochgekocht" im Skript "ImageSelector", wo es mich selber auch stört, dass die Reaktion auf den Selektionsbutton ("okay" oder "bad") erst mit einer deutlichen Verzögerung ausgelöst wird. Am Anfang habe ich versucht, die Abfrageschleife im zugehörigen Dialog so weit wie möglich zu optimieren, wissend, dass ein Skripting-Programm ja "nur" interpretiert wird und nicht als kompiliertes Maschinenprogramm mit viel höherer Geschwindigkeit abläuft. Doch das Ergebnis der nicht unerheblichen Optimierung zeigte kaum einen nennenswerten Erfolg. Also musste der Grund für das relativ langsame Verhalten woanders liegen.

Nach reiflicher Überlegung bin ich zu dem Schluss gekommen, das es einfach mit dem Betriebssystem und den Betriebssystemroutinen für die Behandlung von Dialogboxen zusammenhängen muss. Die Ursache ist weder in FF noch im Skript zu suchen, zumal das Handling von Dialogboxen in FF ja offensihtlich recht zügig ans Betriebssystem weitergereicht wird. Und beim Betriebssytem kommt dann zum Tragen, dass bei einem Mausbutton-Event (Klick auf einen Dialogbutton) herausgefunden werden muss, in welchem Button befindet sich gerade der Mauszeiger. Dies ist umso aufwendiger, je größer die gesamte Dialogbox ist (im Falle der "4er"-Ansicht des ImageSelectors eben der gesamte Screen) und je mehr Elemente(Buttons) in relativ kleiner Größe im verhältnis zur Gesamtbox enthalten sind. Ein solcher Suchalgorithmus ist halt eben nicht einfach im Ablauf gestaltbar.

Noch ein Wort zur Interpretationsgeschwindigkeit von Skripten. Im Gegensatz früherer Erfahrungen zur Langsamkeit von Interpretern ist der Ablauf in den heutigen Maschinen und Interpretern doch schon sehr beachtlich. Allein die Tatsache, dass die heutigen Interpreter einen Vorabcheck der Syntax eines Skriptes vornehmen, erspart gegenüber den ursprünglichen Verfahren, dies während der Laufzeit zu erledigen, schon einiges an Ausführungszeit.

Das folgende VBS-Beispiel gestattet auf einfache Weise, selbst einmal die Arbeitsgeschwindigkeit bestimmter Script-Befehle zu ermitteln. Interessiert beispielsweise mal der Zeitaufwand, der für eine als Unterroutine aufgerufene Zählschleife von 0 bis 99 benötigt, kann dies mit folgender Befehlsfolge ermittelt werden:

Code:
dim merkzeit

sub schleife
dim l_index
for l_index=0 to 99
next
end sub

merkzeit=timer
schleife
msgbox(timer-merkzeit)
Beim ersten Test traut man seinen Augen kaum. Das Ergebnis ist einfach nur 0. Man muss schon in einer zweiten Schleife den Aufruf beispielsweise 1 Million mal vornehmen, um überhaupt auf ein vernünftiges Messergenis zu kommen:

Code:
dim merkzeit,index

sub schleife
dim l_index
for l_index=0 to 99
next
end sub

merkzeit=timer
for index=0 to 1000000
schleife
next
msgbox(timer-merkzeit)
Bei meinem Rechner erhalte ich als Ergebnis ein wenig unter 5 Sekunden!

Das soll's im Augenblick gewesen sein. Was haltet ihr von derartigen Überlegungen? Wie ist eure Meinung dazu? Was habt ihr für Ideen?
Genug der vielen Worte; ihr seid dran!

Viele Grüße
Heinrich
 
Dabei seit
10.07.02
Beiträge
11.289
Trophäen
10*15!4{*}1{!}
#2
AW: Skripting - Grundlagen und Allgemeines

Hallo!

Unbedingt dafür. Da hat FixFoto nun so eine umfangreiche Skriptingschnittstelle mit zig Spezialbefehlen spendiert erhalten, deshalb sollte die auch angemessen im Forum breitgetreten werden. Übrigens, im Gegensatz zu Fotothemen würde eine Ausweitung, da ja überwiegend nur Text gepostet würde, der Traffic dafür nur moderat sein.

Die Schnittstelle wurde geschaffen, um mit Skripten diverse, oft komplexe Aufgaben lösen zu können, die dann Joachim nicht mehr zu programmieren braucht. Es gibt sicher noch eine Menge Leute im Forum, die etwas Zeit fürs Skripten erübrigen könnten, sofern der Einstieg leichter und die begleitende Unterstützung enger wäre.

Es wird dabei sicher nicht ausschzuschließen sein, daß auch mal Grundlagenfragen zur Skriptprogrammierung aufgeworfen werden. Denn die Wissensgrundlage ist bei jedem Skripter so verschieden, daß das was dem einen längst klar ist, für den anderen noch eine Hürde darstellt - und umgekehrt.

Ich sehe allerdings voraus, daß wir dafür die Skripting-Rubrik aufteilen sollten, vielleicht sogar gleich eine eigene Hauptrubrik im Forumsteil 'FixFoto-Support' daraus machen müßten. Sonst würden die zusammengetragenen Infos in kurzer Zeit völlig unübersichtlich und gerade fürs Skripten wäre eine hohe Übersichtlichkeit wichtig.

Gruß,

Ralf
 

Stefan_G.

Mitglied
Dabei seit
25.04.03
Beiträge
3.050
Standort
Nürnberg
Trophäen
Überblick verloren :-(
#3
AW: Skripting - Grundlagen und Allgemeines

Hallo,

... und vor allem braucht's für einen solchen Bereich einen/mehrere kundige/n Moderator(en)/Admin(s). Ich verstehe jedenfalls ab dem ersten Drittel des Ausgangspostings nur Bahnhof ...

Gruß
Stefan
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.541
Standort
Düsseldorf
Trophäen
*!
#4
AW: Skripting - Grundlagen und Allgemeines

Hallo,
ich finde die Idee gut und bin dabei.
Ein Thema könnte in diesem Rahmen z.B. auch sein, was ein FF-Skript immer enthalten sollte. Mein Vorschlag ist:
  • Versionskontrolle, vor allem wichtig bei Anwendung neuer Befehle die Bestandteil einer Beta-Version sind
  • Kurzbeschreibung mit Erläuterung des Skriptzwecks und der Einstellmöglichkeiten, aufrufbar über die Bedienoberfläche
  • Fortschrittsanzeige bei länger dauernden Abläufen damit der Anwender weiß, dass noch alles im grünen Bereich ist
Welche weiteren Inhalte sollten immer beachtet werden?
Der nächste Schritt ist, in der Art "Kochbuch" Skript-Routinen vorzuschlagen, wie die einzelnen Punkte zu lösen sind. Daran werde ich mich in den nächsten Tagen beteiligen.
 

opi-hs

Mitglied
Dabei seit
09.02.05
Beiträge
558
Standort
Köln
#5
AW: Skripting - Grundlagen und Allgemeines

Hallo,
(auch wenn das als Begrüßung eigentlich in der deutschen verpönt ist, wollen wir es ja nicht so förmlich nehmen),
lasst mich erst einmal sagen, dass ich schon mit einem größeren Echo auf diesen Thread gerechnet habe. Doch was nicht ist, kann ja noch werden. Vielleicht sind auch viele in den Osterferien und im Augenblick weniger präsent als sonst. Oder habe ich vielleicht viele mit dem langen Beitrag verschreckt?
von ralfeberle:
... Unbedingt dafür...
... Ich sehe allerdings voraus, daß wir dafür die Skripting-Rubrik aufteilen sollten, vielleicht sogar gleich eine eigene Hauptrubrik im Forumsteil 'FixFoto-Support' daraus machen müßten. Sonst würden die zusammengetragenen Infos in kurzer Zeit völlig unübersichtlich und gerade fürs Skripten wäre eine hohe Übersichtlichkeit wichtig...
Sehe ich ganz genau so. Doch bevor wir irgenwelche Entscheidungen treffen, sollten wir zunächst mal abwarten, wie sich die Thematik entwickelt. Und bitte, es sollte sich keiner abgeschreckt fühlen!

von Stefan_G.:
... und vor allem braucht's für einen solchen Bereich einen/mehrere kundige/n Moderator(en)/Admin(s)
Wenn sich dann noch weitere melden, bin ich gerne bereit als einer der Komoderatoren mitzuwirken (ob kundig genug bleibt abzuwarten???).

von Stefan_G.:
...Ich verstehe jedenfalls ab dem ersten Drittel des Ausgangspostings nur Bahnhof ...
Dies zu ändern, dafür - denke ich - ist ja ein solcher Arbeitskreis auch gedacht. Vielleicht machen wir dann ja noch einen Skripting-Spezi aus Dir.:cool:

von Mecki14
...ich finde die Idee gut und bin dabei.
Ein Thema könnte in diesem Rahmen z.B. auch sein, was ein FF-Skript immer enthalten sollte. Mein Vorschlag ist:

* Versionskontrolle, vor allem wichtig bei Anwendung neuer Befehle die Bestandteil einer Beta-Version sind
* Kurzbeschreibung mit Erläuterung des Skriptzwecks und der Einstellmöglichkeiten, aufrufbar über die Bedienoberfläche
* Fortschrittsanzeige bei länger dauernden Abläufen damit der Anwender weiß, dass noch alles im grünen Bereich ist

Welche weiteren Inhalte sollten immer beachtet werden?
Der nächste Schritt ist, in der Art "Kochbuch" Skript-Routinen vorzuschlagen, wie die einzelnen Punkte zu lösen sind. Daran werde ich mich in den nächsten Tagen beteiligen.
Fein, genau das passt in diesen Rahmen.


Fangen wir doch mal mit der Möglichkeit der Versionskontrolle an. In VBS liefert die folgende Funktion als Ergebnis (wahr oder falsch bzw. true oder false) die Aussage, ob die beim Anwender laufende FF-Version die für die jeweilige Skript-Anwendung erforderlichen Mindestvoraussetzungen erfüllt:
Code:
function version_equal_or_better(p_Vers)

 dim l_VersNr

 l_VersNr=split(p_Vers,".")
 version_equal_or_better=(FF_GetMajor*1000+FF_GetMinor+FF_GetBuild/1000>=_
     l_VersNr(0)*1000+l_VersNr(1)+l_VersNr(2)/1000)
 
end function

[B][I]' zu gebrauchen wäre diese Function dann beispielsweise wie folgt:[/I][/B]

if not version_equal_or_better("2.85.133") then
 msgbox("So'n Mist, ohne Version 2.85 Build 133 geht nix")
end if
Ich fände es jetzt in diesem Zusammenhang sehr schön wenn sich jemand bereit fände, diesen VBS-Code in JS-Code darzustellen. Ich habe keine Lust, alles alleine machen zu müssen.

Gruß
Heinrich
 
Zuletzt bearbeitet:

hhoefling

Mitglied
Dabei seit
02.01.04
Beiträge
3.992
Standort
NRW/Ruhrgebiet
Trophäen
4! 2*
#6
AW: Skripting - Grundlagen und Allgemeines

Wer einen Blick in meine Scripte wirft, wird immer
am Anfang so was in der Art finden:

Code:
var ff  = 1.0 *  (FF_getMajor * 100) + FF_GetMinor() + (FF_GetBuild() / 1000);
if( ff < 285.060)
  FF_MessageBox("FixFoto Version 2.85 B60 oder höher erforderlich\r\nScript-Abbruch",16);
else 
 ...
 

opi-hs

Mitglied
Dabei seit
09.02.05
Beiträge
558
Standort
Köln
#7
AW: Skripting - Grundlagen und Allgemeines

Danke Heinz,
ich hoffe nur, wir betreiben hier keine brotlose Kunst.
Heinrich
 

kuni-r

Mitglied
Dabei seit
26.11.02
Beiträge
5.346
Standort
Nähe Memmingen
Trophäen
auch
#8
AW: Skripting - Grundlagen und Allgemeines

...oder sowas, wenn man mit der Include-Möglichkeit arbeiten möchte:
Code:
function versionCheck(version, build, scriptname)
{
var currVersion = eval(FF_GetMajor() + "." + FF_GetMinor());
var currBuild = FF_GetBuild;


if ((currVersion < version) || (currVersion == version) && (currBuild < build))
	{
	message = "Für das Skript \"" + scriptname + "\" ist FixFoto Version " + version + " Build " + build;
	message += " oder neuer erforderlich.\nDas von Ihnen verwendete FixFoto hat aber nur Versionsnummer ";
	message += currVersion + " Build " + currBuild + ".";
	message += "\n\nBitte besorgen Sie sich die aktuelle FixFoto-(Beta)Version!";
	mb(message);
	return false;
	}

}
mit folgendem Aufruf im Skript:
Code:
if (versionCheck("2.85", "104") == false) return;
Ist nur abgeschrieben, was nicht heißt, daß ich das auch verstehe.

Ich glaube, da liegt auch das Problem der etwas geringeren Resonanz als erwartet. Ich zum Beispiel verstehe manches, aber eben längst nicht alles. Aber, ich denke, wenn sich hier ein paar Cracks engagieren, wird sich das recht schnell ändern.
 

kuni-r

Mitglied
Dabei seit
26.11.02
Beiträge
5.346
Standort
Nähe Memmingen
Trophäen
auch
#9
AW: Skripting - Grundlagen und Allgemeines

Hallo,

Micha hat da auch schon ein wenig Vorarbeit geleistet, als wir das AdvancedShadow gebaut haben. Die dort mitgelieferte framework.js enthält noch einige weitere Aufrufe, wie zum Beispiel für eine Hilfedatei, etc.

Vielleicht kann Micha sich hier auch ein klein wenig mit einbringen und das eine oder andere beisteuern?
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.541
Standort
Düsseldorf
Trophäen
*!
#10
AW: Skripting - Grundlagen und Allgemeines

Hallo Heinz,
in Deiner schönen Funktion version_equal_or_better(p_Vers) hat sich ein kleiner Schreibfehler eingeschlichen.
In der Zeile
Code:
version_equal_or_better=(FF_GetMajor*1000+[COLOR="Red"]lFF_GetMinor[/COLOR]+FF_GetBuild/1000>=_
     l_VersNr(0)*1000+l_VersNr(1)+l_VersNr(2)/1000)
muss es statt lFF_GetMinor heißen FF_GetMinor (ohne vorangestelltes "l").
Ich will nicht pingelig sein, aber bevor sich jemand an dem Code beim ausprobieren die Zähne ausbeißt, sollte das korrigiert werden.
 

opi-hs

Mitglied
Dabei seit
09.02.05
Beiträge
558
Standort
Köln
#11
AW: Skripting - Grundlagen und Allgemeines

Hallo Harald,
hast ja vollkommen recht; ist schon in Ordnung! Danke!
Heinrich
 

W.P.

Mitglied
Dabei seit
16.10.02
Beiträge
5.023
Standort
Anzing BY
#12
AW: Skripting - Grundlagen und Allgemeines

Hallo,
in einer CheckForRun-Funktion sollte auch 2 weitere Fälle abgefangen werden:
  1. Unterstützt FF bereits FF_GetMajor etc. - Diese Funktionen sind nicht von Anfang an verfügbar, falls doch noch jemand irgendwo eine Uralt-Version von FF installiert hat
  2. Wird das Skript außerhalb einer FF-Umgebung ausgeführt, so wäre es nützlich, auch dies mit einer Meldung abzufangen. Ich benütze immer dazu einen Befehl aus dem ersten verfügbaren Befehlssatz: FF_GetImageCount
Beide Fälle lassen sich nur mit einer Fehlerbehandlung abfangen.

Nützlich ist auch, wenn man Skripte bereits für Betas und über viele Versionen bereit stellt und stetig anpasst: Eine Funktion wie CheckForFunction:
Code:
Function CheckForFunction(ByVal sVersion)
	Dim aVersion
	Dim lVersion
	Dim lFF
	
	aVersion = Split(sVersion, ".")
	lVersion = CLng(aVersion(0)) + CLng(aVersion(1)) / 10000 + CLng(aVersion(2)) / 100000000
	lFF = CLng(FF_GetMajor) + CLng(FF_GetMinor) / 10000 + CLng(FF_GetBuild) / 100000000
	If lVersion <= lFF Then CheckForFunction = True Else CheckForFunction = False	
End Function
Zum Coding generell hat sich auch folgendes bewährt:
Nichts Wesentliches zum Skriptablauf in der Hauptebene des Skriptes codieren. Sobald globale Variablen definiert sind, mit CheckForRun in eine Main oder SubMain-Routine springen. Von dort kann man ohne große Umständen aussteigen und nach dem Ausstieg in der Hauptebene den Speicher oder Objekte noch geordnet aufräumen.

Soll ein Skript unter mehreren Laufzeitumgebungen laufen (FF, HTA + IE, WSH), so sollten wesentliche Dinge, wie das Abfragen des Skriptpfades gekapselt werden. Es hilft beim Start (z. B. bei CheckForRun) festzustellen, in welcher Umgebung man sich befindet und eine globale Variable zu setzen, die man für Abfragen der Spezialroutinen nützen kann.
Momentan dürfte gerade das Ermitteln des aktuellen Skriptpfades etwas schwierig sein; hoffe Joachim bekommt das in den Griff, sonst darf man sich noch mit dem Abfangen von relativen Pfaden befassen.
 
Dabei seit
10.07.02
Beiträge
11.289
Trophäen
10*15!4{*}1{!}
#13
AW: Skripting - Grundlagen und Allgemeines

Hallo!

Pferde scheu machen gilt nicht: Ein Moderator muß in erster Linie moderieren, nicht extremes Fachwissen vorweisen. Es genügt ein allgemeines Verständnis der Sache, denn die gehaltvollen Infos sollen ja von den Usern kommen. ;)

Gruß,

Ralf
 

Walter-46

Mitglied
Dabei seit
08.10.06
Beiträge
1.744
Standort
Meppen
Trophäen
*****!!! {**!!!}
#14
AW: Skripting - Grundlagen und Allgemeines

.... dass ich schon mit einem größeren Echo auf diesen Thread gerechnet habe. Doch was nicht ist, kann ja noch werden......

Auch von hier schallt das Echo zurück: Sehr dafür!!

Auch sehe ich in diesem Thread schon sehr sehr viele Informationen in ungeordneter Weise. Wenn eine neue Unterrubrik als 'Nachschlagewerk' dienen soll, dann müßten die Themen und Unterthemen aber eingerichtet sein, bevor dieser Thread hier 30 Seiten lang wird.....

Nun zur konstruktiven Seite, zumindest was mir so bei ersten anlesen einfiel:

Schön wäre eine Unterteilung der Themenschwerpunkte nach Anfänger - Fortgeschrittene - Profis.
Nach deren Gewichtung sollte auch die Ausführlichkeit der Erläuterungen zu einzelnen Beispielen verfaßt werden. - Und ja, Beispiele, die man auch leicht auffinden kann, sind immer gute Helfer bei Fragen. Wenn aber die Forensuche nach einem Scriptbefehl als Ergebnis einen Thread liefert, der viele Seiten umfaßt, dann ist die Lösungssuche weniger komfortabel. Je mehr Beispielsvarianten zum Thema, umso verständlicher wird vieles.

Eine andere Idee wäre: Wenn ich in der FixFoto FF-Script-Befehlsreferenz auf eine Funktion klicke,
dann erhalte ich auf der rechten Seite den Datentyp, die Funktion, die Beschreibung und die Argumente geliefert. Schön wäre es, wenn hier zukünftig ein Link eingebaut würde, der eben online zu diesem Befehl mit Beispielen in dieses Forum verzweigt. Dort stünde zwar zu Beginn noch nicht viel drin, aber bei entsprechendem Engagement könnte da von vielen Usern so einiges Wissen zugefügt werden. Als Beispiel nenne ich mal die hervorragende Ausführungen von Mecki zu den Dialogbefehlen.


Viele Grüße
Walter
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.541
Standort
Düsseldorf
Trophäen
*!
#15
AW: Skripting - Grundlagen und Allgemeines

Mir fällt auf, dass in vielen Beispielskripten den Variablen Kleinbuchstaben vorangestellt werden. Dies soll offensichtlich dazu dienen, einen Hinweis auf den Variablentyp zu geben, z.B. "l" für Long und "s" für String. Gibt es dafür eine allgemein gültige Festlegung?
 

hhoefling

Mitglied
Dabei seit
02.01.04
Beiträge
3.992
Standort
NRW/Ruhrgebiet
Trophäen
4! 2*
#16
AW: Skripting - Grundlagen und Allgemeines

Alles Geschmacksache.
Ich verwende häufig "g_" bei Globalen Variablen um sie nicht aus versehen mit einer lokalen Variablen in einer Funktion zu überdecken.

Da sowohl vbs als auch jscript der Variabentyp sowieso egal ist und entsprechende Umwandlung
automatisch durchgeführt werden (sofern möglich) verzichte ich darauf.
Dann muss man allerdings aufpassen das a+b (mit a="1" und b="2") auch 3 und nicht "12" ergibt.
In einem solchen Fall hilft es auch nicht "a" und "b" "ia" und "ib" zu nennen.
in Jscript multipliziere ich immer mit 1.0 um die Umwandlung in eine Zahl zu erzwingen.
 

W.P.

Mitglied
Dabei seit
16.10.02
Beiträge
5.023
Standort
Anzing BY
#17
AW: Skripting - Grundlagen und Allgemeines

Hallo Harald,

ich halte es für sinnvoll, um den Überblick zu haben. Es gibt sogar Programmierer, die sagen es sei obsolet und verpönen es sogar, da die IDE sowieso eine Fehlbenützung vorbeugt.
Wenn man Code nach längerer Zeit liest oder geistig "ferngesteuert"(weil eigentlich was anderes wichtiger wäre) manipuliert, erkennt man schneller den Verwendungszweck einer Variable, ohne wirklich alles genau zu dokumentieren. Sonst dauert die Dokumentiererei länger als der Code zu schreiben ist.
 

opi-hs

Mitglied
Dabei seit
09.02.05
Beiträge
558
Standort
Köln
#18
AW: Skripting - Grundlagen und Allgemeines

Hallo Harald,
ja, dem kann ich mich nur anschließen.

Eine Typfestlegung ist so gut wie überflüssig, da sowieso - bis auf bestimmte Situationen - alles als Typ Variant (in VBS wie JS) betrachtet wird. Ich habe mir angewöhnt, gloale Variablen mit einem g_ voranzusetzen und lokale mit l_ zu kennzeichenen. Übergabeparameter makiere ich mit einem p_ und Konstanten werden bei mir durchweg komplett in Großschrift ohne eine zusätzliche Kennung dargestellt.

Bei den Definitionen von Funktionen bzw. Subroutinen (Prozeduren) - in VBS unterschiedlich mit function und sub deklariert wohingegen JS dafür nur function kennt - versuche ich immer Namen zu finden, die erkennen lassen, dass eine Funktion ein Ergebnis zurückliefert (z.B. max_of oder str_of_date) während Prozeduren etwas erledigen, machen, anstellen (z.B. clr_stack oder show_questbox). Dadurcu lässt sich - nach einer gewissen Zeit auch für den Entwickler - das Programm (der Quelltext, das Skript) wesentlich einfacher lesen oder nachvollziehen.

Gruß
Heinrich
 

opi-hs

Mitglied
Dabei seit
09.02.05
Beiträge
558
Standort
Köln
#19
AW: Skripting - Grundlagen und Allgemeines

Hallo,
das Problem, was Werner im Beitrag 12 anspricht ist völlig zutreffend. Der Test nach Vorliegen einer bestimmtem FF-Version mit Hilfe der FF_-Kommandos FF_GetMajor, FF_GetMinor und FF_GetBuild versagt dann, wenn mit einer "Uralt"-FF-Version gearbeitet wird, die diese FF_-Skripting-Befehle noch nicht kennt. Zu diesem Zweck sollte der Test bezüglich der Versionverträglichkeit einen zusätzlichen Fehlercheck mit beinhalten. Dies könnte wie folgt aussehen.
Code:
function version_equal_or_better(p_Vers)

 dim l_VersNr

 l_VersNr=split(p_Vers,".")
 [B]on error resume next[/B]
 version_equal_or_better=(FF_GetMajor*1000+FF_GetMinor+FF_GetBuild/1000>=_
     l_VersNr(0)*1000+l_VersNr(1)+l_VersNr(2)/1000)
 [B]if err.number[/B]<>0 then version_equal_or_better=false
 [B]on error goto 0[/B]
 
end function

' zu gebrauchen wäre diese Function dann wie im ursprünglichen Beitrag 5 angedeutet
Zur Erläuterung:
Die Statementzeile: on error resume next führt dazu, dass ein Runtimefahler in den nächsten Zeilen ignoriert wird obwohl intern vom Interpreter der Fehler in der - ich sage jetzt hier mal Variablen - err.number festgehalten wird. Tritt also dadurch, dass in der nächsten Zeile durch den Aufruf von FF-Befehlen ein Fehler auf weil sie in Uralt-Versionen noch nicht existieren, bricht der Programmablauf nicht ab sondern hält lediglich die Fehlernummer in err.number fest. In der nächsten Zeile wird also abgefragt, ob ein Fehler aufgetreten ist (err.number<>0), wodurch zutreffendenfalls der Rückgabewert der Funktion jetzt explizit auf false gesetzt wird. Nach dieser Fehlerfallbehandlung wird das Interpreter-Verhalten zum Behandeln von Runtime-Fehlern wieder auf "normal" gesetzt mit dem Statement: on error goto 0

Bei dieser Lösungsmöglichkeit wirkt sich auch positiv aus, das das Ergebnis auf Versionsverträglichkeit ohne zusätzliche Zwischenvariable direkt in einem einzigen Statement - was zum Fehler führen könnte - direkt dem Funktionsrückgabewert zugewiesen wird. Nur im Fehlerfall wird der Funktion dann explizit false zugewiesen.

Gruß
Heinrich
 

opi-hs

Mitglied
Dabei seit
09.02.05
Beiträge
558
Standort
Köln
#20
AW: Skripting - Grundlagen und Allgemeines

Hallo,
in Ergänzung des letzten Beitrages möchte ich den Vorschlag von Werner aus seinem Beitrag 12 aufgreifen und ein weiteres Muster zur Fehlerabfrage und deren Nutzung vorstellen. Wie Werner ausführte, kann es von Interesse sein, zu ermitteln, ob ein Skript aus der FF-Umgebung heraus aufrufen wird oder "Stand-alone" läuft. Benutzen ließe sich dazu nach Werners Idee der FF_-Befehl FF_GetImageCount gewissermaßen als ein FF-Skripting-Befehl der ersten Stunde wie folgt.

Code:
function is_FF_available

[B] on error resume next[/B]
 is_FF_available=FF_GetImageCount
 is_FF_available=(err.number=0)
[B] on error goto 0[/B]

end function
Anmerkungen:
Auch hier kommt man völlig ohne zusätzliche lokale Variablen zurecht. Der Aufruf von FF_GetImageCount bedarf als Funktion natürlich ein Zuweisungsziel. Um sich hier eine völlig überfüssige Dummy-Variable, der der Wert von FF_GetImageCount zugewiesen würde, zu ersparen, weisen wir ihn zunächst einfach dem Funktionsrückgabewert is_FF_available zu. Es geht ja zunächst nur darum, festzustellen, ob der Aufruf von FF_GetImageCount fehlerfrei funktioniert oder nicht. In der folgenden Statementzeile wird dann das wirkliche is_FF_available-Rückgabeergebnis (err.number=0 als true oder false) zugewiesen und an den Aufrufer von is_FF_available zurück geliefert.

@Harald:
Dies ist auch ein schönes Beispiel dafür, dass die Typfestlegung in VBS (oder auch JS) irrelevant ist. Erst wird is_FF_available (dummy-weise) ein Ganzzahlergebnis (von FF_GetImageCount) zugewiesen und anschließend das boolsche Ergebnis von err.number=0, womit die Funktion "is_FF_available" zu einer boolschen Funktion avanciert.

Gruß
Heinrich
 
Oben