Page 1 of 1

tMsg() - Abschaltbare MsgBox-Option für den Testfall

Posted: 07 May 2020, 11:02
by BNOLI
Moin Leute,
mehr als im Titel getönt ist es auch nicht. Einfach im Skript den Schalter auf true bzw false setzen.
Und schon gibts sowas wie debugging für Bedürftige. War es irgendwie leid :arrow: ToolTips und :arrow: MsgBoxen ständig auskommentieren/entfernen zu müssen. Frohes gelingen :)

tMsg().ahk (einfach kopieren/download)

Code: Select all

;
; 
; tMsg	:= false														; soll eine Msg zu testzwecken angezeigt werden: true/false bzw. 1/0
;																		; tMsg ? (... ist 'tMsg' wahr, dann)
; tMsg ? tMsg("bez:msg","bez:msg")										; ... zeige statusmeldung an, z.B. <key>:<value> (default delimiter = ":")
; tMsg ? tMsg("abc", myVar)												; separate angaben eines strings und einer variablen (ausgabe aufeinanderfolgende zeile)
; tMsg ? tMsg("myVar:" myVar)											; angabe eines strings mit bezeichner und wert zzgl delimiter (ausgabe auf gleicher zeile)
; tMsg ? tMsg(myVar)													; hier wird lediglich ein wert übergeben												
; tMsg ? tMsg()															; ohne parameter angabe. Schreibt zeitstempel in datei "<scriptName>.log", in jeweils neuer zeile.
;
;

tMsg(v1:="",v2:="",v3:="",v4:="",v5:="",v6:="") {						; anzahl an elementen/eingangsparametern variabel (hier sechs) 
	fn := Func("tMsg")													; functionObj zur function erstellen
	if (v1 = "") {														; da function aufruf ohne angabe
		log:= FileOpen(SubStr(A_ScriptName,1,-4) . ".log", "a `r`n")	; ... datei öffnen (ggfs. erstellen), inhalte (hier zeitstempel) werden angehängt
		log.Write(A_Now "`n")											; ... datei beschreiben
		Log.Close()														; ... datei schließen
		Return															; back 2 sender
	}
	Loop % fn.MaxParams {												; da function aufruf mit angabe(n): abarbeiten der übergebenen werte (funcObj liefert anzahl der params=iterations)
		if InStr(v%A_Index%,":") {										; enthält der übergebene wert den default delimiter
			msg := StrSplit(v%A_Index%,":")								; ... wird bezeichner von wert separiert (ermöglicht anschließend beliebiges ausgabeformat)
			str .= msg[1] ":`t" msg[2] "`n"								; und nach editierung (auf gleicher zeile) concatiniert
		} Else {														; ... ansonsten
			str .= v%A_Index% "`n"										; ... wird ohne bezeichner (auf jeweils neuer zeile) concatiniert.
		}
	}
	MsgBox % str														; finale ausgabe übergebener werte (vars/strings) während testlauf.
	Return
	}
myTest.ahk (dito, und ist im selben verzeichnis zu starten)

Code: Select all

#NoEnv
#SingleInstance, Force
#Include tMsg().ahk								; einbinden/inkludieren der testMessage function AKA tMsg()

tMsg := 1										; schalter zum an-/abschalten (true/false bzw 1/0) aller nachfolgenden tMsg() aufrufe
var := 1234										; eine variable mit wert
fObj := {"a":"1","b":"2","c":"3"}				; ein array object

tMsg ? tMsg("Hallo Welt")						; mal grüßen!

Loop 2 {
	SoundBeep
	tMsg ? tMsg("Beep [" A_Index "]")			; anzahl soundbeeps zur laufzeit anzeigen
	}

tMsg ? tMsg("a :" fObj["a"],"b :" fObj["b"])	; key values von a, b des fObj arrays anzeigen
	
tMsg ? tMsg(bla())								; rückgabewert der bla() anzeigen

bla() {
	Return "Moin Moin!"
	}
	
tMsg ? tMsg("myTestVar:`t" var)					; variablennamen und wert anzeigen

Gui, Add, DDL, x10 y10 vDDL1 Choose1, A|B|C|D|E
Gui, Add, Button, xp+130 yp-1 gStart, Start
Gui, Show, x100 y100 w184 h40, myGui
Return

Start:
	Gui, Submit, NoHide
	tMsg ? tMsg("You've selected: " DDL1)		; gui-selection anzeigen
	Return
PS. Gerade bemerken dürfen, das Dinge ein- und auszuschalten nicht auf MsgBoxen beschränkt ist: https://www.autohotkey.com/boards/viewtopic.php?f=10&t=73656 :thumbup:

Re: tMsg() - Abschaltbare MsgBox-Option für den Testfall

Posted: 08 May 2020, 04:23
by just me
Moin,

man könnte hier auch eine Variadische Funktion nutzen:

Code: Select all

tMsg(p*) {	; variable Anzahl von Parametern, die Anzahl der tatsächlich übergebenen Parameter liefert p.Length()
}

Re: tMsg() - Abschaltbare MsgBox-Option für den Testfall

Posted: 08 May 2020, 04:44
by BNOLI
Als ich den Link dazu in der AHK Hilfe sah, dachte ich an eine Romulanische (Weltraum-)Gehhilfe :lol: ... und hab schnell weitergeblättert :silent:
Danke ist notiert :)

Re: tMsg() - Abschaltbare MsgBox-Option für den Testfall

Posted: 14 May 2020, 02:35
by aifritz
Hallo BNOLI,
so was in der Art nutze ich auch, mit dem Unterschied, dass ich die Funktion direkt aufrufe und erst in der Funktion die Var tMsg checke. Hier durch erspart man sich jedesmal die Abfrage mit tMsg ?....
Allerdings mag Deine Variante eventuell etwas performanter sein, da hier der tMsg Check in nur einem Prozessschritt erledigt ist :)

Außer zum Debuggen, wäre das auch eine prima Idee, um anderen Usern speziell auch neuen Nutzern eine Step by Step Funktion anzubieten.
So hätte man einzelne Prozessschritte für alle am lebenden Objekt dokumentiert.

Re: tMsg() - Abschaltbare MsgBox-Option für den Testfall

Posted: 14 May 2020, 03:27
by BNOLI
Hallo aiFritz,
irgendwie hatte ich das im Urin, das ich nicht der Erste/Einzige bin der diesen geradezu epochalen Einfall hat :lol:
Und ich kann auch nicht wirklich glauben, das da nicht noch viel mehr 'funny stuff' diesbzgl draussen herumschwirrt - von dem deren Coder wahrscheinlich meinen es wäre es nicht wert geteilt zu werden. Schade eigentlich :| Da fällt mir gerade ein, ich hatte da mal eine iniFunc() gebaut, die machte quasi alles mit wehrlosen ini's, hab ich wohl verloren. Schon wieder schade, eigentlich. Anyway ...

Als Verbesserungspotential fällt mir aktuell nur ein die Variable tMsg auf t zu verkürzen :mrgreen: .. die Variadic (hieß das so?), welche mir @just me empfohlen hat, steht z.B. auch noch aus.

[3min later] Mit Sichtung der AHK-Hilfe zur "variadischen Funktion", fiel dann noch der dynamische Funktionsaufruf ins Auge, und wie mein Kollege immer sagte:
Geht dem noch kürser ...
Damit ist nicht mal eine Abfrage nötig, sondern (d)eine Funktion wird schlicht ignoriert wenn die Variable sie nicht explizit mittels 'Namens'Wert enabled.
Außer zum Debuggen, wäre das auch eine prima Idee, um anderen Usern speziell auch neuen Nutzern eine Step by Step Funktion anzubieten.
So hätte man einzelne Prozessschritte für alle am lebenden Objekt dokumentiert.
AH, also sowas wie hier ...

Image

... na dann brauchts jetzt also nur noch ein paar Motivierte, die das in eine Gui giessen :shh: :silent:

Re: tMsg() - Abschaltbare MsgBox-Option für den Testfall

Posted: 14 May 2020, 10:37
by aifritz
Zum Debuggen sieht die Gui ja richtig toll aus!

Zum Aufzeigen der Prozessschritte dachte ich allerdings eher an wenige relevante Breakpoints, wo man sieht was als nächstes passiert.
Hier mal dazu meine spartanische Funktion für alle die es interessiert :)

Code: Select all

;Argument ist ein String der als Hinweis der angezeigt wird
;Die globale Variable SlowModus gibt an, ob ein Hinweis als ToolTip angezeigt wird (=true) oder nicht (=false oder leer)
;Um die Verarbeitung fortzusetzen, drückt man die Pausetaste

/*Beispiel
SlowModus := true
ToolTipMsg("Excel Tabelle Umsätze2019.xlsb starten")
Run %MeinPfad%\Umsätze2019.xlsb
*/
ToolTipMsg(Argument){
  global
  If SlowModus{
    ToolTip, % Argument
    pause
    KeyWait Pause, L
    ToolTip
  }
}


Re: tMsg() - Abschaltbare MsgBox-Option für den Testfall

Posted: 14 May 2020, 12:25
by BNOLI
Wie? Erst über meinen exessiven Buchstabenverbrauch tMsg ? tMsg (11) reklamieren, um danach selbst einen Funktionsnamen mit 10 Zeichen zu verwenden ... :lol: Also was ich supi finde, ist die Pausenoption des ToolTip - kannte ich so noch nicht. Merci :)

Re: tMsg() - Abschaltbare MsgBox-Option für den Testfall

Posted: 14 May 2020, 12:59
by aifritz
Nein, nein ich hab mich doch nicht über Deine Variablenname aufgeregt...sprechende Namen sind doch schon sehr vielsagend :ugeek:
Ich träum ja immer noch von einem universellen ahk Makrorekorder, der alles perfekt aufzeichen kann.
Der bräuchte dann auch so ein schöne Funktion, um die Prozessschritte dokumentieren zu können...aber da wären wir wahrscheinlich fast schon bei RPA angelangt...

Re: tMsg() - Abschaltbare MsgBox-Option für den Testfall

Posted: 15 May 2020, 00:10
by BNOLI
Nun, wie ich immer wieder feststellen darf, bietet AHK mehr options als man denkt.
Stellt sich lediglich die Frage, ob man diese nutzen kann/möchte um eine "schönheitskosmetisch" ansprechendere Lösung eines :arrow: Debugger-client anzubieten ? :)

:arrow: Debug (ListVars | ListLines | OutputDebug | KeyHistory | DebugVars)

Re: tMsg() - Abschaltbare MsgBox-Option für den Testfall

Posted: 15 May 2020, 01:20
by haichen
Debugview von sysinternals, oder Debugview++ (https://www.autohotkey.com/boards/viewtopic.php?p=297603#p297603) starten
und in den Code

Code: Select all

OutputDebug, % "Zeile " A_LineNumber " varname= " var
Mach ich manchmal. Man muß auch kein Test=an oder soetwas einbauen. Bei Bedarf startet man einfach Debugview.
Meistens wirds dann doch nur ein Tooltip oder eine MsgBox ..

Oooh Mann. Ich sehe gerade: in Scite4AutoHotkey werden die OutputDebugausgaben in der Konsole angezeigt, wenn man den Debugknopf vor dem ausführen drückt.
Da sag ich jetzt nichts weiter zu. Heul.

Re: tMsg() - Abschaltbare MsgBox-Option für den Testfall

Posted: 11 Jul 2020, 10:32
by effel
warum steht in dem code tMsg ? ?
nachdem ich es aus deinem code entfernt habe funktioniert er genau so

Re: tMsg() - Abschaltbare MsgBox-Option für den Testfall

Posted: 11 Jul 2020, 15:40
by aifritz
Siehe hier:

https://ahkde.github.io/docs/Variables.htm#ternary


tmsg ist hier eine Boolean-Variable und das Fragezeichen eine Kurzschreibweise für If...
Die Funktion mit dem gleichen Namen wird nur ausgeführt, wenn tmsg = true

Re: tMsg() - Abschaltbare MsgBox-Option für den Testfall

Posted: 12 Jul 2020, 07:31
by effel
danke, das klärt auch andere Fragen die ich noch gehabt hätte