Anleitung für FixFotos Skript-Dialogeditor

Anleitung für FixFotos Skript-Dialogeditor 2016-03-05

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#1
Ich habe jetzt mal angefangen, eine Beschreibung des FF-Dialogeditors zu erstellen. Nach und nach werde ich sie hier veröffentlichen und hoffe auf Ergänzungs- und Verbesserungsvorschläge, Korrekturen und Kritiken.

FF-Dialogeditor
Skripte haben den Nachteil, dass für sie keine Bedienoberflächen programmiert werden können, wie man sie beispielsweise von Visual-Basic-Projekten her kennt. Man muss sich mit Eingabe- und Meldeboxen behelfen. Der FFSkript-Editor schließt dies Lücke, indem er mit dem Dialogeditor eine Möglichkeit anbietet, für den Anwender einfach benutzbare Oberflächen zu konstruieren bzw. zu programmieren.
In den folgenden Beispielen wird als Skriptsprache VisualBasicSkript verwendet. Sie sind aber sicher auch von den Freunden der JavaSkript-Sprache nach zu vollziehen.

Dialogfeld
Nachdem mit F11 der FFSkript-Editor gestartet wurde, öffnet man den Dialogeditor durch anklicken mit der linken Maustaste (rechts unten). Unter "Dialog / Neuer Dialog" gibt man einen Namen für den zu erstellenden Dialog ein, z.B. Dialogdemo. Nach Bestätigung mit OK wird das Dialogfeld mit dem vergebenen Namen und mit Breite und Höhe, hier 100, 80, angezeigt.

Durch Ziehen mit der Maus lässt sich die Größe des Feldes beliebig verändern.

Wenn man jetzt "Dialog / Speichern" anklickt, wird automatisch ein Code erzeugt, der eingeschlossen durch

'** Start Dialog Dialogdemo ** und
'** End Dialog Dialogdemo **​

das Dialogfeld beschreibt, in unserem Fall erst einmal nur FF_AddDialog "Dialogdemo",100,80, womit der Dialog "Dialogdemo" mit einer Breite von 100 und einer Höhe von 80 angelegt wird. Die Größe des Dialogfeldes kann statt im Dialogeditor auch durch direktes Editieren geändert werden.

Oberhalb dieses Codes gibt man nun erst einmal für das neue Skript einen Kategorienamen und den darin gewünschten Eintrag an, hier als Beispiel Demo und Dialog:

'FFSubmenu=Demo
'FFName=Dialog​

Und am Codeende ruft man mit FF_ShowDialog ("Dialogdemo") den Dialog auf.

Der komplette Code sieht jetzt wie folgt aus:

Code:
'FFSubmenu=Demo
'FFName=Dialog

'** Start Dialog Dialogdemo **
FF_AddDialog "Dialogdemo",100,80
'** End Dialog Dialogdemo **

FF_ShowDialog ("Dialogdemo")
Spätestens jetzt sollte das Skript abgespeichert werden. Dabei ist darauf zu achten, dass links unten die richtige Skriptart angekreuzt ist, in unserem Fall VBScript. Nach Betätigung von Speichern muss man unbedingt kontrollieren, ob der Skriptordner von FixFoto angewählt ist. In der Regel ist das der Ordner "C:\Programme\FixFoto\Params\Script". Nun gibt man einen sinnvollen Dateinamen, z.B. Dialogdemo ein und bestätigt mit OK, womit das Skript als Dialogdemo.vbs abgespeichert wird. Wenn man jetzt links "autom. Konfiguration" betätigt, wird im linken Fenster die Kategorie Demo erzeugt (wenn nicht schon vorhanden) und dort der Eintrag Dialog angezeigt. Zum Test kann man jetzt auf Ausführen klicken und es wird das nackte Dialogfeld Dialogdemo angezeigt. Der Ausführen-Button bleibt solange rot, bis das x im Dialog rechts oben betätigt wird. Damit kann man zwar noch nicht viel anfangen, aber wir haben jetzt ein Grundgerüst, auf dem aufgebaut werden kann.
Übrigens, nach Schließen des Editors, sucht man das Skript Dialog in FixFoto vergebens. Dazu bitte FixFoto beenden und neu starten, und siehe da – in der Kategorie Demo kann jetzt Dialog gestartet werden.

Wenn man das Dialogfeld weiter bearbeiten möchte, öffnet man das Skript im FFSkript-Editor wieder durch einen Doppelklick auf den Namen Dialog im linken Auswahlfenster. Wird jetzt der Dialogeditor aufgerufen, kann man das Dialogfeld beliebig verändern und ergänzen.
 
Zuletzt bearbeitet:

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#2
AW: Anleitung für Dialogerstellung

Steuerelemente
Im Dialogfeld können nun verschiedene Steuerelemente platziert werden. Um die prinzipielle Vorgehensweise zu zeigen, wird der oben erzeugte Dialog im folgenden ergänzt um die Befehlschaltfläche Ende. Im Dialogeditor klickt man über "Steuerelement / Neu" auf BUTTON und gibt ihm den Namen Ende. Nach OK wird er im Dialogfeld links oben platziert angezeigt und kann jetzt mit der Maus beliebig verschoben und auch in seiner Größe geändert werden. Dabei wird oben in einer Statuszeile "Ende:" angezeigt, gefolgt vom Abstand des Elements bis zum linken und oberen Rand und dann Breite x Höhe. Genau positionieren lässt sich das selektierte Element mit den Cursortasten.
Um sich eine Eindruck vom späteren Aussehen zu verschaffen, kann man "Dialog / Dialog testen" aufrufen oder einfach F5 drücken. Die Ansicht wird mit Anklicken von x rechts oben geschlossen. Den Dialogeditor beendet man, indem über "Dialog / Speichern" die Ergänzung gesichert wird. Der Skriptcode wird automatisch ergänzt um

FF_AddControl "Dialogdemo","Ende","BUTTON",54,60,33,11

Auch hier kann sowohl der Abstand nach links und nach oben, als auch Breite mal Höhe des Elements frei editiert werden.

Jetzt muss noch per Code die Betätigung des Buttons Ende abgefragt und damit der Dialog beendet werden. Die Info, ob eine Befehlstaste betätigt wurde, ist Bestandteil des Befehls
FF_ShowDialog ("Dialogdemo"). Dieser wird in einer Schleife auf die Variable Taste übertragen. Wenn diese den Inhalt Ende oder CANCEL (das ist der Befehl, der mit Betätigung von x rechts oben ausgelöst wird) hat, soll die Schleife verlassen und der Dialog geschlossen werden. Der Code, ergänzt um den Zusatz Option Explicit und der Variablendimensionierung (der sauberen Programmierung wegen), sieht dann wie folgt aus:

Code:
'FFSubmenu=Demo
'FFName=Dialog

Option Explicit
Dim Taste

'** Start Dialog Dialogdemo **
FF_AddDialog "Dialogdemo",100,80
FF_AddControl "Dialogdemo","Ende","BUTTON",54,60,33,11
'** End Dialog Dialogdemo **

do
	Taste = FF_ShowDialog("Dialogdemo")		'Befehle abfragen und Dialog öffnen
	if Taste = "Ende" or Taste = "CANCEL" then	'bei Ende oder Cancel Schleife verlassen
		exit do
	end if
loop

FF_CloseDialog("Dialogdemo")			'Dialog schließen
msgbox "Dialog wurde beendet"			'Meldung
Die Schleife ist notwendig, damit der Dialog bei Verwendung weiterer Befehlsschaltflächen geöffnet bleibt. Dies wird später deutlich.

Zur Konstruktion der Bedienoberfläche stehen folgende Steuerelemente zur Verfügung:

GROUP - optische Rahmen zur Zusammenfassung mehrer Elemente
BOOL - Kontrollkästchen zur Auswahl einer Funktion
STATIC - Bezeichnungsfeld, das nicht vom Benutzer geändert werden kann
BUTTON - Befehlsschaltfläche
EDIT - Textfeld mit Zeilenumbruch an der Feldgrenze
SLEDIT - Textfeld ohne Zeilenumbruch
LISTBOX - Auflistung von Elementen zur Auswahl
COMBO - Klappliste von Elementen zur Auswahl
COLOR - Farbauswahl
FONT - Schriftauswahl
IMAGE - Feld zur Anzeige eines Bildes
HSLIDER - horizontaler Schieber zur Zahlenvorgabe von 0 bis 255
VSPIN - vertikale Pfeile zur Zahlenvorgabe in 1er Schritten


Diese werden in den folgenden Kapiteln im einzelnen erläutert, allerdings nicht unbedingt in dieser Reihenfolge.

Und dann ist da noch die Sache mit den Stilen. Bei den meisten Steuerelementen lassen sich im Dialogeditor für das Element, das den Fokus hat, über "Steuerelement / Stile setzen" diverse Eigenschaften festlegen. Sollen dies direkt mehrere sein, muss bei der Auswahl mit der linken Maustaste die Strg-Taste festgehalten werden. Was die Eigenschaften bzw. Stile im einzelnen bedeuten, wird im Einzelfall bei den Erläuterungen der einzelnen Steuerelemente angegeben.
 
Zuletzt bearbeitet:

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#3
AW: Anleitung für Dialogerstellung

BOOL, STATIC und GROUP
Das Steuerelement BOOL stellt ein Kontrollkästchen dar. Wir öffnen den Dialogeditor und positionieren zwei dieser Elemente mit den Namen "Option1" und "Option2" in das Dialogfeld. Danach schließen wir den Editor wieder durch Speichern. Wird jetzt das Skript ausgeführt, sieht man die beiden Kontrollkästchen, die durch Anklicken beliebig ein- und ausgeschaltet werden können.
Gut wäre jetzt noch die jeweilige Benennung der Kontrollkästchen und eine optische Zusammenfassung. Die Benennung erfolgt mit zwei STATIC-Elementen, der wir die Namen "Option A" und "Option B" geben. Dann rahmen wir die BOOL- und STATIC-Elemente mit dem Element GROUP ein und geben diesem den Namen Optionen. Das sieht jetzt im Dialogeditor ungefähr so aus:


Wieder den Dialog speichern und nicht vergessen, auch immer wieder zwischendurch den Code speichern!

Natürlich muss auch die Aktivierung von Option A und B mal irgendwie ausgewertet werden. Das geschieht mit dem Befehl FF_GetControl (dialog, name). Der Rückgabewert von BOOL ist im aktivierten Zustand "1", im deaktivierten "0".
Im Beispiel soll nach Beendigung des Skript mit dem BUTTON Ende angezeigt werden, was angekreuzt wurde:

Code:
'FFSubmenu=Demo
'FFName=Dialog

Option Explicit
Dim Taste, msg

'** Start Dialog Dialogdemo **
FF_AddDialog "Dialogdemo",100,80
FF_AddControl "Dialogdemo","Optionen","GROUP",8,2,58,34
FF_AddControl "Dialogdemo","Ende","BUTTON",54,60,33,11
FF_AddControl "Dialogdemo","Option1","BOOL",12,14,8,8
FF_AddControl "Dialogdemo","Option2","BOOL",12,24,8,8
FF_AddControl "Dialogdemo","Option A","STATIC",24,13,33,11
FF_AddControl "Dialogdemo","Option B","STATIC",24,23,33,11
'** End Dialog Dialogdemo **

do
	Taste = FF_ShowDialog("Dialogdemo")		'Befehle abfragen und Dialog öffnen
	if Taste = "Ende" or Taste = "CANCEL" then	'bei Ende oder Cancel Schleife verlassen
		exit do
	end if
loop

if FF_GetControl ("Dialogdemo","Option1") = "1" then 	'BOOL Option1 abfragen
	msg = "Option A wurde aktiviert" & vbNewline
else
	msg = "Option A wurde deaktiviert" & vbNewline
end if

if FF_GetControl ("Dialogdemo","Option2") = "1" then	'BOOL Option2 abfragen
	msg = msg & "Option B wurde aktiviert" & vbNewline
else
	msg = msg & "Option B wurde deaktiviert" & vbNewline
end if

FF_CloseDialog("Dialogdemo")			'Dialog schließen
msgbox msg & vbNewline & "Dialog ist beendet"	'Ergebnis anzeigen
 
Zuletzt bearbeitet:

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#4
AW: Anleitung für FixFotos Skript-Dialogeditor

BUTTON
Wie das Element BUTTON eingesetzt wird, wurde oben im Kapitel Steuerelemente bereits gezeigt. Hier soll noch mal näher erläutert werden, warum es sinnvoll ist, die Abfrage von Befehlsschaltflächen in einer Schleife vorzunehmen.
Die Aufgabe soll sein, mit einem BUTTON Anzeige die Zustände der BOOL-Elemente aus dem Beispiel vorher anzuzeigen und dabei das Dialogfeld sichtbar zu lassen. Das Dialogfeld soll nur mit Ende bzw. CANCEL geschlossen und das Skript beendet werden. Dazu fügen wir über den Editor einen zusätzlichen BUTTON mit dem Namen Anzeigen hinzu. Nach dem Sichern ändern wir den Code wie folgt:

- Die Abfrage der BOOL-Elemente wird in eine SUB-Routine Auswertung überführt.
- In der Schleife wird bei Betätigung der Taste Anzeigen die Auswertung aufgerufen und diese angezeigt ohne die Schleife zu verlassen.
- Bei Betätigung von CANCEL wird das Skript vorzeitig beendet und bei Ende geht es raus aus der Schleife und das Dialogfeld wird geschlossen.
- Außerdem werden die "If Then"-Abfragen der Variablen Taste ersetzt durch "Select Case ", um den Code einfacher lesbar zu machen.

Code:
'FFSubmenu=Demo
'FFName=Dialog

Option Explicit
Dim Taste, msg

'** Start Dialog Dialogdemo **
FF_AddDialog "Dialogdemo",100,80
FF_AddControl "Dialogdemo","Optionen","GROUP",7,3,58,34
FF_AddControl "Dialogdemo","Ende","BUTTON",54,58,33,11
FF_AddControl "Dialogdemo","Option1","BOOL",12,14,8,8
FF_AddControl "Dialogdemo","Option2","BOOL",12,24,8,8
FF_AddControl "Dialogdemo","Option A","STATIC",24,13,33,11
FF_AddControl "Dialogdemo","Option B","STATIC",24,23,33,11
FF_AddControl "Dialogdemo","Anzeigen","BUTTON",7,58,33,11
'** End Dialog Dialogdemo **

do
	Taste = FF_ShowDialog ("Dialogdemo")	'Befehle abfragen und Dialog öffnen

	Select Case Taste
		Case "CANCEL"			'bei Cancel Abbruch des Skript
			FF_CloseDialog ("Dialogdemo")	
			FF_ErrorBreak "Abbruch"
		Case "Ende"			'bei Ende Schleife verlassen
			exit do
		Case "Anzeigen"
			call Auswertung
			msgbox msg		'Ergebnis anzeigen
	End Select
loop

FF_CloseDialog ("Dialogdemo")			'Dialog schließen
msgbox "Dialog ist beendet"			'Meldung

'--------------------------------------------------------------------------
Sub Auswertung
if FF_GetControl ("Dialogdemo","Option1") = "1" then 	'BOOL Option1 abfragen
	msg = "Option A ist aktiviert" & vbNewline
else
	msg = "Option A ist deaktiviert" & vbNewline
end if

if FF_GetControl ("Dialogdemo","Option2") = "1" then	'BOOL Option2 abfragen
	msg = msg & "Option B ist aktiviert"
else
	msg = msg & "Option B ist deaktiviert"
end if
End Sub
'--------------------------------------------------------------------------
Bei konkreten Skripten würde natürlich Ende umbenannt in beispielsweise Ausführen und damit das eigentliche Skript weiter ausgeführt. Dabei ist wichtig, dass im Skript Einstellungen des Benutzers im Dialogfeld erst in Variable abgespeichert werden, bevor das Dialogfeld geschlossen wird.
 
Zuletzt bearbeitet:

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#5
AW: Anleitung für FixFotos Skript-Dialogeditor

... und noch mal BOOL
Und jetzt werden noch mal BOOL-Elemente eingesetzt, aber diesmal mit Befehlseigenschaft.

Es besteht folgende Aufgabe:
Das folgende Skript soll erweitert werden um eine zweite Gruppe Auswahl mit zwei Kontrollkästchen Auswahl_ A und Auswahl_ B, die wieder mit Option A und Option B über STATIC-Elemente benannt werden. Es soll immer nur eins der beiden Elemente auswählbar sein. Bei Start des Skript soll Auswahl_A (bzw. Option A) bereits aktiviert sein.

Dazu wird erst einmal im Dialogeditor das Dialogfeld in der Höhe vergrößert auf beispielsweise 100 und die beiden Befehlsschaltflächen Anzeigen und Ende nach unten gerückt. Dann wird unterhalb der bestehenden Gruppe ein zweites GROUP-Element gleicher Größe mit dem Namen Auswahl aufgezogen.
In diesen Rahmen hinein wird ein BOOL-Element mit dem Namen Auswahl_A konstruiert. Damit bei diesem Element das Anklicken per Code erkannt werden kann, muss ihm der Stil BS_NOTIFY zugeordnet werden. Dies geschieht über "Steuerelement / Stil setzen" und anklicken von BS_NOTIFY,... solange das Element Auswahl_A den Fokus hat.
Jetzt soll das nächste Element Auswahl_B mit gleicher Eigenschaft erzeugt werden. Das kann auf dem gleichen Wege geschehen oder einfacher mit Klonen. Man gibt dem Element Auswahl_A den Fokus und klickt "Steuerelement / Klonen" an. Als Name wird Auswahl_B vergeben. Jetzt muss das Element nur noch positioniert werden.
Als nächstes sollen die Kontrollkästchen mit STATIC-Elementen mit Option A und Option B benannt werden. Bei dem Versuch das zu tun, erhält man die Meldung

"Dieser Name existiert bereits"

Das Problem kann gelöst werden, indem man an den Namen ein Pipe-Symbol "|" anhängt, denn es gilt die Regel:

Enthaltene Pipe-Zeichen '|' in den Namen von BUTTON und STATIC werden
bei der Anzeige unterdrückt. Dies ermöglicht die Verwendung identischer Beschriftungen.

Das tatsächlich nur Option A angezeigt wird, lässt sich mit der Vorschau über F5 leicht kontrollieren.
Die zweite Beschriftung Option B wird genauso erzeugt und man erhält folgendes Dialogfeld:



Wenn man den Dialog speichert, sieht man im Code, dass den neuen Kontrollkästchen mit dem Befehl FF_SetControlStyle jeweils eine codierte Eigenschaft zugeordnet wurde.
Damit die Übersicht nicht verloren geht, wird empfohlen (kein muss), die Dialogbefehle so umzusortieren, dass sie die Reihenfolge ihres Auftretens wiederspiegeln, beispielsweise so:

'** Start Dialog Dialogdemo **
FF_AddDialog "Dialogdemo",100,100
FF_AddControl "Dialogdemo","Optionen","GROUP",8,2,58,34
FF_AddControl "Dialogdemo","Option1","BOOL",12,14,8,8
FF_AddControl "Dialogdemo","Option A","STATIC",24,13,33,11
FF_AddControl "Dialogdemo","Option2","BOOL",12,24,8,8
FF_AddControl "Dialogdemo","Option B","STATIC",24,23,33,11
FF_AddControl "Dialogdemo","Auswahl","GROUP",8,38,58,34
FF_AddControl "Dialogdemo","Auswahl_A","BOOL",12,49,8,8
FF_SetControlStyle "Dialogdemo","Auswahl_A",16384
FF_AddControl "Dialogdemo","Option A|","STATIC",24,48,33,11
FF_AddControl "Dialogdemo","Auswahl_B","BOOL",12,60,8,8
FF_SetControlStyle "Dialogdemo","Auswahl_B",16384
FF_AddControl "Dialogdemo","Option B|","STATIC",24,58,33,11
FF_AddControl "Dialogdemo","Anzeigen","BUTTON",8,80,33,11
FF_AddControl "Dialogdemo","Ende","BUTTON",54,80,33,11
'** End Dialog Dialogdemo **

Um die Aufgabe zu erfüllen
- wird mit FF_SetControl "Dialogdemo","Auswahl_A","1" die Option A vorbesetzt
- in der Schleife wird Auswahl_A und Auswahl_B wie ein Befehl abgefragt und die BOOL-Elemente entsprechend gesetzt
- in der SUB Auswertung wird der Meldetext ergänzt

Der gesamte Code sieht jetzt wie folgt aus:

Code:
'FFSubmenu=Demo
'FFName=Dialog

Option Explicit
Dim Taste, msg

'** Start Dialog Dialogdemo **
FF_AddDialog "Dialogdemo",100,100
FF_AddControl "Dialogdemo","Optionen","GROUP",8,2,58,34
FF_AddControl "Dialogdemo","Option1","BOOL",12,14,8,8
FF_AddControl "Dialogdemo","Option A","STATIC",24,13,33,11
FF_AddControl "Dialogdemo","Option2","BOOL",12,24,8,8
FF_AddControl "Dialogdemo","Option B","STATIC",24,23,33,11
FF_AddControl "Dialogdemo","Auswahl","GROUP",8,38,58,34
FF_AddControl "Dialogdemo","Auswahl_A","BOOL",12,49,8,8
FF_SetControlStyle "Dialogdemo","Auswahl_A",16384
FF_AddControl "Dialogdemo","Option A|","STATIC",24,48,33,11
FF_AddControl "Dialogdemo","Auswahl_B","BOOL",12,60,8,8
FF_SetControlStyle "Dialogdemo","Auswahl_B",16384
FF_AddControl "Dialogdemo","Option B|","STATIC",24,58,33,11
FF_AddControl "Dialogdemo","Anzeigen","BUTTON",8,80,33,11
FF_AddControl "Dialogdemo","Ende","BUTTON",54,80,33,11
'** End Dialog Dialogdemo **

FF_SetControl "Dialogdemo","Auswahl_A","1"		'Auswahl_A mit 1 vorbesetzen

do
	Taste = FF_ShowDialog ("Dialogdemo")		'Befehle abfragen und Dialog öffnen
	
	Select Case Taste
	Case "Auswahl_A"
		FF_SetControl "Dialogdemo","Auswahl_A","1"
		FF_SetControl "Dialogdemo","Auswahl_B","0"		
	Case "Auswahl_B"
		FF_SetControl "Dialogdemo","Auswahl_A","0"
		FF_SetControl "Dialogdemo","Auswahl_B","1"
	Case "CANCEL"					'bei Cancel Abbruch des Skript
		FF_CloseDialog ("Dialogdemo")	
		FF_ErrorBreak "Abbruch"
	Case "Ende"					'bei Ende Schleife verlassen
		exit do
	Case "Anzeigen"
		call Auswertung
		msgbox msg				'Ergebnis anzeigen
	Case Else
	End Select
loop

FF_CloseDialog ("Dialogdemo")				'Dialog schließen
msgbox "Dialog ist beendet"				'Meldung

'----------------------------------------------------------------
Sub Auswertung

	msg = "Optionen" & ":" & vbNewLine

	if FF_GetControl ("Dialogdemo","Option1") = "1" then 
		msg = msg & "Option A ist aktiviert" & vbNewline
	else
		msg = msg & "Option A ist deaktiviert" & vbNewline
	end if

	if FF_GetControl ("Dialogdemo","Option2") = "1" then
		msg = msg & "Option B ist aktiviert"
	else
		msg = msg & "Option B ist deaktiviert"
	end if
	
	msg = msg & vbNewLine & vbNewLine & "Auswahl" & ":" & vbNewLine
	
	if FF_GetControl ("Dialogdemo","Auswahl_A") = "1" then
		msg = msg & "Option A wurde ausgewählt"
	else
		msg = msg & "Option B wurde ausgewählt"
	end if
	
End Sub
'----------------------------------------------------------------
 
Zuletzt bearbeitet:
Dabei seit
02.12.02
Beiträge
1.546
Standort
Lübeck
#6
AW: Anleitung für FixFotos Skript-Dialogeditor

Deine Anleitung ist nützlich und sollte nicht nur hier im Thread, sondern in geeigneter Form archiviert zum Nachlesen zur Verfügung stehen.

Bis hierher ist die Sache brauchbar, aber das hier geht nicht für eine qualifizierte Anleitung:

Code:
do
	Taste = FF_ShowDialog ("Dialogdemo")
	if Taste = "Auswahl_A" then
		FF_SetControl "Dialogdemo","Auswahl_A","1"
		FF_SetControl "Dialogdemo","Auswahl_B","0"		
	elseif Taste = "Auswahl_B" then
		FF_SetControl "Dialogdemo","Auswahl_A","0"
		FF_SetControl "Dialogdemo","Auswahl_B","1"
	end if
	
	if Taste = "CANCEL" then
		FF_CloseDialog ("Dialogdemo")	
		FF_ErrorBreak "Abbruch"
	elseif Taste = "Ende" then
		exit do
	elseif Taste = "Anzeigen" then
		call Auswertung
		msgbox msg	
	end if
loop
Die Minimalkorrektur sieht so aus:

Code:
do
	Taste = FF_ShowDialog ("Dialogdemo")
	if Taste = "Auswahl_A" then
		FF_SetControl "Dialogdemo","Auswahl_A","1"
		FF_SetControl "Dialogdemo","Auswahl_B","0"
            end if		
            if Taste = "Auswahl_B" then
		FF_SetControl "Dialogdemo","Auswahl_A","0"
		FF_SetControl "Dialogdemo","Auswahl_B","1"
	end if
	
	if Taste = "CANCEL" then
		FF_CloseDialog ("Dialogdemo")	
		FF_ErrorBreak "Abbruch"
            end if
            if Taste = "Ende" then
		exit do
           end if
           if Taste = "Anzeigen" then
		call Auswertung
		msgbox msg	
           end if
loop
Das schreibt man aber auch so nicht. Wegen hässlich.

So ist es ein schönes Beispiel für eine Dialogabhandlung:
Code:
Do
    Select Case FF_ShowDialog ("Dialogdemo")
	 Case "Auswahl_A"
	         FF_SetControl "Dialogdemo","Auswahl_A","1"
	         FF_SetControl "Dialogdemo","Auswahl_B","0"
              Case "Auswahl_B"
	         FF_SetControl "Dialogdemo","Auswahl_A","0"
	         FF_SetControl "Dialogdemo","Auswahl_B","1"
              Case "Anzeigen"
	         Auswertung
	         msgbox msg	
              Case  "CANCEL"
	         FF_CloseDialog ("Dialogdemo")	
	         FF_ErrorBreak "Abbruch"
              Case "Ende"
	         Exit Do
              Case Else
   End Select
Loop
Merke:

Niemals, und das heisst: nicht ums Verröcheln - sollte man ElseIf verwenden. Wer ElseIf braucht, hat einen klaren Designfehler. ElseIfs sind der erste Schritt zum Spaghetti-Code, lassen sich immer ersetzen und hätten zusammen mit den Goto's entsorgt werden müssen.

Ein immer brauchbares Konstrukt ist Case, wenn man nicht reine If-Ketten verwenden will. Der Vorteil liegt darin, dass innerhalb der abgeschlossenen Case-Zweige ungehindert unabhängiger Code aufgebaut werden kann, ohne dass ein Else-Schwanz an der Programmlogik zieht.

Case Else braucht man nicht in jedem Fall, kann aber als Leerstatement aufgeführt werden. Meist landet im Zuge der Programmentwicklung doch etwas im Alternativzweig. Dort könnte zum Beispiel Beep(500) als 500-ms-Aufruf der Routine Beep bei falschem Tastendruck stehen, wenn man das möchte.

Call ist obsolet und wird für Prozeduraufrufe nicht benötigt. Ohne sind die Programme besser lesbar.
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#7
AW: Anleitung für FixFotos Skript-Dialogeditor

Hallo Jochen,
vielen Dank für Deine positive Reaktion. Hier meine Meinung zu den einzelnen Punkten:

Deine Anleitung ist nützlich und sollte nicht nur hier im Thread, sondern in geeigneter Form archiviert zum Nachlesen zur Verfügung stehen.
Erst muss ich mal die Anleitung fertig stellen. Dann mal weitersehen.

Niemals, und das heißt: nicht ums Verröcheln - sollte man ElseIf verwenden. Wer ElseIf braucht, hat einen klaren Designfehler. ElseIfs sind der erste Schritt zum Spaghetti-Code, lassen sich immer ersetzen und hätten zusammen mit den Goto's entsorgt werden müssen.
Das ist sicher Ansichtssache, aber ich gebe zu, dass "select case" übersichtlicher ist. Ich werde demnächst die Anleitung entsprechend umstellen.
- schon geschehen -

Call ist obsolet und wird für Prozeduraufrufe nicht benötigt. Ohne sind die Programme besser lesbar.
Call ist zwar überflüssig, aber ich bin der Meinung, dass Call die Programme besser lesbar macht. Man kann leichter erkennen, wo ein Unterprogrammaufruf erfolgt.
 
Zuletzt bearbeitet:
Dabei seit
10.07.02
Beiträge
11.287
Trophäen
10*15!4{*}1{!}
#8
AW: Anleitung für FixFotos Skript-Dialogeditor

Hallo!

Ich bin auch für CALLs, das erlaubt fremde Skripte schneller zu verstehen. Bei Basic-ähnlichen Sprachen gehört das für mich zum guten Stil, in anderen Sprachen allerdings nicht so sehr. Ohne CALLs ist es besser, längere sprechende Namen für Subroutinen zu vergeben - und längere 'Wörter' lesen sich einfach schlechter, vor allem wenn man den Programmcode nur überfliegt, weil man was sucht.

Gruß,

Ralf
 
Dabei seit
02.12.02
Beiträge
1.546
Standort
Lübeck
#9
AW: Anleitung für FixFotos Skript-Dialogeditor

Hallo!

Ich bin auch für CALLs, das erlaubt fremde Skripte schneller zu verstehen. Bei Basic-ähnlichen Sprachen gehört das für mich zum guten Stil, in anderen Sprachen allerdings nicht so sehr. Ohne CALLs ist es besser, längere sprechende Namen für Subroutinen zu vergeben - und längere 'Wörter' lesen sich einfach schlechter, vor allem wenn man den Programmcode nur überfliegt, weil man was sucht.

Gruß,

Ralf
Call Initialisieren
Call Eingabe(A)
Call Eingabe(B)
Call Umrechnen(A,B,C)
Call Ausgabe(C)
Call Aufraeumen
Call Ende

oder

Initialisieren
Eingabe A
Eingabe B
Umrechnen A,B,C
Ausgabe C
Aufraeumen
Ende

Das ist besser lesbar, oder?
Was gewinnt man durch Call's? Nix. Sub/Func-Namen stehen an Anweisungsstelle - da gibt es überhaupt keinen Zweifel, dass es sich um Routinenaufrufe handelt. Letztlich kann das jeder machen, wie er will. Aber die überflüssigen Calls als Lesekrücken machen ein Programm keinen Deut professioneller, es macht nur einen unbeholfenen Eindruck.
 
Dabei seit
10.07.02
Beiträge
11.287
Trophäen
10*15!4{*}1{!}
#10
AW: Anleitung für FixFotos Skript-Dialogeditor

Hallo Jochen!

Da kommen wir nicht zusammen. Für mich muß ein Programm aus Programmbefehlen bestehen und nicht wie ein Roman zu lesen sein, da finde ich mich viel schwerer zurecht. Es ist nun mal so, daß der Mensch beim Überfliegen von Programmen ein Suchraster einschaltet. Wenn alle Subroutinen-Aufrufe mit CALL anfangen, erkennt man das schneller.

Der Blick kann von CALL zu CALL hüpfen. Ohne CALLs ist man gezwungen, semantisch im Gehirn zu dekodieren, ob nun ein Programmbefehl oder ein Subroutinenaufruf vorliegt. Anders ausgedrückt, das was man an Subroutinenaufrufen als Klartext liest, muß mehr Verarbeitungsschichten durchlaufen als ein CALL, das man nicht liest, sondern bereits an seiner Form erkennt - wie ein Bild.

Ich erinnere mich mit Grauen an Programmiersprachen, in denen alles klein geschrieben wurde. Dort war ein rasches Unterscheiden zwischen Befehl, Variablen und Subroutinen nicht mehr möglich. Das mag durch moderne Editoren, die automatisch farblich unterscheiden heute anders sein - und auch das CALL-Argument entkräften. Doch erst mal so einen Editor haben.

Gruß,

Ralf
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#11
AW: Anleitung für FixFotos Skript-Dialogeditor

.. und hier geht's nach allgemeinem Meinungsaustausch weiter mit der Beschreibung.

Zwischenbilanz
Mit dem bisher Gelerntem lässt sich bereits eine einfache Bedienoberfläche zur Voreinstellung eines Skripts ansprechend gestalten. Hier werden noch mal einige wichtige Punkte aufgelistet:

  • Unbedingt immer beim Verlassen des Dialogeditors speichern und auch im FFSkript-Editor immer wieder mal zwischenspeichern.
  • Im Dialogeditor immer die Position und Größe des Steuerelements in der Statuszeile oben im Auge behalten. Ein Steuerelement, das den Fokus hat, kann genau mit den Cursortasten positioniert werden.
  • Bei der grafischen Konstruktion eines Dialogfeldes kann mit F5 eine Vorschau aufgerufen werden. Ausgeschaltet wird über das x oben rechts.
  • Befehle im Code sollten innerhalb einer Schleife (do-loop) abgefragt werden um die Anzeige des Dialogfeldes erhalten zu können.
  • Ein Dialogfeld beinhaltet immer den Befehl CANCEL. Er wird ausgelöst durch Anklicken des x oben rechts und sollte immer für den vorzeitigen Abbruch eines Skripts ausgewertet werden.
  • Eigenschaften von Steuerelementen werden über "Stile setzen" festgelegt. Dabei muss das Element den Fokus haben. Die Zuordnung mehrerer Stile zu einem Element ist durch Festhalten der Strg-Taste während des Setzens möglich.
  • Mehrere Steuerelemente gleicher Art, gleicher Größe und mit gleichen Eigenschaften (Stilen) können durch Klonen erzeugt werden.
  • Um BOOL-Elemente wie Befehlsschaltflächen behandeln zu können, muss der Stil BS_NOTIFY bei diesem Element gesetzt sein.
  • Zur Verwendung gleicher Beschriftungen bei BUTTON- und STATIC-Elementen können in den Namen Pipe-Symbole "|" eingesetzt werden. Bei der Anzeige werden diese unterdrückt.
  • Vor Schließen des Dialogfeldes mit FF_CloseDialog die vorgenommenen Einstellungen in Variablen sichern. Nach Beenden des Dialogs stehen diese nicht mehr zur Verfügung.
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#12
AW: Anleitung für FixFotos Skript-Dialogeditor

EDIT und SLEDIT
Beide Steuerelemente dienen zur Eingabe und Anzeige von Text. Um den Unterschied zu verdeutlichen, legen wir ein neues Dialogfeld Dialog_T von der Größe 85 x 100 an und konstruieren dort hinein
  • ein Steuerelement EDIT mit dem Namen TxtEdit und bezeichnen es über ein STATIC-Element mit "EDIT-Element"
  • ein Steuerelement SLEDIT mit dem Namen TxtSlEdit und bezeichnen es über ein STATIC-Element mit "SLEDIT-Element"
  • Beide Elemente sollten mindestens eine Höhe von 30 haben, damit die unterschiedlichen Eigenschaften demonstriert werden können
  • Darunter wird noch ein BUTTON Ende angelegt.

Die Vorschau sollte jetzt ungefähr so aussehen:


Der Code dazu lautet:

Code:
'FFSubmenu=Demo
'FFName=Dialog_T

'** Start Dialog Dialog_T **
FF_AddDialog "Dialog_T",85,100
FF_AddControl "Dialog_T","EDIT-Element","STATIC",4,8,33,11
FF_AddControl "Dialog_T","TxtEdit","EDIT",45,8,35,30
FF_AddControl "Dialog_T","SLEDIT-Element","STATIC",4,48,37,11
FF_AddControl "Dialog_T","TxtSlEdit","SLEDIT",45,47,35,30
FF_AddControl "Dialog_T","Ende","BUTTON",45,84,34,11
'** End Dialog Dialog_T **


do
	Select Case FF_ShowDialog ("Dialog_T")	'Befehle abfragen und Dialog öffnen
	Case "CANCEL"				'bei Cancel Abbruch des Skript
		FF_CloseDialog ("Dialog_T")	
		FF_ErrorBreak "Abbruch"
	Case "Ende"				'bei Ende Schleife verlassen
		exit do
	Case Else
	End Select
loop

FF_CloseDialog ("Dialog_T")				'Dialog schließen
msgbox "Dialog ist beendet"				'Meldung
Wenn man das Skript ausführt und gibt wahllos Text in die beiden Elemente EDIT und SLEDIT ein, sieht man, dass bei EDIT der Text an der Elementengrenze automatisch umgebrochen und bei SLEDIT der Text einfach fortgeführt wird, auch in den nicht sichtbaren Bereich hinein. Das kann man sich gut merken, wenn man weiß, dass SLEDIT Single-Line-Edit heißt.


Bei den Textfeldern steht dem Benutzer übrigens das bekannte Kontextmenü zum Kopieren, Einfügen ect. zur Verfügung.

Rückgängig
--------------
Ausschneiden
Kopieren
Einfügen
Löschen
--------------
Alles markieren​
Interessant sind die Stile, die bei beiden Textelementen gleich sind.

Die Textausrichtung wird vorgegeben mit
  • ES_LEFT - Textausrichtung links
  • ES_RIGHT - Textausrichtung rechts
  • ES_CENTER - Textausrichtung Mitte

Beschränkung auf Groß- und Kleinbuchstaben wird festgelegt mit
  • ES_LOWER - nur Kleinbuchstaben
  • ES_UPPER - nur Großbuchstaben

Weitere zugelassene Stile sind
  • ES_NOHIDESEL - bedeutet, dass die Hervorhebung der Selektion nicht weggenommen wird, wenn das Steuerelement den Fokus verliert.
  • ES_NUMBER - erlaubt nur die Eingabe von Zahlen
    Bei Eingabe anderer Zeichen wird darauf hingewiesen (siehe Screenshot oberes Feld)
  • ES_PASSWORD - eingegebene Zeichen werden als Punkte dargestellt
    (siehe Screenshot unteres Feld)
    Natürlich kann per Code mit FF_GetControl die Originaleingabe ermittelt werden.


  • ES_READONLY - Text per Code zur Anzeige vorzugeben ist mit FF_SetControl möglich.
    Eingaben durch den Benutzer sind gesperrt.

------------------------------------------------------------------------------------------

Wer kann bezüglich ES_NOHIDESEL helfen?
Oben Dank Hilfe von hhoefling und diverser PNs inzwischen ergänzt mit einigen zusätzlichen Anmerkungen.
 
Zuletzt bearbeitet:

hhoefling

Mitglied
Dabei seit
02.01.04
Beiträge
3.984
Standort
NRW/Ruhrgebiet
Trophäen
4! 2*
#13
AW: Anleitung für FixFotos Skript-Dialogeditor

Das bedeutet das die Hervorhebung der Selektion nicht weggenommen wird (hide),
wenn das Control den Fokus verliert.

Und...
SLEDIT heist deshalb ja auch Single-Line-Edit
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#14
AW: Anleitung für FixFotos Skript-Dialogeditor

Das bedeutet das die Hervorhebung der Selektion nicht weggenommen wird (hide),
wenn das Control den Fokus verliert.

Und...
SLEDIT heist deshalb ja auch Single-Line-Edit
Hallo Heinz,
vielen Dank für die Unterstützung von Dir und auch den Schreibern der PNs zu diesem Thema. Vollkommen neu war mir die Erläuterung von SLEDIT, die das Merken der Single-Line-Eigenschaft ja erheblich vereinfacht.
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#15
AW: Anleitung für FixFotos Skript-Dialogeditor

LISTBOX und COMBO
Beide dienen der Auswahl eines Elementes aus einer vorgegebenen Auflistung. Um dies zu demonstrieren legen wir ein Feld Dialog_LC mit folgendem Inhalt an:


  • Oben rechts eine LISTBOX mit dem Namen Liste_L, benannt mit Auflistung per STATIC-Element
  • Darunter ein COMBO-Element mit dem Namen Liste_C, benannt mit Klappliste per STATIC-Element
  • Darunter einen BUTTON Ende


Im dazugehörigen Code müssen die beiden Listen mit den auszuwählenden Begriffen gefüllt werden. Dies geschieht mit dem Befehl FF_SetControl.
Hier wurden für die LISTBOX als Beispiel die Begriffe Adam, Eva, Kain, Abel und für das COMBO-Element die Zahlen 256, 512, 1024, 2048 und 4096 vorgegeben.
Bei beiden Elementen kann ein Begriff favorisiert werden, indem man ihn mit FF_SetControl ein zweites Mal vorgibt. Dies soll hier bei der LISTBOX mit Kain und beim COMBO-Element mit 1024 gemacht werden.
Mit Ende werden die vom Benutzer gewählten Begriffe angezeigt.

Der Code sieht wie folgt aus:

Code:
'FFSubmenu=Demo
'FFName=Dialog_LC

Option Explicit
Dim Listenauswahl, Klapplistenwahl

'** Start Dialog Dialog_LC **
FF_AddDialog "Dialog_LC",110,100
FF_AddControl "Dialog_LC","Auflistung","STATIC",10,8,33,11
FF_AddControl "Dialog_LC","Liste_L","LISTBOX",60,8,33,44
FF_AddControl "Dialog_LC","Klappliste","STATIC",10,56,33,11
FF_AddControl "Dialog_LC","Liste_C","COMBO",60,56,33,10
FF_AddControl "Dialog_LC","Ende","BUTTON",39,78,33,11
'** End Dialog Dialog_LC **

'Auflistung füllen
FF_SetControl "Dialog_LC","Liste_L","Adam"
FF_SetControl "Dialog_LC","Liste_L","Eva"
FF_SetControl "Dialog_LC","Liste_L","Kain"
FF_SetControl "Dialog_LC","Liste_L","Abel"
FF_SetControl "Dialog_LC","Liste_L","Kain"	'Vorgabe machen

'Klappliste füllen
FF_SetControl "Dialog_LC","Liste_C","256"
FF_SetControl "Dialog_LC","Liste_C","512"
FF_SetControl "Dialog_LC","Liste_C","1024"
FF_SetControl "Dialog_LC","Liste_C","2048"
FF_SetControl "Dialog_LC","Liste_C","4096"
FF_SetControl "Dialog_LC","Liste_C","1024"	'Vorgabe machen


do
	Select Case FF_ShowDialog ("Dialog_LC")	'Befehle abfragen und Dialog öffnen
	Case "CANCEL"				'bei Cancel Abbruch des Skript
		FF_CloseDialog ("Dialog_LC")	
		FF_ErrorBreak "Abbruch"
		exit do
	Case "Ende"				'bei Ende Schleife verlassen
		exit do
	Case Else
	End Select
loop

'Auswahlwerte sichern
Listenauswahl = FF_GetControl ("Dialog_LC","Liste_L")
Klapplistenwahl = FF_GetControl ("Dialog_LC","Liste_C")

FF_CloseDialog ("Dialog_LC")			'Dialog schließen

msgbox "Gewählt wurde" & vbNewLine & _
	   "aus der Auflistung - " & Listenauswahl & vbNewLine & _
	   "aus der Klappliste  - " & Klapplistenwahl & vbNewLine & vbNewLine & _
	   "Dialog ist beendet", vbOk, "Meldung"
Der Inhalt der LISTBOX und des COMBO-Elements kann jeweils mit einem Nullstring ("") als Wert im Befehl FF_SetControl (dialog, name, wert) gelöscht werden:

FF_SetControl "Dialog_LC","Liste_L","" 'Löschen der Auflistung
FF_SetControl "Dialog_LC","Liste_C","" 'Löschen der Klappliste
 
Zuletzt bearbeitet:

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#16
AW: Anleitung für FixFotos Skript-Dialogeditor

FONT und COLOR
Mit FONT kann eine Schrift, mit COLOR eine Farbe ausgewählt werden.

Im neuen Dialog_FC legt man ein FONT- und ein COLOR-Steuerelement an, benannt mit Schriftwahl und Farbwahl. Mit STATIC-Elementen bezeichnet man sie entsprechend mit "Schriften:" und "Farben:".
Der Code dazu lautet:

Code:
'FFSubmenu=Demo
'FFName=Dialog_FC

Option Explicit
Dim Schrift, Farbe

'** Start Dialog Dialog_FC **
FF_AddDialog "Dialog_FC",120,100
FF_AddControl "Dialog_FC","Schriften:","STATIC",10,8,33,11
FF_AddControl "Dialog_FC","Schriftwahl","FONT",10,20,100,10
FF_AddControl "Dialog_FC","Farben:","STATIC",10,38,33,11
FF_AddControl "Dialog_FC","Farbwahl","COLOR",10,50,100,10
FF_AddControl "Dialog_FC","Ende","BUTTON",43,84,34,11
'** End Dialog Dialog_FC **

do
	Select Case FF_ShowDialog ("Dialog_FC")	'Befehle abfragen und Dialog öffnen
	Case "CANCEL"				'bei Cancel Abbruch des Skript
		FF_CloseDialog ("Dialog_FC")	
		FF_ErrorBreak "Abbruch"
		exit do
	Case "Ende"				'bei Ende Schleife verlassen
		exit do
	Case Else
	End Select
loop

'Schrift- und Farbwert sichern
Schrift = FF_GetControl ("Dialog_FC","Schriftwahl")
Farbe = FF_GetControl ("Dialog_FC","Farbwahl")

FF_CloseDialog ("Dialog_FC")			'Dialog schließen

msgbox "Gewählt wurde" & vbNewLine & _
	   "Schrift = " & Schrift & vbNewLine & _
	   "Farbe = " & Farbe & vbNewLine & vbNewLine & _
	   "Dialog ist beendet", vbOk, "Meldung"
Das Ergebnis sieht so aus:


Bei Ausführen des Skript werden in der Schriftenauswahl alle auf dem jeweiligen Rechner installierten Fonts angezeigt. Der Name der angeklickten Schrift wird bei FF_GetControl im Klartext zurück gegeben.
Bei den Farben ist eine sehr differenzierte Auswahl bis zur Ermittlung einer bestehenden Farbe mit der Pipette möglich. Die Farbe wird als RGB-Wert ausgegeben.
 
Zuletzt bearbeitet:

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#17
AW: Anleitung für FixFotos Skript-Dialogeditor

IMAGE
Mit IMAGE können Bilder angezeigt werden.

Im neuen Dialog_I1 erstellt man ein Steuerelement IMAGE von der Größe 150 x 150 mit Namen Bild. Es ist quadratisch, um hoch- und querformatige Bilder gleich gut anzeigen zu können. Darunter wird noch ein BUTTON Ende gesetzt.


Mit FF_SetControl "Dialog_I1","Bild",wert kann jetzt ein Bild in das Steuerelement IMAGE übertragen werden, wobei wert ein Pfad auf ein Bild oder der Index des Stacks sein kann. Dabei entspricht 0 dem aktuellen Bild, was im folgenden Programmcode genutzt wird.

Code:
'FFSubmenu=Demo
'FFName=Dialog_I1

'** Start Dialog Dialog_I1 **
FF_AddDialog "Dialog_I1",170,190
FF_AddControl "Dialog_I1","Bild","IMAGE",10,10,150,150
FF_AddControl "Dialog_I1","Ende","BUTTON",70,170,30,10
'** End Dialog Dialog_I1 **

if FF_GetImageWidth() = 0 then 
	msgbox "Es wurde kein Bild geladen"
	FF_ErrorBreak "Abbruch"
end if

FF_SetControl "Dialog_I1","Bild",0			'mit Wert 0 wird aktuelles Bild geladen

do
	Select Case FF_ShowDialog ("Dialog_I1")	'Befehle abfragen und Dialog öffnen
	Case "CANCEL"				'bei Cancel Abbruch des Skript
		FF_CloseDialog ("Dialog_I1")	
		FF_ErrorBreak "Abbruch"
		exit do
	Case "Ende"				'bei Ende Schleife verlassen
		exit do
	Case Else
	End Select
loop

FF_CloseDialog ("Dialog_I1")				'Dialog schließen
msgbox "Dialog ist beendet"				'Meldung
Vor der Übertragung wird geprüft, ob überhaupt ein Bild geladen ist. Dies geschieht durch Abfrage der Bildbreite (alternativ der Bildhöhe). Ist diese 0 steht logischerweise kein aktuelles Bild zur Verfügung.

Oft will man mehrere Bilder in der Computeransicht markieren und diese sich mit einer Blätterfunktion nacheinander ansehen. Dazu wird ein Dialog_I2 wie der obige Dialog_1 angelegt, nur unten ergänzt um die zwei BUTTON <<< und >>> zum Rückwärts- und Vorwärtsblättern.

Code:
'FFSubmenu=Demo
'FFName=Dialog_I2

Option Explicit
Dim BldAnzahl, BldNummer			'Bildanzahl und -nummer

'** Start Dialog Dialog_I2 **
FF_AddDialog "Dialog_I2",170,190
FF_AddControl "Dialog_I2","Bild","IMAGE",10,10,150,150
FF_AddControl "Dialog_I2","Ende","BUTTON",130,170,30,10
FF_AddControl "Dialog_I2","<<<","BUTTON",25,170,30,10
FF_AddControl "Dialog_I2",">>>","BUTTON",65,170,30,10
'** End Dialog Dialog_I2 **

BldAnzahl = FF_GetImageCount

if BldAnzahl = 0 then 
	msgbox "Es wurde kein Bild in der Computeransicht selektiert"
	FF_ErrorBreak "Abbruch"
end if

'erstes (0) selektiertes Bild laden
BldNummer = 0
FF_LoadImage FF_GetImageName(BldNummer)
FF_SetControl "Dialog_I2","Bild",0

'Freigaben bzw. Sperren der Tasten <<< und >>>
FF_EnableControl "Dialog_I2","<<<",false
if BldAnzahl = 1 then FF_EnableControl "Dialog_I2",">>>",false

'Befehlskontrolle
do
	Select Case FF_ShowDialog ("Dialog_I2")			'Befehle abfragen und Dialog öffnen
	Case ">>>"
		BldNummer = BldNummer+1
		FF_LoadImage FF_GetImageName(BldNummer)		'Bild laden
		FF_SetControl "Dialog_I2","Bild",0
		'Freigaben bzw. Sperren der Tasten <<< und >>>
		FF_EnableControl "Dialog_I2","<<<",true
		if BldNummer = BldAnzahl-1 then FF_EnableControl "Dialog_I2",">>>",false
	Case "<<<"
		BldNummer = BldNummer-1
		FF_LoadImage FF_GetImageName(BldNummer)		'Bild laden
		FF_SetControl "Dialog_I2","Bild",0
		'Freigaben bzw. Sperren der Tasten <<< und >>>
		FF_EnableControl "Dialog_I2",">>>",true
		if BldNummer = 0 then FF_EnableControl "Dialog_I2","<<<",false		
	Case "CANCEL"						'bei Cancel Abbruch des Skript
		FF_CloseDialog ("Dialog_I2")	
		FF_ErrorBreak "Abbruch"
		exit do
	Case "Ende"						'bei Ende Schleife verlassen
		exit do
	Case Else
	End Select
loop

FF_CloseDialog ("Dialog_I2")				'Dialog schließen
msgbox "Dialog ist beendet"				'Meldung
Hier wird erst einmal mit FF_GetImageCount geprüft, ob in der Computeransicht mindestens ein Bild markiert ist. Dann wird das erste Bild mit der Nummer 0 geladen und zum Steuerelement IMAGE übertragen.

Um zu verhindern, dass mit den Tasten <<< und >>> unzulässige Werte erreicht werden können, werden diese mit FF_EnableControl frei gegeben oder gesperrt. Für den Benutzer sind diese Zustände sichtbar und machen damit deutlich, ob das Vor- bzw. Zurückblättern sinnvoll ist.

 
Zuletzt bearbeitet:

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#18
AW: Anleitung für FixFotos Skript-Dialogeditor

HSLIDER und VSPIN
Die beiden Elemente dienen der Zahlenvorgabe durch den Benutzer. HSLIDER ist ein Schieberegler mit dem man Zahlen zwischen 0 und 255 einstellen kann und VSPIN besteht aus zwei Pfeilen; mit dem oberen kann eine Zahl schrittweise erhöht und mit dem unteren schrittweise verringert werden.
Beide Elemente machen nur Sinn, wenn ihm jeweils ein Textelement zugeordnet wird, am besten SLEDIT mit den gesetzten Stilen ES_RIGHT und ES_READONLY. Dies wird im folgenden Beispiel deutlich:

In ein neues Dialogfeld Dialog_HV werden gesetzt:
- ein GROUP-Element Spider
- darin ein SLEDIT-Element AnzeigeH mit oben aufgeführten Eigenschaften und
- ein HSLIDER, bezeichnet mit Horizontal
- ein GROUP-Element Spin
- darin ein SLEDIT-Element AnzeigeV mit oben aufgeführten Eigenschaften und
- ein HSLIDER, bezeichnet mit Vertikal
- ein BUTTON-Element Ende

Im Dialogeditor sieht das wie folgt aus:


Im Programmcode muss für beide Elemente erst ein Bezug zu den zugehörigen Textelementen hergestellt und mit FF_SetControl eine Voreinstellung vorgenommen werden.

Beim Element HSLIDER
die Voreinstellung: FF_SetControl "Dialog_HV","Horizontal",40 '40 als Beispiel
die Zuordnung: FF_SetControlBuddy "Dialog_HV","Horizontal","AnzeigeH"

Beim Element VSPIN:
die Voreinstellung: WertV = 2 'über eine Variable 2 als Beipiel
FF_SetControl "Dialog_HV","AnzeigeV",WertV
die Zuordnung in der Befehlsschleife:
Mit Anklicken eines der Pfeile wird ein Tastenbefehl ausgelöst, der bei Abfrage mit FF_GetControl einen Stringwert zurückgibt und zwar beim oberen Pfeil "1" und beim unteren Pfeil "-1". Dieser String gewandelt in eine Zahl, wird in der Variablen WertV aufaddiert. Der WertV wird dann mit FF_SetControl auf das Textelement AnzeigeV übertragen.

Code:
'FFSubmenu=Demo
'FFName=Dialog_HV

Option Explicit
Dim WertV, SliderWert, SpinWert

'** Start Dialog Dialog_HV **
FF_AddDialog "Dialog_HV",120,100
FF_AddControl "Dialog_HV","Slider","GROUP",7,3,106,42
FF_AddControl "Dialog_HV","AnzeigeH","SLEDIT",55,11,30,10
FF_SetControlStyle "Dialog_HV","AnzeigeH",2050
FF_AddControl "Dialog_HV","Horizontal","HSLIDER",12,22,96,17
FF_AddControl "Dialog_HV","Spin","GROUP",7,48,106,30
FF_AddControl "Dialog_HV","Vertikal","VSPIN",34,55,17,18
FF_AddControl "Dialog_HV","AnzeigeV","SLEDIT",55,59,30,10
FF_SetControlStyle "Dialog_HV","AnzeigeV",2050
FF_AddControl "Dialog_HV","Ende","BUTTON",45,85,30,10
'** End Dialog Dialog_HV **

FF_SetControl "Dialog_HV","Horizontal",40		'Vorbelegung des HSLIDER Horizontal
FF_SetControlBuddy "Dialog_HV","Horizontal","AnzeigeH"	'Zuordnung des HSLIDER zu SLEDIT Anzeige H

WertV = 2					'Vorbelegung des WertV
FF_SetControl "Dialog_HV","AnzeigeV",WertV		'Anzeige des WertV

do
	Select Case FF_ShowDialog ("Dialog_HV")	'Befehle abfragen und Dialog öffnen
	Case "Vertikal"
		WertV = WertV + CInt(FF_GetControl ("Dialog_HV","Vertikal"))
		FF_SetControl "Dialog_HV","AnzeigeV",WertV
	Case "CANCEL"				'bei Cancel Abbruch des Skript
		FF_CloseDialog ("Dialog_HV")	
		FF_ErrorBreak "Abbruch"
		exit do
	Case "Ende"				'bei Ende Schleife verlassen
		exit do
	Case Else
	End Select
loop

SliderWert = FF_GetControl ("Dialog_HV","AnzeigeH")	'Dialogwerte speichern
SpinWert = FF_GetControl ("Dialog_HV","AnzeigeV")

FF_CloseDialog ("Dialog_HV")			'Dialog schließen

msgbox "Eingestellt wurde" & vbNewLine & _
	   "Slider = " & SliderWert & vbNewLine & _
	   "Spin   = " & SpinWert & vbNewLine & vbNewLine & _
	   "Dialog ist beendet", vbOk, "Meldung"
Wenn HSPIDER vom Benutzer betätigt wird, erscheint oben in der blauen Kopfzeile des Dialogfelds hinter dem Dialognamen die Anzeige des Namen und des Einstellwerts, abgetrennt durch zwei Doppelpunkte (z.B. Dialog_HV::Horizontal=123). Dies geschieht automatisch, verursacht durch die Dialogsoftware und ist nicht zu beeinflussen oder abzufragen.

Natürlich können die Voreinstellwerte auf mathematischem Wege manipuliert werden.
Wenn man beispielsweise das Element HSPIDER zur Einstellung eines JPEG-Faktors von 60 bis 100 verwenden will, muss das Ergebnis mit 40/255 + 60 multipliziert und in einen Integerwert umgewandelt werden. Leider gibt es keine Möglichkeit, dies während des Verstellens anzuzeigen und ist daher nicht sinnvoll anzuwenden.
Beim VSPIN-Element bietet sich an, direkt beim Aufaddieren im WertV den Rückgabewert mit einem Faktor zu versehen, z.B. 0,25 (im Code natürlich Punkt statt Komma, also 0.25 einsetzen).
 
Zuletzt bearbeitet:

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#19
AW: Anleitung für FixFotos Skript-Dialogeditor

Zusammenfassung
Die wichtigen Punkte zur Dialogerstellung allgemein und zu GROUP, BOOL, STATIC und BUTTON sind im Kapitel Zwischenbilanz bereits aufgeführt.

Für die übrigen Steuerelemente ist folgendes zu merken:
  • EDIT erlaubt mehrzeiligen Text, SLEDIT (SingleLineEdit) nur einzeiligen Text.
  • Bei EDIT und SLEDIT gibt es viele, gut nutzbare Stile (siehe entsprechendes Kapitel)
  • Bei Steuerelementen des Typs COMBO und LISTBOX fügt jeder Aufruf von FF_SetControl (dialog,element,wert) der Liste einen weiteren Eintrag (wert) hinzu.
  • Wird ein Wert für COMBO und LISTBOX zweimal definiert, so wird er als Vorgabe selektiert.
  • Ein leerer String löscht die Liste bei COMBO und LISTBOX.
  • Ein IMAGE-Steuerfeld sollte immer quadratisch angelegt werden, um hoch- und querformatige Bilder gleich gut darstellen zu können.
  • Für IMAGE kann mit FF_SetControl (dialog,element,wert) als wert ein Pfad auf ein Bild oder der Index des Stacks angegeben werden, wobei 0 dem aktuellen Bild entspricht.
  • Bei FONT wird die ausgewählte Schrift im Klartext ausgegeben, bei COLOR erhält man den RGB-Wert der gewählten Farbe.
  • HSLIDER und VSPIN muss immer zusammen mit einem Textfeld eingesetzt werden
  • HSPIN muss mit dem dazugehörigen Textfeld über den Befehl FF_SetControlBuddy verbunden werden. Bei VSPIN muss ein Aufaddieren von Zahlenwerten (String erst in eine Zahl umwandeln) erfolgen, dessen Ergebnis anschließend in ein Textfeld übertragen wird.

Noch ein Tipp:
Alle Beispiele können schnell ausprobiert werden, indem jeweils der Programmcode aus der vorlie-genden Beschreibung kopiert und in den FFSkript-Editor eingefügt wird. Bei Betätigung der Taste Ausführen wird dann das Beispielskript gestartet.
Wenn man will, kann man bei dieser Gelegenheit das Skript auch unter einem beliebigen Namen abspeichern und mit der Automatischen Konfiguration ein Eintrag der Kategorie Demo mit Dialognamen in der Skriptliste erzeugt werden.
 
Zuletzt bearbeitet:

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.484
Standort
Düsseldorf
Trophäen
*!
#20
AW: Anleitung für FixFotos Skript-Dialogeditor

Das war das letzte Kapitel und "ich habe fertig".
Gibt es noch Korrekturanmerkungen, Ergänzungs- oder Verbesserungsvorschläge?
Die würde ich dann noch gerne verarbeiten vor einer Veröffentlichung als PDF-Datei.
 
Oben