Neue Version mit ausgeblendetem Fensterhintergrund in Post #1
Beiträge von BugFix
-
-
wenn ein zweiter Compiler bei SciTE über eine Tastenkombination zur Verfügung stehen könnte.
Erst mal grundlegend:
Die hinterlegten Aufrufe für Starten <F5>, Kompilieren <Ctrl+F7> und Erstellen <F7> findest du in der au3.properties.
Jeweils als
command.go...
command.compile...
command.build...
Die Hotkeys für diese Befehle sind in allen Programmiersprachen, für die du SciTE nutzt, identisch und deshalb fix hinterlegt. Daher tauchen diese auch in der *.properties nicht auf.
Die o. a. Aufrufe nutzen den AutoIt3Wrapper und sind somit für dich nur bedingt nützlich. Du musst schauen, welche Kommandozeilenparameter dein Compiler erwartet und dir entsprechend den Aufrufstring erstellen.
Vorstellbar wäre z.B. "Pfad_Compiler.exe /in Pfad_zu_kompilierende_Au3" (Für /out wird meist automatisch der Dateiname von /in als exe genutzt. Evtl. brauchst du auch keine Schlüsselwörter und nur die Reihenfolge der Parameter ist maßgebend.)
In deiner SciTEUser.properties musst du nun dafür einen eigenen Befehlsblock mit Hotkey definieren:
.propertiescommand.name.49.$(au3)=Extra Compiler command.49.$(au3)="PFAD_COMPILER" /in "$(FilePath)" command.mode.49.$(au3)=savebefore:yes,subsystem:windows command.shortcut.49.$(au3)=FREIER_HOTKEYFalls der Compiler ohne Fenster startet, also ein reines Kommandozeilentool ist, verwende in der Zeile "command.mode" subsystem:console.
Die hier verwendete Befehlsnummer (49) musst du ggf. anpassen und eine bei dir freie Nummer nutzen.
Aber nochmal der Hinweis: Wenn der Compiler nicht von Jos freigegeben ist, halte ich dessen Nutzung für illegal.
-
-
Kann man bei SciTE den Compiler austauschen, der mit Ctrl+F7 aufgerufen wird? Was noch besser wäre, wenn ein zweiter Compiler bei SciTE über eine Tastenkombination zur Verfügung stehen könnte.
Hast du einen anderen AutoIt Compiler?

Oder möchtest du für eine andere Sprache SciTE als Editor nutzen und auch Kompilieren?
Ja, das ist durchaus möglich und für die reine Compileranweisung auch unkompliziert. Wenn du zusätzlich Features wie Syntax Highlighting, Abbrev etc. möchtest ist es deutlich mehr Aufwand.
-
Dient es dazu zu sehen welche Farben man hat?
Nein, beim Schreiben des Skriptes soll es dir vereinfachen Farben für die Fläche / Controls zu wählen.
Bei Mehrfachnutzung der Farbe sinnvoll als Variablenzuweisung mit Farbnamen, oder den Farbwert direkt in eine Funktion einsetzen.
-
Gefällt mir, aber warum der Hook?
Ursprünglich wollte ich eine Tastenkombination mit Maus nutzen, dafür hatte ich den Hook. Habe es dann doch auf R-/L-Klick begrenzt und nur den Rest gelöscht.
Aber klar, so reichen die GUI_EVENT_.
-
Bevor ihr mich steinigt - natürlich weiß ich, dass es Farbtabellen, Farbmixer, Wizards etc. en masse gibt, hab ja selbst einige erstellt.

Warum habe ich nun trotzdem was Neues gemacht? Ich werde älter, die Augen schwächer und da wollte ich die Farben auf großen Flächen sehen und auch gern eine gängige Auswahl auf einen Blick.
Ich habe die Farben etwas gruppiert.Das dient dazu, beim Gestalten von Programmen schnell die passenden Farben für Gui und/oder Controls zu finden.
Mit Mausklick links wird der Hexwert (z.B. 0xE0FFFF) und mit Mausklick rechts die Zuweisung (z.B. $LightCyan = 0xE0FFFF) in die Zwischenablage kopiert. Anschließend wird das Fenster geschlossen.
EDIT 2022-07-25:
- Umgestellt auf Msg-Events für Maus-Up
- Fensterhintergrund ausgeblendet (kann deaktiviert werden durch Auskommentieren der Zeile #204)
AutoIt: ColorTable.au3
Alles anzeigen;-- TIME_STAMP 2022-07-25 10:13:35 v 0.1 #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WinAPIGdi.au3> #include <WinAPIHObj.au3> #include <WindowsConstants.au3> Global $aColors[][2] = [ _ ["Maroon",0x800000], _ ["DarkRed",0x8B0000], _ ["Brown",0xA52A2A], _ ["FireBrick",0xB22222], _ ["Crimson",0xDC143C], _ ["IndianRed",0xCD5C5C], _ ["Red",0xFF0000], _ ["OrangeRed",0xFF4500], _ ["Tomato",0xFF6347], _ ["Coral",0xFF7F50], _ ["LightCoral",0xF08080], _ ["Salmon",0xFA8072], _ ["DarkSalmon",0xE9967A], _ ["LightSalmon",0xFFA07A], _ ["DarkOrange",0xFF8C00], _ ["Orange",0xFFA500], _ ["DarkGoldenrod",0xB8860B], _ ["Goldenrod",0xDAA520], _ ["Gold",0xFFD700], _ ["Yellow",0xFFFF00], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ["SaddleBrown",0x8B4513], _ ; new block ["Sienna",0xA0522D], _ ["Chocolate",0xD2691E], _ ["Peru",0xCD853F], _ ["SandyBrown",0xF4A460], _ ["RosyBrown",0xBC8F8F], _ ["Tan",0xD2B48C], _ ["BurlyWood",0xDEB887], _ ["Wheat",0xF5DEB3], _ ["Moccasin",0xFFE4B5], _ ["PeachPuff",0xFFDAB9], _ ["NavajoWhite",0xFFDEAD], _ ["Bisque",0xFFE4C4], _ ["BlanchedAlmond",0xFFEBCD], _ ["PapayaWhip",0xFFEFD5], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ["DarkGreen",0x006400], _ ; new block ["Green",0x008000], _ ["ForestGreen",0x228B22], _ ["SeaGreen",0x2E8B57], _ ["MediumSeaGreen",0x3CB371], _ ["MediumAquamarine",0x66CDAA], _ ["LimeGreen",0x32CD32], _ ["Lime",0x00FF00], _ ["Chartreuse",0x7FFF00], _ ["LawnGreen",0x7CFC00], _ ["GreenYellow",0xADFF2F], _ ["MediumSpringGreen",0x00FA9A], _ ["SpringGreen",0x00FF7F], _ ["LightGreen",0x90EE90], _ ["PaleGreen",0x98FB98], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ["Olive",0x808000], _ ["DarkOliveGreen",0x556B2F], _ ; new block ["OliveDrab",0x6B8E23], _ ["YellowGreen",0x9ACD32], _ ["DarkSeaGreen",0x8FBC8F], _ ["Teal",0x008080], _ ["DarkCyan",0x008B8B], _ ["LightSeaGreen",0x20B2AA], _ ["DarkTurquoise",0x00CED1], _ ["MediumTurquoise",0x48D1CC], _ ["Turquoise",0x40E0D0], _ ["Aquamarine",0x7FFFD4], _ ["Aqua",0x00FFFF], _ ["Cyan",0x00FFFF], _ ["PaleTurquoise",0xAFEEEE], _ ["LightCyan",0xE0FFFF], _ ["Azure",0xF0FFFF], _ ["AliceBlue",0xF0F8FF], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ["DarkKhaki",0xBDB76B], _ ; new block ["Khaki",0xF0E68C], _ ["PaleGoldenrod",0xEEE8AA], _ ["LemonChiffon",0xFFFACD], _ ["LightGoldenrodYellow",0xFAFAD2], _ ["Cornsilk",0xFFF8DC], _ ["LightYellow",0xFFFFE0], _ ["Beige",0xF5F5DC], _ ["Ivory",0xFFFFF0], _ ["Honeydew",0xF0FFF0], _ ["MintCream",0xF5FFFA], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ["MidnightBlue",0x191970], _ ; new block ["Navy",0x000080], _ ["DarkBlue",0x00008B], _ ["MediumBlue",0x0000CD], _ ["Blue",0x0000FF], _ ["RoyalBlue",0x4169E1], _ ["DodgerBlue",0x1E90FF], _ ["DeepSkyBlue",0x00BFFF], _ ["CornflowerBlue",0x6495ED], _ ["SkyBlue",0x87CEEB], _ ["LightSkyBlue",0x87CEFA], _ ["LightSteelBlue",0xB0C4DE], _ ["DarkSlateBlue",0x483D8B], _ ["SlateBlue",0x6A5ACD], _ ["MediumSlateBlue",0x7B68EE], _ ["SteelBlue",0x4682B4], _ ["CadetBlue",0x5F9EA0], _ ["PowderBlue",0xB0E0E6], _ ["LightBlue",0xADD8E6], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ['',0xF0F0F0], _ ["Indigo",0x4B0082], _ ; new block ["BlueViolet",0x8A2BE2], _ ["MediumPurple",0x9370DB], _ ["DarkViolet",0x9400D3], _ ["DarkOrchid",0x9932CC], _ ["MediumOrchid",0xBA55D3], _ ["Orchid",0xDA70D6], _ ["Purple",0x800080], _ ["DarkMagenta",0x8B008B], _ ["MediumVioletRed",0xC71585], _ ["PaleVioletRed",0xDB7093], _ ["DeepPink",0xFF1493], _ ["HotPink",0xFF69B4], _ ["Fuchsia",0xFF00FF], _ ["Magenta",0xFF00FF], _ ["Violet",0xEE82EE], _ ["Plum",0xDDA0DD], _ ["Thistle",0xD8BFD8], _ ["Lavender",0xE6E6FA], _ ["Pink",0xFFC0CB], _ ["LightPink",0xFFB6C1], _ ["MistyRose",0xFFE4E1], _ ["LavenderBlush",0xFFF0F5], _ ["Black",0x000000], _ ; new block ["DarkSlateGray",0x2F4F4F], _ ["SlateGray",0x708090], _ ["LightSlateGray",0x778899], _ ["DimGray",0x696969], _ ["Gray",0x808080], _ ["DarkGray",0xA9A9A9], _ ["Silver",0xC0C0C0], _ ["LightGray",0xD3D3D3], _ ["Gainsboro",0xDCDCDC], _ ["AntiqueWhite",0xFAEBD7], _ ["Linen",0xFAF0E6], _ ["OldLace",0xFDF5E6], _ ["FloralWhite",0xFFFAF0], _ ["Snow",0xFFFAFA], _ ["GhostWhite",0xF8F8FF], _ ["WhiteSmoke",0xF5F5F5], _ ["White",0xFFFFFF] _ ] Global $aLabel[UBound($aColors)], $w = 185, $x = -$w, $y = -30 Global $hGui = GUICreate('', 1489, 715, @DesktopWidth-1489, 0, 0x80000000) GUISetFont(12, 400, Default, 'Consolas') For $i = 0 To UBound($aColors) -1 $x = Mod($i, 23) = 0 ? ($x+$w+1) : $x $y = Mod($i, 23) = 0 ? 1 : ($y+30+1) $aLabel[$i] = GUICtrlCreateLabel($aColors[$i][0], $x, $y, $w, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE)) _GuiCtrl_SetColorContrast(-1, $aColors[$i][1]) Next _GuiHole($hGui) ; Auskommentieren für sichtbaren Fensterhintergrund GUISetState() Global $gMsg, $IDclick, $aColorClick, $sClip While True $gMsg = GUIGetMsg() Switch $gMsg Case -3 Exit Case $GUI_EVENT_PRIMARYUP, $GUI_EVENT_SECONDARYUP $IDclick = GUIGetCursorInfo($hGui)[4] $aColorClick = _GetColor($IDclick) If $aColorClick[0] <> '' Then $sClip = '$' & $aColorClick[0] & ' = 0x' & Hex($aColorClick[1],6) If $gMsg = $GUI_EVENT_PRIMARYUP Then $sClip = '0x' & Hex($aColorClick[1],6) Exit ClipPut($sClip) EndIf EndSwitch WEnd Func _GetColor($_ID) Local $index = $_ID - $aLabel[0] Local $aRet[] = [$aColors[$index][0],$aColors[$index][1]] Return $aRet EndFunc ; #FUNCTION# ======================================================================================= ; Name ..........: _GuiCtrl_SetColorContrast ; Description ...: Sets the background color for a control and depending on its brightness the ; ...............: appropriate contrast color for the text. ; Parameter(s)...: $_ID The control ID ; ...............: $_BkCol The background color ; ....[optional].: $_ColOnDark The text color if BG is dark (Default: -1, almost white) ; ....[optional].: $_colOnBright The text color if BG is bright (Default: -1, very deep blue) ; Return values .: Success 1 ; ...............: Failure 0 ; Author ........: BugFix ; ================================================================================================== Func _GuiCtrl_SetColorContrast($_ID, $_BkCol, $_ColOnDark=-1, $_colOnBright=-1) $_ColOnDark = $_ColOnDark = -1 ? 0xFAFAFA : $_ColOnDark $_colOnBright = $_colOnBright = -1 ? 0x000088 : $_colOnBright GUICtrlSetBkColor($_ID, $_BkCol) ; get contrast Local $R = BitAND(BitShift($_BkCol, 16), 0xFF) Local $G = BitAND(BitShift($_BkCol, 8), 0xFF) Local $B = BitAND($_BkCol, 0xFF) Local $Brightness = Sqrt($R^2*0.299 + $G^2*0.587 + $B^2*0.114) ;~ Local $iCol = $Brightness < 128 ? $_ColOnDark : $_colOnBright Local $iCol = $Brightness < 140 ? $_ColOnDark : $_colOnBright Return GUICtrlSetColor($_ID, $iCol) EndFunc Func _GuiHole($h_win) Local $combined_rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0) _AddCtrlRegion($combined_rgn, $aLabel) _WinAPI_SetWindowRgn($h_win, $combined_rgn) _WinAPI_DeleteObject($combined_rgn) EndFunc ;==>_GuiHole Func _AddCtrlRegion($full_rgn, $ctrl_id) Local $ctrl_pos, $ctrl_rgn If IsArray($ctrl_id) Then For $i = 0 To UBound($ctrl_id) -1 If GUICtrlRead($ctrl_id[$i]) = '' Then ContinueLoop $ctrl_pos = ControlGetPos($hGui, "", $ctrl_id[$i]) $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3]) _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR) _WinAPI_DeleteObject($ctrl_rgn) Next Else $ctrl_pos = ControlGetPos($hGui, "", $ctrl_id) $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3]) _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR) _WinAPI_DeleteObject($ctrl_rgn) EndIf EndFunc ;==>_AddCtrlRegioncolor_table.PNG color_table_hole.PNG
DL bisher: 15
-
Zu einem ähnlichem Problem von dir (aber Aufgabenstellung: checke und zeige Änderung) hatte ich bereits hier ein Bsp. gepostet. Kannst du doch anpassen.
Übrigens:
NIE Globale Variablen in einer Funktion deklarieren und schon gar nicht immer wieder dieselbe Variable neu deklarieren: 1-mal am Skriptstart deklarieren, danach nur noch Wertzuweisung.
-
bzw. diese Datensätze in 2 Variablen.
Beide in je ein Array splitten - die Arrays haben dann dieselbe Größe.
- In einer Schleife über Array_mit_Zusatz iterieren
- je Item:
- Inhalt bis "firstname" abschneiden
- Item von Array_ohne_Zusatz (hat identischen Index an dieser Position) vor "firstitem" einfügen: $a_m_Zusatz[$i] = $a_o_Zusatz[$i] & "$a_m_Zusatz[$i] ab <firstname>" - das zusätzliche Semikolon dazwischen beachten
-
musste das aber wieder verwerfen, weil dort der Befehl FileRead so verändert wurde, dass man beispielsweise eine Bitmap-Datei nicht mehr einlesen konnte - so wie sie ist. Sie wird in Hex-Zeichen umgewandelt.
Wie sieht denn deiner Meinung nach eine (Bitmap)-Datei aus, so wie sie ist

Meinst du den Schwachsinn, den ein (zum Lesen von Text-Dateien gedachter) Editor ausspuckt, weil dieser krampfhaft versucht eine binäre Datei als Text zu interpretieren?
Kannst du doch haben:
AutoIt: Hier dieselbe Anzeige, wie NPP (aber nicht druckbare Zeichen als Symbole)
Alles anzeigenLocal $p = "C:\Users\BugFix\Pictures\flowers24x24.png" Local $fh = FileOpen($p, 16) ; $FO_BINARY (16) Local $read = BinaryToString(FileRead($fh)) FileClose($fh) ; Datei enthält mit Sicherheit Chr(0)-Werte, die würden als Stringende interpretiert werden - also umwandeln $read = StringReplace($read, Chr(0), '[NULL]') ; Vielleicht möchtest du CR und LF auch als Zeilenumbrüche anzeigen (Edit verlangt normal CRLF): ; dazu alle bereits vorhandenen CR, LF, CRLF in ein Ersatzzeichen umwandeln und dann dieses mit CRLF ersetzen Local $tmp = '%%µµ%%' $read = StringReplace(StringReplace(StringReplace($read, @CRLF, $tmp), @LF, $tmp), @CR, $tmp) $read = StringReplace($read, $tmp, @CRLF) GUICreate('Anzeigen BinaryToString', @DesktopWidth-90, @DesktopHeight-60) GUISetFont(14, 400, Default, 'Courier New') GUICtrlCreateButton('', -10, -10, 1, 1) ; catch focus GUICtrlCreateEdit($read, 10, 10, @DesktopWidth-100, @DesktopHeight-70, BitOR(0x0800,0x0040,0x0080,0x0004,0x00100000,0x00200000)) GUICtrlSetColor(-1, 0x00D02B) GUICtrlSetBkColor(-1, 0x001D45) GUISetState() Do Until GUIGetMsg() = -3Wenn du bestimmte Aufgaben mit FileRead vorhast, ist primär wichtig, die Datei im entsprechenden Modus zu öffnen! Dazu sollte man einfach mal einen Blick auf die Parameterbeschreibungen der Funktion werfen.
Deine obige Aussage zu FileRead ist definitiv falsch.
-
Das heißt ich Exportiere beide Dateien (einmal mit, einmal ohne Zusatzfelder) und hole mir entwerder aus der Datei ohne Zusatzfelder die 3 Ergbebnisse zu jeweiliger Zeile oder versuche die irgendwie anders zusammenzufügen.
ohne Zusatzfeld
"9";"2022-06-23 16:18:07";"1";"de";"1139653681";"XiL38ODU1PR1gGa";"2022-06-23 16:17:50";"2022-06-23 16:18:07";"";"5";"5";"5"
mit Zusatzfeld
"9";"2022-06-23 16:18:07";"1";"de";"1139653681";"XiL38ODU1PR1gGa";"2022-06-23 16:17:50";"2022-06-23 16:18:07";"";"";"";"" .........
sind ja identisch bis (bei mit Zusatzfeld) zum Semikolon vor 'firstname', nur dass die Inhalte leer sind
Ich würde so vorgehen:
- bis zu diesem Semikolon ( #12, Position = StringInStr, occurence=12) in "mit Zusatzfeld" löschen
- gesamten String "ohne Zusatzfeld" an dieser Position einfügen
-
es ist ja möglich das ich zb ESC drücke und er macht die GUI zu und schließt alles.
Das kannst du aber deaktivieren: AutoitSetOption('GUICloseOnESC', 0) ; 0 = ESC sendet kein Event zum Beenden der GUI
Ist das denn auch machbar das ich ESC gedrückt halten muss sagen wir mal 3 sec um alles zu schließen
Würde ich nicht empfehlen. Die einfachere Lösung ist die Nutzung eines an die GUI gebundenen Hotkeys (Accelerator-Key)
AutoIt
Alles anzeigenAutoitSetOption('GUICloseOnESC', 0) Global $hGui = GUICreate('Test') Global $DummyEscExit = GUICtrlCreateDummy() Global $aAccelerators[][] = [['+{ESC}', $DummyEscExit]] ; "SHIFT+ESCAPE" zum Beenden GUISetAccelerators($aAccelerators) GUISetState() While True Switch GUIGetMsg() Case -3, $DummyEscExit Exit EndSwitch WEnd -
die Spalten sind in einen SRP System
Und wie kommst du zu den Werten? Copy & Paste, Export in Datei?
ich möchte halt nicht jede Zahl in den code eingeben
Darum brauchst du die Daten in einem Array, das du dann durchläufst.
Übrigens solltest du dir nicht jede Info aus der Nase ziehen lassen. Wir helfen gerne, aber dazu brauchen wir natürlich alle relevanten Informationen.
Deine nächsten Schritte:
- aus meinem Code eine Funktion erstellen
- deine SRP-Daten in ein Array überführen
- Array durchlaufen
Bei Fragen melden, aber bitte mit nachvollziehbaren Daten, also z.B. dein Skript und ein Satz Testdaten.
-
Also ich habe 3 Spalten
- in einem Array ? oder
- in einer Textdatei / csv-Datei oder
- bereits in ein Listview eingefügt ?
das die Zahlen entweder in diesen Bereich liegen oder außerhalb
Es muss jede Zahl nacheinander geprüft werden, ob sie die Bedingung (z.B. >=1 UND <= 299) erfüllt.
Also meinen Code von oben in eine Funktion packen und nacheinander jede Zahl aus deinen Spalten an diese Funktion übergeben.
Wenn du die Daten in einer Datei vorliegen hast, solltest du diese in ein Array einlesen und darin durch die Spalten iterieren.
-
$iSearch = 1-299 eingeben also er soll halt die Zahlen scannen die im Min und Max. wert
Du musst dich etwas genauer ausdrücken.
- was hast du als Ausgangswert(e)
- was soll das Ergebnis sein
Was soll denn mit den Zahlen zwischen 1-299 passieren? Oder womit willst du diese Vergleichen? Momentan verstehe ich noch nicht, was du möchtest.
-
Die einfachste Lösung:
AutoItGlobal $iMin = 1 Global $iMax = 299 Global $iSearch = 13 If ($iSearch >= $iMin) And ($iSearch <= $iMax) Then ConsoleWrite('Zahl ist im Bereich' & @CRLF) Else ConsoleWrite('Zahl liegt ausserhalb des Bereichs' & @CRLF) EndIfWenn du die Prüfung mehrfach ausführen möchtest, solltest du dieses innerhalb einer Funktion lösen, der du übergibst: Prüfwert, Minwert, Maxwert und die dir True oder False zurückgibt.
-
okay, dann hatte ich wohl gedacht er aktualisiert das automatisch wenn ich AdlibRegister nehme, war wohl ein Denkfehler,


Natürlich macht AdlibRegister das, das ist doch der Sinn des Registrierens einer Funktion für ein Zeitintervall.
Ich habe das hier mal als Bsp. umgesetzt:
AutoIt
Alles anzeigen#include <StaticConstants.au3> #include <GUIConstantsEx.au3> OnAutoItExitRegister(_Exit) Global $Drive2Check = 'C:\' ; zu überprüfendes Laufwerk Global Enum $VeryGood, $Good, $Critical ; Speicherstatus Global $aStatus[] = [0,60,85] ; % für Status-Stufen (0-59, 60-84, ab 85) Global $hGui = GUICreate('Check Space [' & StringTrimRight($Drive2Check, 1) & ']', 270, 70, @DesktopWidth-280, 10) Global $cbOntop = GUICtrlCreateCheckbox(' GUI jetzt minimieren - Einblenden bei neuer Stufe', 10, 10, 250) Global $lbSpace = GUICtrlCreateLabel(' ', 10, 40, 250, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE)) _Testspace() ; erstmaliger Aufruf zur Anzeige beim Start GUISetState() AdlibRegister(_Testspace, 5000) While True Switch GUIGetMsg() Case -3 Exit Case $cbOntop GUISetState(@SW_MINIMIZE) Case $GUI_EVENT_RESTORE GUICtrlSetState($cbOntop, $GUI_UNCHECKED) EndSwitch WEnd Func _Exit() Exit EndFunc Func _Testspace() Local Const $aColor[][2] = [[0x00FF7F,0x000088],[0xFFFF00,0x000088],[0xFF0000,0xFAFAFA]] ; Status-Color [BG,Text] Local $totalMB = DriveSpaceTotal($Drive2Check) Local $freeMB = DriveSpaceFree($Drive2Check) Local $Percent = Floor(($freeMB / $totalMB) * 100) Local Static $lastValue = 0 Local Static $lastStatus = -1 Local $Status If $lastValue = $Percent Then Return ; keine Veränderung zur letzten Prüfung $lastValue = $Percent GUICtrlSetData($lbSpace, $Percent & '% [' & _FormatByte($freeMB*1024*1024, '', False, 2) & ' frei]') If $lastStatus <> $Status Then ; Farbe nur setzen bei geändertem Status Select Case $Percent < $aStatus[$Good] $Status = $VeryGood Case $Percent < $aStatus[$Critical] $Status = $Good Case Else $Status = $Critical EndSelect GUICtrlSetColor($lbSpace, $aColor[$Status][1]) GUICtrlSetBkColor($lbSpace, $aColor[$Status][0]) If BitAND(GUICtrlRead($cbOntop), $GUI_CHECKED) Then GUISetState(@SW_SHOW) GUICtrlSetState($cbOntop, $GUI_UNCHECKED) EndIf $lastStatus = $Status EndIf EndFunc ; #FUNCTION# ==================================================================================================================== ; Name ..........: _FormatByte ; Description ...: Formats a given value of bytes with highest or given unit, optional as structure with all units ; Parameters ....: $_iByte The value of bytes to format ; ...............: $_sUnit (Default = '', unit of highest value) or count of given unit (TB, GB, MB, KB, Byte) ; ...............: $_fStruct Returns a structure with .TB .GB .MB .KB .Byte (Default = False) ; ...............: $_sDigit Number of decimal digits (Default = '3') as string! ; Return values .: The formatted string or the structure. ; Author ........: BugFix ; =============================================================================================================================== Func _FormatByte($_iByte, $_sUnit='', $_fStruct=False, $_sDigit='3') Local Static $aByte[5][2] = [[0x10000000000],[0x40000000],[0x100000],[0x400],[0x1]] Local Static $tBytes = DllStructCreate('int TB;int GB;int MB;int KB;int Byte;') Local Static $aUnit[5] = ['TB','GB','MB','KB','Byte'] Local $iModulo = $_iByte, $iHighest = 4 For $i = 0 To 3 $aByte[$i][1] = $iModulo >= $aByte[$i][0] ? Floor($iModulo/$aByte[$i][0]) : 0 $iModulo = $aByte[$i][1] > 0 ? Mod($iModulo,$aByte[$i][0]) : $iModulo $iHighest = $aByte[$i][1] > 0 ? ($i < $iHighest ? $i : $iHighest) : $iHighest Next $aByte[4][1] = $iModulo If $_fStruct Then $tBytes.TB = $aByte[0][1] $tBytes.GB = $aByte[1][1] $tBytes.MB = $aByte[2][1] $tBytes.KB = $aByte[3][1] $tBytes.Byte = $aByte[4][1] Return $tBytes EndIf $_sUnit = StringInStr('TB GB MB KB Byte', $_sUnit) ? $_sUnit : '' $_sUnit = $_sUnit = '' ? $aUnit[$iHighest] : $_sUnit Local $iUserUnit = Floor(StringInStr('TB GB MB KB Byte', $_sUnit)/3) If Number($_sDigit) < 0 Then $_sDigit = '0' Local $sFormat = '%.' & $_sDigit & 'f %s' Return StringFormat($sFormat, $_iByte/$aByte[$iUserUnit][0], $aUnit[$iUserUnit]) EndFunc ;==>_FormatByte -
PS: das letzte Input feld unten wenn dort was drin steht läuft er nur noch und Stopt nicht wenn die zeit abgelaufen ist (Aufnaheme 5)
Ja, die Abfrage in _StopTimer war nicht korrekt.
AutoIt
Alles anzeigen#include <GUIConstantsEx.au3> Global Const $sWinOBS = "OBS 26.1.1 (64-bit, windows) - Profil: Unbenannt - Szenen: Unbenannt" Global $bIdle = True ; True = Leerlauf, keine Aufnahme läuft Global $TimerStart ; wird gesetzt wenn eine Aufnahme beginnt Global $aRecTimes[5] ; die eingetragenen Aufnahmezeiten in Sekunden Global $aCheckbox[4] ; Array mit Checkbox-ID Global $iCurrRec = -1 ; Index der aktuellen Aufnahme, bei Programmstart: keiner Global $aGroupTitle[] = ['Stunden','Minuten','Sekunden'] Global $aInput[5][3] Global $button[2]=['Start','Stop'] Global $hGui = GUICreate('5 Aufnahme-Timer', 800, 700, Default, Default, 0x10C80000) For $i=0 To 2 GUICtrlCreateGroup($aGroupTitle[$i], 5+70*$i, 5, 70, 40) For $j = 0 To 4 If $j > 0 Then GUICtrlCreateGroup('', 5+70*$i, 5+$j*30, 70, 40) $aInput[$j][$i] = GUICtrlCreateInput('', 10+70*$i, 20+30*$j, 60, 20, 1) Next Next $go = GUICtrlCreateButton('Start', 550, 650, 210, 20) $Herunterfahren = GUICtrlCreateCheckbox("Computer herunterfahren", 600, 600, 201, 25) For $i = 0 To 3 $aCheckbox[$i] = GUICtrlCreateCheckbox("Aufnahme " & $i+2 & " Aktivieren", 220, 47+$i*30, 201, 25) Next $Close = GUICtrlCreateButton("Schließen", 550, 550, 83, 25) $Label2 = GUICtrlCreateLabel("Programm Start mit Hotkey F7", 500, 500, 170, 24) GUICtrlSetFont(-1, 6, 800, 0, "MS Sans Serif") GUISetState() ; MainLoop While True Switch GUIGetMsg() Case -3 Exit Case $go If $bIdle Then StartTimer() Else StopTimer() ; zum Abbruch einer laufenden Aufnahme EndIf EndSwitch If Not $bIdle Then If _CheckTimer() Then StopTimer() EndIf WEnd Func _CalcRecordingSeconds() Local $inHr, $inMin, $inSec, $sumSec = 0 For $i = 0 To 4 $sumSec = 0 If $i > 0 Then If BitAND(GUICtrlRead($aCheckbox[$i-1]), $GUI_UNCHECKED) Then ContinueLoop EndIf $inHr = GUICtrlRead($aInput[$i][0]) $inMin = GUICtrlRead($aInput[$i][1]) $inSec = GUICtrlRead($aInput[$i][2]) If $inHr <> '' Then $sumSec += $inHr*60*60 If $inMin <> '' Then $sumSec += $inMin*60 If $inSec <> '' Then $sumSec += $inSec $aRecTimes[$i] = $sumSec Next EndFunc HotKeySet ("{F7}", '_ToggleStartStop') Func _ToggleStartStop() Return ($bIdle ? StartTimer() : StopTimer()) EndFunc Func StartTimer() If $iCurrRec = -1 Then ; erstmaliger Aufruf _CalcRecordingSeconds() EndIf While $iCurrRec < UBound($aRecTimes) -1 $iCurrRec += 1 If $aRecTimes[$iCurrRec] <> 0 Then ExitLoop ; leere Einträge überspringen WEnd If $aRecTimes[$iCurrRec] = 0 Then Return MsgBox(16, 'FEHLER', 'Keine Aufnahmezeiten eingetragen!') MsgBox(64, 'Aufnahme', 'Starte Aufnahme #' & $iCurrRec+1) GUICtrlSetData($go, 'Stop') $TimerStart = TimerInit() $bIdle = False ; starte Aufnahme ControlSend($sWinOBS, "", "", "{F8}") EndFunc Func _CheckTimer() Return (Floor(TimerDiff($TimerStart)/1000) >= $aRecTimes[$iCurrRec]) EndFunc Func StopTimer() $bIdle = True ; beende Aufnahme ControlSend($sWinOBS, "", "", "{F8}") MsgBox(64, 'Aufnahme', 'Stoppe Aufnahme #' & $iCurrRec+1) GUICtrlSetData($go, 'Start') If $iCurrRec = UBound($aRecTimes) -1 Then ; letzte Aufnahme beendet If BitAND(GUICtrlRead($Herunterfahren), $GUI_CHECKED) Then Return MsgBox(64, 'Herunterfahren', 'Hier [#' & @ScriptLineNumber & '] Shutdown einfügen.') EndIf EndIf EndFunc -
Ich verwende bei meiner Arbeit eine ASCII-Schnittstelle. Deren (sich ab und an ändernde) Definition habe ich in einer eigenen Konfigurationsdatei gespeichert.
Der Aufbau ähnelt einer INI, aber auch einer CSV. Ich habe hier die für mich wichtigen Funktionalitäten beider Typen zusammengeführt.
Eventuell auch für euch nützlich.
Aufbau der Konfigurationsdatei:
- Dateiendung - beliebig
- Die Gliederung in Sektionen ist zwingend. Sektionsnamen sind case sensitiv: [Section] <> [section]
- Jede Zeile enthält einen Eintrag
- Besteht der Eintrag aus mehreren Werten, sind diese ausschliesslich mit ";" zu trennen
- Enthält ein Wert ein ";", ist dieses zu maskieren: "\;"
- Kommentarzeilen beginnen mit "REM " - Großschreibung zwingend!
- Leerzeilen können beliebig eingefügt sein und werden ignoriert
Da in die Datei keine Werte zurückgeschrieben werden (jedenfalls für mich nicht relevant), habe ich mich vorerst auf eine Funktion zum Einlesen und Weiterverarbeiten (durch Übergabe einer Verarbeitungsfunktion) beschränkt.
AutoIt: Funktionsparameter:
Alles anzeigen$_File Dateipfad $_Section Sektionsname $_aReturn (ByRef) Variable zur Aufnahme des Ergebnisarrays $_Ubound2 (optional) Wenn die Zeile in Einzelwerte gesplittet werden soll, deren Anzahl. Der Wert darf kleiner sein, als die Anzahl der tatsächlich vorhandenen Splitwerte. Zeilen mit weniger Einzelwerten werden jedoch ignoriert. (Standard: 0 - Die gesamte Zeile als ein Array-Eintrag. Maskierte Trenner werden mit Maskierung angezeigt. $_funcProgress (optional) Jede Zeile wird an diese Funktion zur Weiterverarbeitung übergeben. (Standard: Null) Die Funktion darf nur einen Parameter besitzen: "Zeile" ( _MyFunc($line) ) Soll die Zeile ignoriert werden, muss die Funktion "" zurück geben. Bei $_Ubound2 = 0 --> Die Funktion muss einen String zurück geben Bei $_Ubound2 > 0 --> Die Funktion muss ein 1D-Array zurück geben, [0]..[$_Ubound2 -1], KEIN Zähler an [0]! Beachten: Wenn der Text maskierte Trenner enthält, muss die Funktion dieses beim Splitten berücksichtigenIm Anhang findet ihr ein Beispiel mit Konfigurationsdatei.
AutoIt: ConfigRead.au3
Alles anzeigen;-- TIME_STAMP 2022-07-14 10:16:45 v 0.1 ; #FUNCTION# ======================================================================================= ; Name ..........: _ConfigRead ; Description ...: Reading a configuration file, optionally filtered ; ...............: File rules: • Can have any file extension ; ...............: • Requires sections, spelling case sensitive: [Section] <> [section] ; ...............: • If the entries contain values that are to be split into ; ...............: individual fields, use only ";" as the separator. ; ...............: Separators in the text must be masked: "\;" ; ...............: • Comments start with "REM " at the beginning of the line ; ...............: • Blank lines may be included and will be ignored ; Parameter(s)...: $_File The file path ; ...............: $_Section The section name ; ...............: $_aReturn (ByRef) The variable to get the result array ; ....[optional].: $_Ubound2 If the lines are to be split into single values whose number is ; ...............: (Default: 0 - full line as one array item, masked separators are displayed with masking) ; ....[optional].: $_funcProgress Each line is passed to this function for evaluation. (Default: Null) ; ...............: Use only one parameter in your function: "line" ( _MyFunc($line) ) ; ...............: Return "" from your function if the line should be ignored. ; ...............: If $_Ubound2 = 0 --> return a string. ; ...............: If $_Ubound2 > 0 --> return a 1D-array, [0]..[$_Ubound2 -1], NO counter at [0]! ; ...............: Note: ; ...............: If your text contains masked delimiters, your function must take this into account when splitting. ; Return values .: Success 1 ; ...............: Failure 0 @error = 1 Section not exists or empty ; Author ........: BugFix ; ================================================================================================== Func _ConfigRead($_File, $_Section, ByRef $_aReturn, $_Ubound2=0, $_funcProgress=Null) Local $aSection[100], $n = 0 If $_Ubound2 > 0 Then ReDim $aSection[100][$_Ubound2] Local $funcRet, $line, $aLine, $bInSection = False Local $fh = FileOpen($_File) Do $line = FileReadLine($fh) If Not @error Then ; check if the result array has to be enlarged If $n > UBound($aSection) -1 Then If $_Ubound2 > 0 Then ReDim $aSection[UBound($aSection)+100][$_Ubound2] Else ReDim $aSection[UBound($aSection)+100] EndIf EndIf ; comment line --> skip If StringRegExp($line, '^REM\s') Then ContinueLoop ; empty line --> skip If $line = '' Then ContinueLoop ; while reading target section a new section starts --> stop reading If $bInSection And StringRegExp($line, '^\[[^\]]+') Then $bInSection = False ExitLoop EndIf ; target section starts If StringRegExp($line, '^\[' & $_Section & '\]') Then $bInSection = True ContinueLoop EndIf ; while reading target section If $bInSection Then If $_Ubound2 = 0 Then ; output: 1D-array (one line per item) If $_funcProgress <> Null Then $funcRet = $_funcProgress($line); call external funtion to evaluate the line If $funcRet <> '' Then ; func returns empty string to skip the line $aSection[$n] = $funcRet $n += 1 EndIf Else $aSection[$n] = $line ; add each line to result array $n += 1 EndIf Else ; output: 2D-array, 2nd dimension according to $_Ubound2 If $_funcProgress <> Null Then $funcRet = $_funcProgress($line); call external funtion to evaluate the line If $funcRet <> '' Then ; func returns empty string to skip the line ... If IsArray($funcRet) And UBound($funcRet) >= $_Ubound2 Then ; ... otherwise an array with ubound >= $_Ubound2 must be returned For $i = 0 To $_Ubound2 -1 $aSection[$n][$i] = $funcRet[$i] Next $n += 1 EndIf EndIf Else $aLine = StringRegExp($line, '(\\;[^;]+|[^;]+\\;[^;]+|[^;]+\\;|[^;]+)', 3) ; splits the line by ";", masked delimiters ("\;") are ignored If UBound($aLine) >= $_Ubound2 Then ; line is ignored if the number of elements is less than $_Ubound2 For $i = 0 To $_Ubound2 -1 $aSection[$n][$i] = StringReplace($aLine[$i], '\;', ';') Next $n += 1 EndIf EndIf EndIf EndIf Else ; EOF reached ExitLoop EndIf Until $line = -1 FileClose($fh) If $n = 0 Then Return SetError(1,0,0) If $_Ubound2 > 0 Then ReDim $aSection[$n][$_Ubound2] Else ReDim $aSection[$n] EndIf $_aReturn = $aSection Return 1 EndFuncAutoIt: Beispiel
Alles anzeigen;-- TIME_STAMP 2022-07-14 10:22:06 #include 'ConfigRead.au3' #include <Array.au3> Global $CFG = @ScriptDir & '\ASCII_Interface.txt' Global $aRes MsgBox(0, 'CFG Read', 'Lesen in 1D-Array' & @CRLF & 'Jede Zeile ein Eintrag') _ConfigRead($CFG, 'Firmensatz', $aRes) _ArrayDisplay($aRes, '1D-Array') MsgBox(0, 'CFG Read', 'Lesen in 2D-Array' & @CRLF & '4 Spalten') _ConfigRead($CFG, 'Kopfsatz', $aRes, 4) _ArrayDisplay($aRes, '2D-Array') MsgBox(0, 'CFG Read', 'Lesen in 2D-Array' & @CRLF & '4 Spalten mit Filterfunktion' & @CRLF & 'Nur nummerische Definitionen') _ConfigRead($CFG, 'Positionssatz', $aRes, 4, _NumDef) _ArrayDisplay($aRes, '2D-Array mit Filter: Nur nummerische Definitionen anzeigen') Func _NumDef($_line) If StringRegExp($_line, ';N\d+') Then Return StringSplit($_line, ';', 2) Else Return '' EndIf EndFunc -
Ich würde anders herangehen:
- am Programmstart die Desktopgröße abfragen
- meiner Kategorie zuordnen - im folgenden CAT
- alle verwendeten Koordinaten und Größen für jede GUI, jedes Ctrl in einem Array hinterlegen
für Ctrl z.B.: [[Ctrl-ID][CAT][x,y,w,h]]
Ist am Anfang sicher ordentlich Aufwand, aber beim Erstellen von je 4 Skripten hast du den auch.
