Variablen setzen und abfragen

Hilfe zu verschiedenen Themen
Antworten
Benutzeravatar
josinoro
Supporter
Beiträge: 116
Registriert: 10. Nov 2021 20:56
Betriebssystem: Windows 10 Pro
DOpus Version: 13

Variablen setzen und abfragen

Beitrag von josinoro »

Hallo Listlinge,

ich möchte bei bestimmten "Drei Tasten-Schaltern" gerne einen Status optisch anzeigen lassen. Dazu habe ich mit verschiedenen Beispielcodes experimentiert, wo eine Variable gesetzt wird.

Ich habe eine Lösung gefunden, verstehe allerdings nicht, was da passiert. Der Schaltercode ohne $lst!: funktioniert nicht.

Was macht $lst!:?

Code: Alles auswählen

<?xml version="1.0"?>
<button backcol="none" display="both" textcol="none">
	<label>Variablen</label>
	<tip>&lt;#ff0000&gt;Klick          -&gt;&lt;/#&gt; Mit $lst:\n&lt;#ff0000&gt;Strg-Klick -&gt;&lt;/#&gt; Ohne $lst:</tip>
	<icon1>#default:goforward</icon1>
	<icon2>#default:goback</icon2>
	<function type="normal">
		<instruction>@keydown:none</instruction>
		<instruction>//_________________________________________________________________________________________________</instruction>
		<instruction />
		<instruction>@toggle:if !$lst!:test</instruction>
		<instruction />
		<instruction>@ifset:$lst!:test</instruction>
		<instruction>@set $lst!:test=0</instruction>
		<instruction>Confirm TITLE &quot;Schalterauswahl&quot; MSG &quot;Sie haben den Schalter angewählt!&quot; BUTTONS &quot;OK&quot; ICON=info</instruction>
		<instruction />
		<instruction>@ifset:else</instruction>
		<instruction>@set $lst!:test=1</instruction>
		<instruction>Confirm TITLE &quot;Schalterauswahl&quot; MSG &quot;Sie haben den Schalter abgewählt!&quot; BUTTONS &quot;OK&quot; ICON=info</instruction>
		<instruction />
		<instruction>///////////////////////////////////////////////////////////////////////////////////////////////////</instruction>
		<instruction />
		<instruction>@keydown:ctrl</instruction>
		<instruction />
		<instruction>//_________________________________________________________________________________________________</instruction>
		<instruction />
		<instruction>@toggle:if test</instruction>
		<instruction />
		<instruction>@ifset:test</instruction>
		<instruction>@set test=0</instruction>
		<instruction>Confirm TITLE &quot;Schalterauswahl&quot; MSG &quot;Sie haben den Schalter angewählt!&quot; BUTTONS &quot;OK&quot; ICON=info</instruction>
		<instruction />
		<instruction>@ifset:else</instruction>
		<instruction>@set test=1</instruction>
		<instruction>Confirm TITLE &quot;Schalterauswahl&quot; MSG &quot;Sie haben den Schalter abgewählt!&quot; BUTTONS &quot;OK&quot; ICON=info</instruction>
	</function>
</button>
Liebe Grüße

josinoro
Benutzeravatar
Kundal
Moderator
Beiträge: 122
Registriert: 24. Okt 2021 18:02
Betriebssystem: Windows 10 Pro

Re: Variablen setzen und abfragen

Beitrag von Kundal »

Ich habe deinen Schalter mal umgebaut, weil z.B. bei mir kein Befehl "Confirm" existiert und ich das auf @confirm ändern musste. Das mit den Variablen fand ich immer schon etwas verwirrend. Das lst:<name> ist aber nötig, weil deine Variable sonst nicht von einem Klick auf den Button bis zum nächsten Klick überlebt. lst bezieht die Variable auf den aktuellen Lister. Ein Ausrufezeichen hinter lst bewirkt, dass die Variable auf Platte gespeichert wird. das heißt, sie existiert auch bei der nächsten Session noch. Du hast in diesem Button also eine beständige Variable und eine, die beim Schließen des Listers vergessen wird.
Am besten du schaust mal in der Hilfe unter @set, @if und @toggle nach. Zum Testen der Variable wird eher @if als @ifset verwendet. @ifset testet eher settings wie "@ifset Dual=On"

Code: Alles auswählen

@keydown:none
//_________________________________________________________________________________________________

@toggle:if $lst!:test

@if:$lst!:test
@set lst!:test=0
@Confirm "Sie haben den Schalter angewählt!"

@if:else
@set lst!:test=1
@Confirm "Sie haben den Schalter abgewählt!"

///////////////////////////////////////////////////////////////////////////////////////////////////

@keydown:ctrl

//_________________________________________________________________________________________________

@toggle:if $lst:test

@if: $lst:test
@set lst:test
@Confirm "Sie haben den Schalter angewählt!"

@if:else
@set lst:test=1
@Confirm "Sie haben den Schalter abgewählt!"
Benutzeravatar
josinoro
Supporter
Beiträge: 116
Registriert: 10. Nov 2021 20:56
Betriebssystem: Windows 10 Pro
DOpus Version: 13

Re: Variablen setzen und abfragen

Beitrag von josinoro »

Hallo Kundal,

vielen Dank für deine Erklärungen.

Also auf Lister bei $lst wäre ich jetzt nicht gekommen, obwohl das bei ein wenig Nachdenken ja nicht so abwegig ist.
Dann ist $lst also lediglich die lokale Variable im Gegensatz zu $glob als globale Variable!?

Was mich in den Anleitungen irritiert sind die verschiedenen Schreibweisen für ein und dieselbe Sache. Dass der Befehl Confirm bei dir nicht funktioniert, bedeutet, dass dieser Befehl bei mir in irgendeinem Script deklariert und definiert wurde!?

Wie kann ich denn auf den Inhalt der Variable zugreifen und darstellen?

@Confirm "Sie haben den Schalter angewählt!"+$lst!:test (oder kaufmännisches und)
@Confirm "Sie haben den Schalter angewählt!"+test (oder kaufmännisches und)

funktioniert ja nicht so einfach.

Liebe Grüße

josinoro
Benutzeravatar
Kundal
Moderator
Beiträge: 122
Registriert: 24. Okt 2021 18:02
Betriebssystem: Windows 10 Pro

Re: Variablen setzen und abfragen

Beitrag von Kundal »

Variablen, die du im Button setzt kannst du im Editor unter Argumente=>Variablen finden. Da sieht die Variable z.B. so aus {$lst:test}. Das zeigt aber auch nicht Name und Wert der Variablen im Confirm-Dialog, sondern dient nur der Verwendung innerhalb des Buttoncodes.
Hier ein kurzes Script, das dir im Skript-Protokoll anzeigt, ob die Variable test existiert und wenn ja welchen Wert sie hat.

Code: Alles auswählen

Dim varName, varValue
    varName = "test"

    if (DOpus.Listers(0).Vars.Exists(varName)) then
        varValue = DOpus.listers(0).Vars.Get(varName)
        DOpus.Output varName & " = " & varValue
    else
        DOpus.Output varName & " ist nicht vorhanden."
    end if
Benutzeravatar
Kundal
Moderator
Beiträge: 122
Registriert: 24. Okt 2021 18:02
Betriebssystem: Windows 10 Pro

Re: Variablen setzen und abfragen

Beitrag von Kundal »

Hier ein Schalter, der sowohl alle vorhandenen Lister-Variablen als auch globale Variablen und ihre Werte im Skriptprotokoll anzeigt:

Code: Alles auswählen

<?xml version="1.0"?>
<button backcol="none" display="both" textcol="none">
	<label>Zeige Lister- und globale Variablen</label>
	<tip>Das Skriptprotokoll öffnen und vorhandene Variablen (Lister und Global) anzeigen</tip>
	<icon1>#scriptlog</icon1>
	<function type="script">
		<instruction>@script JScript</instruction>
		<instruction>function OnClick(clickData)</instruction>
		<instruction>{</instruction>
		<instruction>	cmd = clickData.func.command;</instruction>
		<instruction>	cmd.RunCommand(&apos;Set LISTERSIZE=Set UTILITY=OtherLog&apos;)</instruction>
		<instruction />
		<instruction>	DOpus.ClearOutput();</instruction>
		<instruction>	DOpus.Output(&quot;Lister Variablen:&quot;)</instruction>
		<instruction />
		<instruction>	for (var lVars = new Enumerator(DOpus.listers(0).Vars); !lVars.atEnd(); lVars.moveNext())</instruction>
		<instruction>	{</instruction>
		<instruction>			varContentl = DOpus.listers(0).Vars.Get(lVars.item())</instruction>
		<instruction>			DOpus.Output(&quot;    &quot; + lVars.item() + &quot; = &quot; + varContentl)</instruction>
		<instruction>	}</instruction>
		<instruction />
		<instruction>	DOpus.Output(&quot;Total: &quot; + DOpus.listers(0).Vars.count)</instruction>
		<instruction />
		<instruction>	DOpus.Output(&quot;Globale Variablen:&quot;)</instruction>
		<instruction />
		<instruction>	for (var gVars = new Enumerator(DOpus.Vars); !gVars.atEnd(); gVars.moveNext())</instruction>
		<instruction>	{</instruction>
		<instruction>			varContentg = DOpus.Vars.Get(gVars.item())</instruction>
		<instruction>			DOpus.Output(&quot;    &quot; + gVars.item() + &quot; = &quot; + varContentg)</instruction>
		<instruction>	}</instruction>
		<instruction />
		<instruction>	DOpus.Output(&quot;Total: &quot; + DOpus.Vars.count)</instruction>
		<instruction>}</instruction>
	</function>
</button>
Benutzeravatar
josinoro
Supporter
Beiträge: 116
Registriert: 10. Nov 2021 20:56
Betriebssystem: Windows 10 Pro
DOpus Version: 13

Re: Variablen setzen und abfragen

Beitrag von josinoro »

Super! Bei lokalen Variablen funktioniert das. Die globalen Variablen werden so nicht erfasst.

Code: Alles auswählen

<?xml version="1.0"?>
<button backcol="none" display="both" textcol="none" type="three_button">
	<label>Variablen</label>
	<icon1>#default:goforward</icon1>
	<icon2>#default:goback</icon2>
	<button backcol="none" display="both" textcol="none">
		<label>Lokale Variable</label>
		<tip>Lokale   Variable an / aus - $lst!:testlokal</tip>
		<icon1>#default:goforward</icon1>
		<icon2>#default:goback</icon2>
		<function type="normal">
			<instruction>// lokal</instruction>
			<instruction>//_________________________________________________________________________________________________</instruction>
			<instruction />
			<instruction>@toggle:if $lst!:testlokal</instruction>
			<instruction />
			<instruction>@ifset:$lst!:testlokal</instruction>
			<instruction>@set $lst!:testlokal=0</instruction>
			<instruction />
			<instruction>@Confirm Sie haben den lokalen Schalter abgewählt!</instruction>
			<instruction />
			<instruction>@ifset:else</instruction>
			<instruction>@set $lst!:testlokal=1</instruction>
			<instruction>@Confirm Sie haben den lokalen Schalter angewählt!</instruction>
		</function>
	</button>
	<button backcol="none" display="both" textcol="none">
		<label>Globale Variable</label>
		<tip>Globale Variable an / aus - $glob!:testglobal</tip>
		<icon1>#default:goforward</icon1>
		<icon2>#default:goback</icon2>
		<function type="normal">
			<instruction>// global</instruction>
			<instruction>//_________________________________________________________________________________________________</instruction>
			<instruction />
			<instruction>@toggle:if $glob:testglobal</instruction>
			<instruction>@if: $glob!:testglobal</instruction>
			<instruction />
			<instruction>@set glob!:testglobal=0</instruction>
			<instruction>@Confirm Sie haben den globalen Schalter abgewählt!</instruction>
			<instruction />
			<instruction>@if:else</instruction>
			<instruction>@set glob!:testglobal=1</instruction>
			<instruction>@Confirm Sie haben den globalen Schalter angewählt!</instruction>
		</function>
	</button>
	<button backcol="none" display="both" textcol="none">
		<label>Vorhanden?</label>
		<icon1>#default:copyas</icon1>
		<function type="script">
			<instruction>@script VBScript</instruction>
			<instruction>Dim varName1, varValue1, varName2, varValue2</instruction>
			<instruction>    varName1 = &quot;testlokal&quot;</instruction>
			<instruction>    varName2 = &quot;testglobal&quot;</instruction>
			<instruction />
			<instruction>    if (DOpus.Listers(0).Vars.Exists(varName1)) then</instruction>
			<instruction>        varValue1 = DOpus.listers(0).Vars.Get(varName1)</instruction>
			<instruction>        DOpus.Output &quot;Lokale Variable: &quot; &amp; varName1 &amp; &quot; = &quot; &amp; varValue1</instruction>
			<instruction>    else</instruction>
			<instruction>        DOpus.Output &quot;Lokale Variable: &quot; &amp; varName1 &amp; &quot; ist nicht vorhanden.&quot;</instruction>
			<instruction>    end if</instruction>
			<instruction />
			<instruction>    if (DOpus.Listers(0).Vars.Exists(varName2)) then</instruction>
			<instruction>        varValue2 = DOpus.listers(0).Vars.Get(varName2)</instruction>
			<instruction>        DOpus.Output &quot;Globale Variable: &quot; &amp; varName2 &amp; &quot; = &quot; &amp; varValue2</instruction>
			<instruction>    else</instruction>
			<instruction>        DOpus.Output &quot;Globale Variable: &quot; &amp; varName2 &amp; &quot; ist nicht vorhanden.&quot;</instruction>
			<instruction>    end if</instruction>
		</function>
	</button>
</button>

Die globale Variable wird aber korrekt gesetzt, was ich mit dem Script auslesen kann. Jetzt muss ich noch schauen, wie ich die zur Verarbeitung aufrufen kann.

Vielen Dank
Benutzeravatar
Kundal
Moderator
Beiträge: 122
Registriert: 24. Okt 2021 18:02
Betriebssystem: Windows 10 Pro

Re: Variablen setzen und abfragen

Beitrag von Kundal »

Hallo Josinoro, Die globale Variable wird im Skript anders aufgerufen.
- Listervariable: DOpus.listers(0).Vars.Get(varName1)
- globale Variable: DOpus.Vars.Get(varName2)
Deine Variablen sind übrigens immer vorhanden. Nur der Wert ändert sich von 0 auf 1. Wenn du eine Variable löschen willst, geht das einfach mit @set $lst!:testlokal, also ohne einen Wert anzugeben.
Dein Schalter sieht dann so aus:

Code: Alles auswählen

<?xml version="1.0"?>
<button backcol="none" display="both" textcol="none" type="three_button">
	<label>Variablen</label>
	<icon1>#default:goforward</icon1>
	<icon2>#default:goback</icon2>
	<button backcol="none" display="both" textcol="none">
		<label>Lokale Variable</label>
		<tip>Lokale   Variable an / aus - $lst!:testlokal</tip>
		<icon1>#default:goforward</icon1>
		<icon2>#default:goback</icon2>
		<function type="normal">
			<instruction>// lokal</instruction>
			<instruction>//_________________________________________________________________________________________________</instruction>
			<instruction />
			<instruction>@toggle:if $lst!:testlokal</instruction>
			<instruction />
			<instruction>@ifset:$lst!:testlokal</instruction>
			<instruction>@set $lst!:testlokal</instruction>
			<instruction />
			<instruction>@Confirm Sie haben den lokalen Schalter abgewählt!</instruction>
			<instruction />
			<instruction>@ifset:else</instruction>
			<instruction>@set $lst!:testlokal=1</instruction>
			<instruction>@Confirm Sie haben den lokalen Schalter angewählt!</instruction>
		</function>
	</button>
	<button backcol="none" display="both" textcol="none">
		<label>Globale Variable</label>
		<tip>Globale Variable an / aus - $glob!:testglobal</tip>
		<icon1>#default:goforward</icon1>
		<icon2>#default:goback</icon2>
		<function type="normal">
			<instruction>// global</instruction>
			<instruction>//_________________________________________________________________________________________________</instruction>
			<instruction />
			<instruction>@toggle:if $glob:testglobal</instruction>
			<instruction>@if: $glob!:testglobal</instruction>
			<instruction />
			<instruction>@set glob!:testglobal</instruction>
			<instruction>@Confirm Sie haben den globalen Schalter abgewählt!</instruction>
			<instruction />
			<instruction>@if:else</instruction>
			<instruction>@set glob!:testglobal=1</instruction>
			<instruction>@Confirm Sie haben den globalen Schalter angewählt!</instruction>
		</function>
	</button>
	<button backcol="none" display="both" textcol="none">
		<label>Vorhanden?</label>
		<icon1>#default:copyas</icon1>
		<function type="script">
			<instruction>@script VBScript</instruction>
			<instruction>Dim varName1, varValue1, varName2, varValue2</instruction>
			<instruction>    varName1 = &quot;testlokal&quot;</instruction>
			<instruction>    varName2 = &quot;testglobal&quot;</instruction>
			<instruction />
			<instruction>    if (DOpus.Listers(0).Vars.Exists(varName1)) then</instruction>
			<instruction>        varValue1 = DOpus.listers(0).Vars.Get(varName1)</instruction>
			<instruction>        DOpus.Output &quot;Lokale Variable: &quot; &amp; varName1 &amp; &quot; = &quot; &amp; varValue1</instruction>
			<instruction>    else</instruction>
			<instruction>        DOpus.Output &quot;Lokale Variable: &quot; &amp; varName1 &amp; &quot; ist nicht vorhanden.&quot;</instruction>
			<instruction>    end if</instruction>
			<instruction />
			<instruction>    if (DOpus.Vars.Exists(varName2)) then</instruction>
			<instruction>        varValue2 = DOpus.Vars.Get(varName2)</instruction>
			<instruction>        DOpus.Output &quot;Globale Variable: &quot; &amp; varName2 &amp; &quot; = &quot; &amp; varValue2</instruction>
			<instruction>    else</instruction>
			<instruction>        DOpus.Output &quot;Globale Variable: &quot; &amp; varName2 &amp; &quot; ist nicht vorhanden.&quot;</instruction>
			<instruction>    end if</instruction>
		</function>
	</button>
</button>
Antworten