Abfrage einer globalen Variablen

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

Abfrage einer globalen Variablen

Beitrag von josinoro »

In einer Symbolleiste habe ich fünf 3-fach Schalter, welche mir jeweils eine von fünf globalen Variablen steuern.

LMB: Pfad aufrufen
RMB: Aktuellen Pfad speichern
MMB: Eintrag löschen

In diesen Variablen sollen fünf Pfade gespeichert werden, um einen direkten Zugriff darauf zu gewährleisten
Der gespeicherte Pfad wird mir als Label im Schalter angegeben.

Das funktioniert so weit auch alles mit dem Code:

Code: Alles auswählen

Go "{$glob:Pfad11}" NEWTAB=findexisting
Wird die Variable "gelöscht", wird ihr (bei Schalter 1) der Wert: "Pfad 1 merken" zugewiesen, welcher dann ebenfalls als Label im Schalter erscheint.
Ist die Variable aber mit dem Wert "Pfad 1 merken" definiert, führt das zu einem falschen Pfadaufruf.

Wie kann ich jetzt verhindern, dass Go "{$glob:Pfad11}" NEWTAB=findexisting aufgerufen wird, wenn der Wert der Variablen Pfad11 "Pfad 1 merken" ist?

Schalterode:

Code: Alles auswählen

<?xml version="1.0"?>
<button backcol="#404040" display="label" separate="yes" textcol="#ffffff" type="three_button" use_child_icons="yes">
	<label>Pfad 1 merken</label>
	<icon1>#DOpus9:goroot</icon1>
	<button backcol="none" display="label" textcol="none">
		<label>Pfad aufrufen</label>
		<tip>Geht zum gespeicherten Pfad</tip>
		<function type="normal">
			<instruction>Go &quot;{$glob:Pfad11}&quot; NEWTAB=findexisting</instruction>
		</function>
	</button>
	<button backcol="none" display="label" textcol="none">
		<label>Aktuellen Pfad speichern.</label>
		<tip>Speichert den aktuellen Pfad</tip>
		<function type="normal">
			<instruction>@confirm Den aktuellen Pfad auf diesem Platz speichern?|Ja|Nein</instruction>
			<instruction>@set glob!:Pfad11={sourcepath|noterm}</instruction>
			<instruction />
			<instruction>@label:=Val(&quot;$glob:Pfad11&quot;)</instruction>
			<instruction>// @label:=Left(Val(&quot;$glob:Pfad11&quot;), 2)</instruction>
			<instruction>// @label:=Left(Val(&quot;$glob:Pfad11&quot;), 2) + &quot;\...\&quot; + Right(Val(&quot;$glob:Pfad11&quot;), Len(Val(&quot;$glob:Pfad11&quot;)) - 3)</instruction>
			<instruction>@toggle:update</instruction>
		</function>
	</button>
	<button backcol="none" display="label" textcol="none">
		<label>Eintrag löschen</label>
		<tip>Löscht den gespeicherten Eintrag</tip>
		<function type="normal">
			<instruction>@confirm Den aktuellen Platz löschen?|Ja|Nein</instruction>
			<instruction>@set glob:Pfad11=Pfad 1 merken</instruction>
			<instruction>@toggle:update</instruction>
		</function>
	</button>
</button>
Benutzeravatar
tbone
Supporter
Beiträge: 507
Registriert: 29. Okt 2021 00:45
Betriebssystem: Windows 10 Pro

Re: Abfrage einer globalen Variablen

Beitrag von tbone »

Pfad11 = Pfad1 ?!
Ich würde die Leezeichen in den Werten entfernen, Quotes überall nehmen wo möglich und nötig und Evaluatoren und Modifier NICHT miteinander kombinieren.

Wenn Pfad11 == "Pfad 1 merken" bedeuten soll: Pfad 1 ist nicht gesetzt. Warum nimmst Du da nicht einfach "", einen Leerstring oder löschst die Variable komplett?
Wie kann ich jetzt verhindern, dass Go "{$glob:Pfad11}" NEWTAB=findexisting aufgerufen wird, wenn der Wert der Variablen Pfad11 "Pfad 1 merken" ist?
Hä, indem Du ein IF da einbaust vermutlich? Klingt mir wie eine Scherzfrage.. o)
Benutzeravatar
josinoro
Supporter
Beiträge: 229
Registriert: 10. Nov 2021 20:56
Betriebssystem: Windows 10 Pro
DOpus Version: 13

Re: Abfrage einer globalen Variablen

Beitrag von josinoro »

Hallo tbone,
tbone hat geschrieben: 8. Mai 2025 19:06 Pfad11 = Pfad1 ?!
Ja, Pfad 1 mit Leerzeichen ist der Wert der globalen Variablen Pfad11 und damit der Text des Labels für Schalter 1, wenn kein Pfad in Pfad11 gespeichert ist. Insgesamt habe ich 5 Symbolleisten, die ich bei Bedarf einblenden kann. Damit ich aber nicht alle Symbolleisten, beziehungsweise die Schalter aller Symbolleisten bei einer Änderung neu bearbeiten muss, bearbeite ich lediglich die Symbolleiste 1 und kopiere diese fünfmal und lasse dann für die zweite Symbolleiste die Namen der Variablen von Pfad11 in Pfad21, ..., Pfad15 in Pfad25 in einem Texteditor durch suchen und ersetzen austauschen. Die erste Ziffer bestimmt die Nummer der Symbolleiste und die zweite Ziffer die Position des Schalters.
tbone hat geschrieben: 8. Mai 2025 19:06 Hä, indem Du ein IF da einbaust vermutlich? Klingt mir wie eine Scherzfrage.. o)
Leider ist das keine Scherzfrage. Genau daran versuche ich mich erfolglos.
Benutzeravatar
tbone
Supporter
Beiträge: 507
Registriert: 29. Okt 2021 00:45
Betriebssystem: Windows 10 Pro

Re: Abfrage einer globalen Variablen

Beitrag von tbone »

Code: Alles auswählen

<?xml version="1.0"?>
<button backcol="none" display="label" textcol="#ffffff" type="three_button" use_child_icons="yes">
	<label>Btn_RememberPath1</label>
	<icon1>#DOpus9:goroot</icon1>
	<button backcol="none" display="label" textcol="none">
		<label>Go</label>
		<tip>=$glob:Btn_RememberPath1_Label</tip>
		<function type="normal">
			<instruction>@output:&quot;Path: {$glob:Btn_RememberPath1_Path}&quot;</instruction>
			<instruction />
			<instruction>@if:$glob:Btn_RememberPath1_Path</instruction>
			<instruction>@output:if_TRUE</instruction>
			<instruction>Go &quot;{$glob:Btn_RememberPath1_Path}&quot; NEWTAB=findexisting</instruction>
			<instruction />
			<instruction>@if:else </instruction>
			<instruction>@output:if_FALSE</instruction>
			<instruction>@output:&quot;Path1 not set, not going anywhere&quot;</instruction>
			<instruction />
			<instruction>@if:common</instruction>
			<instruction>@output:if_END</instruction>
		</function>
	</button>
	<button backcol="none" display="label" textcol="none">
		<label>Set</label>
		<function type="normal">
			<instruction>@confirm Set current path as Path1?|Yes|No</instruction>
			<instruction />
			<instruction>@set glob!:Btn_RememberPath1_Path={sourcepath|noterm}</instruction>
			<instruction>@set glob!:Btn_RememberPath1_Label=GO [{sourcepath|noterm}]</instruction>
			<instruction />
			<instruction>@label:=Val(&quot;$glob:Btn_RememberPath1_Label&quot;)</instruction>
			<instruction />
			<instruction>@toggle:update</instruction>
		</function>
	</button>
	<button backcol="none" display="label" textcol="none">
		<label>Clear</label>
		<function type="normal">
			<instruction>@confirm Clear remembered Path1?|Yes|No</instruction>
			<instruction />
			<instruction>@set glob:Btn_RememberPath1_Label=Path1 (none)</instruction>
			<instruction>@set glob:Btn_RememberPath1_Path</instruction>
			<instruction />
			<instruction>@toggle:update</instruction>
		</function>
	</button>
</button>
Da, probierste mal!.. Ich habe 2 Variablen benutzt, dann kann man das Button-Label besser "einstellen".
Ich habe die Variablen auch geprefixt mit "Btn_RememberPathX_..", das hält alle Variablen für diese Typen von Buttons zusammen, falls Du mal einen globalen Variablen-Editor von DO aufmachst, hast Du nur Variablen Salat dort drin und keine Ahnung, dass die globale Variable "Pfad11" zu irgendeinem Button gehört (zum Beispiel).

Immer so programmieren, als ist es nicht das letzte Program und als ist man nicht alleine auf der Welt und auch so, als muss der Kollege morgen auch noch verstehen, was man da gemacht hat. Der Kollege ist man meistens selber dann, spätestens übernächste Woche oder so.. o)

EDIT: "Path1" kannst Du hier trotzdem ersetzen und den Button somit weiterhin über die externe Bearbeitung Configs-Files "multiplizieren". Ansich müsste man hier aber auch noch eine Lösung finden, dass man auf den Toolbars nur "Create Btn_Remember1" oder so einträgt und dann kommt der passende Code automatisch.. irgendwie könnte da was gehen, mit "@ctx=.." vielleicht, aber.. soll für heute ausreichen.

Das ganze "Ding" mit Evaluatoren, normalen Befehlen, Script-Variablen, Command-Modifiern.. mal ehrlich, das ist komplett außer Kontrolle geraten. Ich habe locker 1 Stunde gebraucht und Beispiele und Doku geblättert, für normale Menschen nicht machbar, selbst für Entwickler nicht machbar, wenn diese noch ein Leben haben. o)

Am Besten wäre, dieses ganze Button- und Label-Handling geht auch über in reines Scripting, das kann jeder verstehen und in EINER Referenz nachschlagen. Diese Old-School-Codes kombiniert mit Evaluatoren, also man blättert ja ständig und querbeet über zig Unter-Themen und Referenzen und die Syntax ist auch alle Nase lang anders. Das kann man doch eigentlich keinem zumuten! o)
Benutzeravatar
tbone
Supporter
Beiträge: 507
Registriert: 29. Okt 2021 00:45
Betriebssystem: Windows 10 Pro

Re: Abfrage einer globalen Variablen

Beitrag von tbone »

PS: So einen dynamischen "Go" Button (oder mehrere).. ansich keine schlechte Idee! o)
Benutzeravatar
josinoro
Supporter
Beiträge: 229
Registriert: 10. Nov 2021 20:56
Betriebssystem: Windows 10 Pro
DOpus Version: 13

Re: Abfrage einer globalen Variablen

Beitrag von josinoro »

Hallo tbone,

vielen Dank für Deine Antwort und Deine Mühe.

Es ist ja schon etwas tröstlich, wenn es nicht nur mir bei dem Durcheinander manchmal etwas mühsam erscheint. Interessant finde ich immer wieder, was für "Kleinigkeiten" man entdeckt, wenn man Beispiele wie von Dir anschaut. Eine Anweisung wie =$glob:Btn_RememberPath1_Label direkt in die Beschreibung zu setzen, war für mich gar nicht denkbar.

Tatsächlich bin ich an der, für mich immer noch nicht schlüssigen, Syntax bei der Referenzierung der Variablen gescheitert. Mal mit $, mal ohne $, mal mit {, mal ohne {.

So, wie ich das jetzt verstehe, liefert die Abfrage (LMB) @if:$glob:Btn_RememberPath1_Path lediglich einen Wahrheitswert zurück!?
Ich habe meist versucht, auf den beim Löschen zugewiesenen Text abzufragen. Besteht denn keine Möglichkeit, den Text selbst abzufragen?
Vor gut 30 Jahren habe ich mal in Delphi (Pascal) programmiert. Soviel Struktur würde ich mir bei den hier zur Verfügung stehenden Code-Möglichkeiten auch wünschen. Aber, wie Du richtig bemängelt hast, ist das komplett außer Kontrolle geraten.

Jedenfalls habe ich es dank Deiner Hilfe so zum Laufen bekommen, wenngleich ich mich auch auf eine Variable beschränke und die Nummerierung beibehalten habe.

Vielleicht ist das ja für den einen oder anderen interessant. In der Zip-Datei sind fünf Symbolleisten und ein Schalter, welcher diese steuert.

Update: Unbenutzte Schalter können ausgeblendet werden. Pfadleistentitel können beliebig definiert werden.
Dateianhänge
Pfadleisten.zip
(17.72 KiB) Noch nie heruntergeladen
Zuletzt geändert von josinoro am 14. Mai 2025 11:38, insgesamt 1-mal geändert.
Benutzeravatar
tbone
Supporter
Beiträge: 507
Registriert: 29. Okt 2021 00:45
Betriebssystem: Windows 10 Pro

Re: Abfrage einer globalen Variablen

Beitrag von tbone »

josinoro hat geschrieben: 9. Mai 2025 15:31 Eine Anweisung wie =$glob:Btn_RememberPath1_Label direkt in die Beschreibung zu setzen, war für mich gar nicht denkbar.
Das ist mir über den Weg gelaufen, als ich die Dokus gewälzt habe! o) Finde ich aber nicht gut!
Ein Modifier ala "@tooltip:=" wäre erstmal naheliegender und lässt sich zusammen dann mit dem Code kopieren, von daher, ja.. Schön dass es geht, aber schön gemacht ist es nicht, aber kann ja noch kommen.
So, wie ich das jetzt verstehe, liefert die Abfrage (LMB) @if:$glob:Btn_RememberPath1_Path lediglich einen Wahrheitswert zurück!?
Ja, ist auch nicht gut dokumentiert, einen Vergleich auf "" bzw. Leerstring habe ich nicht hinbekommen. "@set" prüft, ob eine Variable gesetzt ist. Das ist ziemlich schwammig, ein zugewiesener Leerstring ist ansich auch als "gesetzt" zu werten, die Variable existiert ja auch, scheint hier aber nicht so gewertet zu werden, weswegen das dann doch klappt. Richtig sauber ist das auch nicht, denke ich..

Den "Go" und "Clear" Button, könnte man aber sauber in JScript umsetzen, ich habe das jetzt aber nicht getan, weil ich im Stil Deiner Buttons bleiben wollte und vielleicht auch noch etwas "auffrischen". Ich würde es selbst aber wohl nochmal in JScript umsetzen, denn das ist strukturierter Code mit definierter Syntax, den man auch viel besser debuggen kann. So wie Dein Delphi vermutlich.. o) Dieser neuer "@output" Modifier ist für Ausgaben in der Konsole bspw. auch noch nicht wirklich gut zu gebrauchen, ein DOpus.Output("Meine Log-Ausgabe.."); in JScript kann das "@output" längst nicht ersetzen.

Auch das "@confirm .." verträgt keine Variablen und und und.. naja, das ist halt irgendwo Spielerei, nimm JScript wann immer es geht. Wenn ich wüßte ob man das Button-Label auch mit JScript setzen kann, dann wäre der "Set" Button und damit alle 3 Buttons in JScript möglich. In Verbindung mit den UserCommands, könnte man diesen 3-Button dann vielleicht sogar als Template überall einfügen. Die Suche im GP-Forum war leider auch keine besondere Hilfe, man kann dort bspw. nicht nach "@set" suchen und schöne Beispiele finden, sodass ich mich erstmal mit der geposteten Lösung zufrieden gab.
Antworten