Skripting - Grundlagen und Allgemeines

opi-hs

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

Hallo Walter,
Hallo Heinrich,
fast liest es sich so an, als hättest Du eine Lösung für den Direktzugriff auf eine Stack-Position gefunden. Ist aber wohl so, dass Du den Stack der Reihe nach wieder abbauen würdest - oder? ...
Jein, möglicherweise gehen wir von unterschiedlichen Situationen aus. Der auch von Werner in seinem vorhergehenden Beitrag erwähnte Direktzugriff über die Ordnungnummer der Stackposition bietet (nur) die Möglichkeit, ein dort vorher mit FF_PushImage hintransferiertes Image in ein Dialog(Steuer)element vom Typ IMAGE zu laden und innerhalb eines Dialoges anzuzeigen. Man sollte diese Anzeige aber nicht mit der "normalen" in der FF-Arbeitsfläche verwechseln; das sind zwei völlig verschiedene Schuhe.

Ansonsten gibt es eben nur die Zugriffsmöglichkeiten PushImage / PopImage nach der LIFO-Methode (LastIn-FirstOut) zum Durchschieben des Images von Position 0 in den Stackspeicher (Position 1 .. n) bzw. wieder zurück, SwapImage für den direkten Austausch der Images auf den den Positionen 0 und 1, Load Image für den Transfer eines Images von einem Speichermedium in die Position 0, NewImage zum Erzeugen eines leeren Bildes (gewissermaßen Löschen) auf der Position 0, SaveImage zum Transfer eines Images von Position 0 zum Speichermedium, ImportImage("") zur Darstellung eines auf Position 0 befindlichen Images im FF-Arbeitsfenster und ShowImage zur Darstellung eines auf Position 0 befindlichen Images in einem eigenen Fenster.

Dies scheinen (zumindest nach meinen Erkenntnissen) alle diesbezüglichen Skript-Operationen zu sein. Ein Nachteil für das zuletzt genannte Kommando FF_ShowImage, das zwar eine einfachere Möglichkeit bietet, ein Image ohne das Arbeiten über das Dialog-Handling anzuzeigen, liegt in der Tatsache, dass jedes in Folge innerhalb eines Skriptes ausgeführte FF_ShowImage stets eine neue "Fenster-Instanz" erzeugt. Ich habe noch keine Möglichkeit gefunden, ein so mit ShowImage erzeugtes Fenster vor dem nächsten ShowImage erst mal wieder zu schließen.
Vielleicht lässt sich Joachim hierzu mal was einfallen.

Ansonsten halte ich die von Werner angegebene Begrenzung des Stacks auf 10 Plätze für nicht (mehr) zutreffend. Es können soviel Stackpositionen belegt werden, wie Speicherplatz zur Verfügung steht. Dies ist lediglich dvon abhängig, wie groß die auf den Stack gepushten Images sind und wieviel Arbeitsspeicher im Rechner zur Verfügung steht und von FF nicht anderweitig benutzt wird.

Gruß
Heinrich

Nachtrag: Die Anmerkung, dass die mit FF_ShowImage separat geöffneten Fenster zur Darstellung von Images nicht geschlossen werden können, gilt so nur für die Steuerung aus einem Skript heraus (mangels eines entsprechenden FF_Befehles). Interaktiv lässt sich ein solches mit FF_ShowImage geöffnetes Fenster sehr wohl schließen, denn das Fenster verfügt - wie bei Windows üblich - in der oberen Leiste über einen Exit-Button (X), mit dem per Mausklick das Fenster geschlossen wird.

In der Aufzählung der vorstehenden FF_Image-Transferbefehle fehlt noch die Erwähnung von FF_Reload. Zu diesem Befehl heißt es in der Bedienungsanleitung:
Das Bild im Speicher wird in die FF-Arbeitsfläche übernommen.
Beim Test dieses Befehles ist mir aufgefallen, dass damit erst nach Abschluss des Skriptes - egal zu welchem Zeitpunkt der Befehl im Skript ausgeführt wird - das zuletzt im Speicher befindliche Image auf die FF-Arbeitsfläche geladen wird. Damit kann sichergestellt werden, dass das im Skript zuletzt bearbeitete Image in der FF-Arbeitsfläche zum Abschluss dargestellt wird.
 
Zuletzt bearbeitet:

Walter-46

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

Danke für die Klarstellung - sehr schön erklärt !

Direktzugriff auf Stackposition 3 gelingt also nur per LIFO - wenn aber die Bilder auf Stackpositon 1 und 2 nicht verloren gehen dürfen, dann muß ich sie zwangsläufig über das langsame FSO in zwei Temporärdateien auslagern? Oder lassen sich woanders die beiden Bilder vom Stack No.1+2 schneller ablegen und wiederholen (Clipboard?)

VG
Walter
 
Zuletzt bearbeitet:

opi-hs

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

Hallo Walter,
Direktzugriff auf Stackposition 3 gelingt also nur per LIFO - wenn aber die Bilder auf Stackpositon 1 und 2 nicht verloren gehen dürfen, dann muß ich sie zwangsläufig über das langsame FSO in zwei Temporärdateien auslagern? Oder lassen sich woanders die beiden Bilder vom Stack No.1+2 schneller ablegen und wiederholen (Clipboard?)
Ja, dem ist wohl so. Ich sehe im Augenblick auch keine andere Möglichkeit als die von Dir vorgeschlagene, Images aus den Beispiel-Stackpositionen 1 und 2 in temporäre Dateien auszulagen. Das aktuelle Image von Position 0 kann natürlich mit SwapImage gegen das auf Position 1 getauscht werden und nach der Zwischensicherung vom ursprünglich auf 1 positionierten mit PopImage zurückgeholt werden.
Was den Clipboard-Zugriff in einem Skript anbetrifft: der geht ja offensichtlich nur mit Text (FF_TextFromClipboard und FF_TextToClipboard).

Bezüglich der FF-Skripting-Befehle habe ich noch eine kleine Ergänzung in meinem Beitrag 41 weiter oben hinzugefügt.

Gruß
Heinrich
 

Walter-46

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

....eine neue "Fenster-Instanz" erzeugt. Ich habe noch keine Möglichkeit gefunden, ein so mit ShowImage erzeugtes Fenster vor dem nächsten ShowImage erst mal wieder zu schließen.
Vielleicht lässt sich Joachim hierzu mal was einfallen.

Nachtrag: Die Anmerkung, dass die mit FF_ShowImage separat geöffneten Fenster zur Darstellung von Images nicht geschlossen werden können, gilt so nur für die Steuerung aus einem Skript heraus (mangels eines entsprechenden FF_Befehles). Interaktiv lässt sich ein solches mit FF_ShowImage geöffnetes Fenster sehr wohl schließen, denn das Fenster verfügt - wie bei Windows üblich - in der oberen Leiste über einen Exit-Button (X), mit dem per Mausklick das Fenster geschlossen wird.
Hallo Heinrich,

hast Du es auch über den Tastaturpuffer probiert? (<ESC> oder <ALT-F4> läßt sich einspeisen). Bezüglich des Aufrufes einer mit einem Buchstaben verknüpften FF-Funktion über das Scripting habe ich gute Erfahrungen gemacht.

VG
Walter
 

opi-hs

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

Hallo Walter,
vielen Dank für den ergänzenden Hinweis. Du hast natürlich völlig Recht, dass neben dem Klick auf den Exit-/Abbruch-Button eines Fenster das gleiche Verhalten mit ESC bzw. ALT-F4 erzielt werden kann - solange es sich um Fenster handelt, die innerhalb eines Skriptes geöffnet werden.

Gruß
Heinrich
 

opi-hs

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

Hallo, Skripting Spezialisten,
kann mir jemand bei folgender Frage weiterhelfen:

Wenn aus einem Skript via

<< Shell.exec Parameter>>
oder
<<Shell.run parameter>>

ein externes Programm (z.B.: mein_Prgm.exe) aufgerufen wird, kehrt die Programmkontrolle sofort wieder zum aufrufenden Skript zurück und nicht erst (wie von einem möglicherweise Unbedarften unterstellt) nach Ausführung des externen Prgm. Womit hängt das zusammen und wie kann ich die weitere Ausführung des Skriptes bis zum Ende der externen Ausführung anhalten?

Und was ist in diesem Zusammenhang der Unterschied zwischen "exec"- und "run"-Aufruf? Warum öffnet sich bei der externen Ausführung unter Windows-xp vorübergehend das "command.com"-Fenster?

Gruß
Heinrich
 

W.P.

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

Hallo Heinrich,

siehe WSH-Anleitung:
Run-Methode

Führt ein Programm in einem neuen Prozess aus.

object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

Argumente
object
WshShell-Objekt.

strCommand
Zeichenfolgenwert, der die auszuführende Befehlszeile angibt. Es müssen alle Parameter angegeben werden, die an die ausführbare Datei übergeben werden sollen.

intWindowStyle
Optional. Ganzzahliger Wert, der das Erscheinungsbild des Fensters des Programms angibt. Beachten Sie, dass nicht alle Programme diese Informationen verwenden.

bWaitOnReturn
Optional. Boolescher Wert, der angibt, ob das Skript auf die Beendigung der Programmausführung warten soll, bevor mit der nächsten Anweisung im Skript fortgefahren wird. Falls dieses Argument auf true festgelegt ist, wird die Skriptausführung angehalten, bis das Programm beendet ist, und Run gibt den vom Programm zurückgegebenen Fehlercode zurück. Falls dieses Argument auf false festgelegt ist, kehrt die Run-Methode sofort nach dem Start des Programms zurück und gibt automatisch 0 zurück (dies ist nicht als Fehlercode zu interpretieren).

Hinweise
Die Run-Methode gibt eine ganze Zahl zurück. Die Run-Methode startet ein Programm, das in einem neuen Windows-Prozess ausgeführt wird. Das Skript kann so erstellt werden, dass vor dem Fortfahren auf die Beendigung der Ausführung des Programms gewartet wird. Hierdurch können Skripts und Programme synchron ausgeführt werden. Umgebungsvariablen im Argument strCommand werden automatisch erweitert. Wenn ein Dateityp ordnungsgemäß für ein bestimmtes Programm registriert wurde, wird das Programm ausgeführt, wenn Run mit einer Datei dieses Typs aufgerufen wird. Wenn beispielsweise Word auf dem Computersystem installiert ist, wird beim Aufrufen von Run mit einer DOC-Datei Word gestartet und das Dokument geladen. In der folgenden Tabelle sind die verfügbaren Einstellungen für intWindowStyle aufgeführt.

intWindowStyle Beschreibung
0 Blendet das Fenster aus und aktiviert ein anderes Fenster.
1 Aktiviert ein Fenster und zeigt es an. Wenn das Fenster minimiert oder maximiert ist, stellt das System es mit seiner ursprünglichen Größe und Position wieder her. Eine Anwendung sollte dieses Flag angeben, wenn das Fenster zum ersten Mal angezeigt wird.
2 Aktiviert das Fenster und zeigt es als minimiertes Fenster an.
3 Aktiviert das Fenster und zeigt es als maximiertes Fenster an.
4 Zeigt ein Fenster in der jeweils aktuellen Größe und Position an. Das aktive Fenster bleibt aktiv.
5 Aktiviert das Fenster und zeigt es in der aktuellen Größe und Position an.
6 Minimiert das angegebene Fenster und aktiviert das Fenster auf der nächstniedrigen Ebene in der Z-Reihenfolge.
7 Zeigt das Fenster als minimiertes Fenster an. Das aktive Fenster bleibt aktiv.
8 Zeigt das Fenster in seinem aktuellen Zustand an. Das aktive Fenster bleibt aktiv.
9 Aktiviert das Fenster und zeigt es an. Wenn das Fenster minimiert oder maximiert ist, stellt das System es mit seiner ursprünglichen Größe und Position wieder her. Eine Anwendung sollte dieses Flag angeben, wenn ein minimiertes Fenster wiederhergestellt wird.
10 Legt den Anzeigezustand basierend auf dem Zustand des Programms fest, das die Anwendung gestartet hat.
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.810
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#48
AW: Skripting - Grundlagen und Allgemeines

Hallo Heinrich,
die WSH-Anleitung, die Werner meint kannst Du Dir bei Microsoft hier herunterladen. Die Anleitung installierst Du mit der Datei scd56de.exe. Sie ist sehr hilfreich, um mal schnell etwas nach zuschlagen und bietet in der Regel sogar Beispiele an, sowohl für vbs- als auch für js-Skripte, sofern ein Befehl in beiden Skriptversionen verwendbar ist.
 

opi-hs

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

Hallo Werner,
Hallo Harald,
vielen Dank für die Hinweise; sie haben mir schon einen Großteil weitergeholfen.

(Hätte ich ja auch selber nachschlagen können; aber mit dieser Unterstützung fällt es einem schon mal leichter; danke)

Gruß
Heinrich
 

opi-hs

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

Probleme mit dem Skript-Befehl: "FF_SetProgressText(VT_I4 progress, VT_I4 range, VT_BSTR text)"

Im Zuswammenhang mit der Entwicklung des Skriptes "FraktSkalierung" ist mir ein besonderes Verhalten mit vorstehendem Skript-Befehl aufgefallen:

Ich habe für die Erstellung von Web-Alben meinem Perfektionierungszwang ein wenig freien Lauf gelassen. Für eine optimale Bilddarstellung in einem Web-Album erscheint es mir sinnvoll, wenn im Zeitalter der größeren Monitor-Formate (zB.: 1920x1200) das aus dem Internet herunter zu ladende Image eine entsprechende Auflösung von Hause aus besitzt. Eine zwangsweise Heraufskalierung im Web-Browser wäre wegen der sich ergebenden leeren "Vergrößerung" wenig opportun. Also sollte man unter Verwendung des "Formatnormierung"-Skriptes von Mecki14 oder des aus meiner Feder stammenden vorgenannten "FraktSkalierung"-Skriptes eine Herunterskalierung auf ein Format vornehmen, das gerade in das Bildschirmformat des Zielmonitors passt.

Dafür benötigt man zum Hochladen auf die WebPage natürlich einen entsprechenden Speicherplatz; aber bei den relativ günstigen Preisen heutzutage ("man gönnt sich ja sonst nichts") hält sich der (finanzielle) Aufwand dafür in Grenzen. Doch man erkauft sich damit auch gewisse Nachteile: Anwender, die keinen entsprechend "großen" Monitor einsetzen, müssen entweder mit einer Scrol-Darstellung leben oder ein Herunterskalieren in mäßiger Qualität durch den jeweiligen Explorer akzeptieren. Ich habe nun zu einer etwas aufwendigeren Lösung gegeriffen: Ich halte im Webspace für das gewünschte Web-Album nicht nur ein Image mit der vorgesehenen großen Auflösung vor, sondern lege dort weitere Images ab, die mit dem qualitativ guten FF-Skalierungsalgorithmus auf weitere "gängige" Monitorformate heruntergerechnet sind. "Meine" Album-Steuerung" ermittelt dann beim Aufruf des Albums das Monitorformat beim Anwender und entscheidet dann automatisch, welches gerade noch passende Image heruntergeladen werden soll. Fuktioniert soweit ausgezeichnet.

Doch jetzt zum eigentlichen Problem:
Ich habe zu meinem Skript eine kleine Ergänzung vorgenommen. Es handelt sich gewissermaßen um ein "Vorscript", das mit einem Aufrufparameter dann das eigentliche FraktSkalierung-Skript aufruft. Dies erkennt dann am übergebenen Parameter, dass es nicht nur die Fotos auf das angegebenen (Maximal-)Format skalieren soll, sondern dies direkt auch zusätzlich für weitere abgestufte Formate erledigen soll. Das funktioniert so weit auch sehr zufriedenstellend bis auf eine Kleinigkeit, die ich auch schon an JKS weitergegeben habe:
Der im Hauptskript eingebaute Befehl
"FF_SetProgressText(VT_I4 progress, VT_I4 range, VT_BSTR text)[/B]"
wird nicht durch die sonst übliche FixFoto-Fortschrittsanzeige am unteren Bildrand angezeigt. Im Stand-Alone-Aufruf-Modus des FraktSkalierung-Skriptes arbeitet der Befahl aber einwandfrei wie erwartet.

Angeregt durch die Anleitung zum Dialoghandling von Mecki14 habe ich den dort erwähnte Dialogelement PROGRESS verwendet, mit dem dann die eigene programmierte Fortschrittsanzeige ausgezeichnet funktioniert.

Die Anzeige erfolgt über einen sich selbsttätig öffnenden Dialog, der sich dann nach Ablauf der gesamten Anwendung auch wieder schließt. Für Interessenten hier der diesbezügliche Skript-Ausschnitt:


const PROGDIALOG="myProgress"

sub skaliere
const MAX_i=1000000
dim l_Index
for l_Index=1 to MAX_i ' hier wäre das eigenliche Skalieren zu formulieren
call FF_SetControl(PROGDIALOG,"Anzeige",(l_Index/MAX_i)*100)
next
end sub

sub progress
call FF_AddDialog(PROGDIALOG,300,50)
call FF_AddControl(PROGDIALOG,"Anzeige","PROGRESS",10,20,280,20)
call FF_SetDialogTimer(PROGDIALOG,100)
do
if FF_ShowDialog(PROGDIALOG)="TIMER" then
skaliere
exit do
end if
loop
call FF_CloseDialog(PROGDIALOG)
end sub

progress


Kopiert man die vorstehenden (kursiv dargestellten) Zeilen in den FFSkript-Editor von FF (unter "Extras"), braucht man lediglich nur noch "Ausführen" anzuklicken und man kann sich von der Funktion dieser Progress-Anzeige überzeugen.

Gruß
Heinrich
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.810
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#51
AW: Skripting - Grundlagen und Allgemeines

Hallo Heinrich,
eine interessante Lösung für eine Fortschrittsanzeige.
Ich verwende bereits seit einiger Zeit das Steuerelement Progress statt der Anzeige mittels FF_SetProgress bzw. FF_SetProgressText, aber immer nur mit Erhalt des Startdialogs. Deine Lösung erlaubt das Startfenster zu schließen und dann nur noch den Fortschritt anzuzeigen. Ich glaube das werde ich beim nächsten Skript übernehmen, mal sehen.
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.810
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#52
AW: Skripting - Grundlagen und Allgemeines

Hallo Heinrich,
mal was ganz anderes.
Im Namen Deiner Skripte ist die Versionsnummer enthalten, z.B. FracScal_V1.1. Das erschwert meiner Ansicht nach unnötig ein Update auf die nächste Version. Wenn der Name keine Versionsnummer enthält, kann man das alte Skript mit der neuen Version einfach überschreiben. Die Versionsnummer kann man im Skript selbst unterbringen, z.B. als Anzeige im Dialogfenster oder, wie ich es mache, in der immer mitgelieferten Kurzbeschreibung.

Das soll natürlich nur eine Anregung sein und ist kein Muss.
 

opi-hs

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

Hallo Harald,
Du hast schon Recht. Habe bisher das etwas umständlichere Updaten gednakenlos in Kauf genommen. Andererseits sieht man so beim Aufruf direkt, welche Version gestartet wird. Ok, werde aber sicher dennoch auf die von Dir angeregte Verfahrensweise übergehen.

Danke für den Hinweis.

Gruß
Heinrich
 
Oben