Stell Dir mal vor das Script bricht gerade ab wenn Blockinput auf 1 steht. xD
Was soll denn daran abbrechen?
Stell Dir mal vor das Script bricht gerade ab wenn Blockinput auf 1 steht. xD
Was soll denn daran abbrechen?
Du Fuchs Du! Da hast Du recht - habe ich nicht bedacht - aber Du musst zugeben, dass die Wahrscheinlichkeit gegen 0 geht. Und selbst wenn es passieren sollte sind die Wahrscheinlichkeit, dass es eine größere Auswirkung hat als "Scheiße, falsche Zeile!" auch eher gering. xD
Wie wärs denn mit BlockInput(1), Mouse Position merken, bewegen, zurückbewegen, BlockInput(0)?
Ich dachte mir - selbst wenn jemand gerade irgendo in einem Text ist, wird das Script vermutlich so schnell hin und herschalten
Und wenn du am Ende des Dokumentes bist?
Das Programm braucht Adminrechte, und ich schätze du hast UAC deaktiviert und dein Skript läuft ohne Adminrechte. Versuchs mal mit #RequireAdmin.
Nachdem ich lange experimentiert habe, ist mir jetzt die Lösung eingefallen:
GUICtrlSetState($iCheckbox,1)
Verwende lieber die vordefinierten Konstanten ($GUI_CHECKED), da dein Script vielleicht in zukünftigen Versionen nicht mehr das selbe Verhalten aufweisen wird wenn du direkt die Zahl reinschreibst.
Erstelle im globalen Scope eine While-Schleife wo du eine bestimmte Bedingung prüfst ($bRunning) und dann setzt du mit Klicks auf Buttons einfach die Variable.
Etwa so:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $bRunning = False
Global $iCounter = 0
Opt("GUIOnEventMode", 1)
Global $hGUI = GUICreate("", 316, 143)
GUISetOnEvent($GUI_EVENT_CLOSE, ExitApp)
Global $hToggleCounting = GUICtrlCreateButton("Start Counting", 32, 88, 251, 25)
GUICtrlSetOnEvent(-1, ToggleCounting)
Global $hCounter = GUICtrlCreateLabel("0", 8, 16, 299, 50, $SS_CENTER)
GUICtrlSetFont(-1, 30, 400, 0, "MS Sans Serif")
GUISetState(@SW_SHOW)
While Sleep(10)
While $bRunning
$iCounter += 1
GUICtrlSetData($hCounter, $iCounter)
Sleep(100)
WEnd
WEnd
Func ToggleCounting()
$bRunning = Not $bRunning
GUICtrlSetData($hToggleCounting, ($bRunning ? "Stop" : "Start") & " Counting")
EndFunc
Func ExitApp()
Exit
EndFunc
Alles anzeigen
Das sollte auch nicht überraschen, da GuiGetMsg() die Klicks auf der GUI abfragt und du diese Funktion nicht mehr ausführst.
Ich rate dir dringend zum OnEventModus, dann hast du das Problem nicht mehr. Solltest aber aufpassen, dass du dabei nicht eine Funktion mehrfach betrittst und in While-Schleifen stecken bleibst.
Die Hilfe beschreibt beide Modi ganz gut, lies dich da einfach mal durch: https://www.autoitscript.com/autoit3/docs/g…OnEventMode.htm
Alles anzeigenOk, 1:0 für dich.
Aber in VBA brauche ich für mein Sache mit den Großbuchstaben trotzdem nur eine Zeile Code.
z.B. so:
Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)TextBox3.Value = UCase(TextBox3.Value)
End Sub ===> für Eingaben die per Strg.+V reinkommen
UND
Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = Asc(UCase$(Chr$(KeyAscii)))
KeyAscii = keycheck(KeyAscii)
End Sub ===> für normale Tastatureingaben mit Check auf erlaubte Zeichen
Du kannst das in AutoIt auch eventbasiert lösen, aber AutoIt bietet halt nicht diese komfortable Eventregistrierung wie vba/.NET und co.
Zudem reagiert es auch nur auf druck der Entertaste dabei, aber ansonsten ist es das selbe wie in vba.
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Global $hGui = GUICreate('Test')
GUISetOnEvent($GUI_EVENT_CLOSE, ExitApp)
Global $cInput = GUICtrlCreateInput('', 20, 20, 150, 20)
GUICtrlSetOnEvent(-1, Uppercase)
GUISetState()
While Sleep(10)
WEnd
Func ExitApp()
Exit
EndFunc
Func Uppercase()
GUICtrlSetData($cInput, StringUpper(GUICtrlRead($cInput)))
EndFunc
Alles anzeigen
ACHTUNG : Die Software enthält lt. Chip Adware !
Die ist sauberer als es die Redaktion von Chip jemals sein wird. Verlink doch bitte direkt zur Homepage, da kannst du zwischen Installer, portable etc. wählen ohne CHIP-Installer oder klick auf "Manuellen Download".
Ansich finde ich VSCode ne ziemlich feine Sache, aber was mich extrem ankotzt ist dieses zwanghafte Reinpressen von Webentwicklung in Desktopumgebungen.
Wieso muss es denn unbedingt Electron sein? Gibt es denn im Desktopbereich kein vernünftiges Framework (WPF/.NET Core) um sowas zu realisieren? Wäre sogar um einiges sparsamer mit den Ressourcen.
Die Settings in json-Form sind auch ziemlich gewöhnungsbedürftig und das Teil hat eine sehr steile Lernkurve.
Für mich nichts ganzes, und nichts halbes, deshalb nutze ich es persönlich nicht.
Für meine C# Projekte nutz ich Visual Studio 2019, und für AutoIt nach wie vor SciTE.
Ich hab mich versucht da irgendwie reinzufuchsen, aber es wollte irgendwie nicht.
Und ob Handle oder ID verlangt wird, ist jeder Funktionsbeschreibung zu entnehmen, von der ich ausgehe, dass der Anwender sie liest.
Die Doku ist da aber nicht 100%ig korrekt, die Fehler ziehen sich weiter durch.
RE: Sammelthread "AutoIt Interne Funktionen : Erwartetes Ergebnis -> Tatsächliches Ergebnis"
Nun, die Funktion _GUICtrlTreeView_AddChild ist, höflich formuliert, nicht unbedingt sinnvoll. Ich habe mir angewöhnt, TreeViewItem ausschliesslich mit ID = GUICtrlCreateTreeViewItem zu erstellen.
Achtung, das kann ganz schnell nach hinten losgehen. Einige Funktionen der TreeView-UDF unterscheiden nicht zwischen AutoIt-Handle (GUICtrlCreateTreeViewItem) und Windows-Handle (_GUICtrlTreeView_Create).
Wenn eine Funktion nicht korrekt arbeiten sollte, dann immer einen Blick mit Strg+J in die Funktion werfen und selber verifizieren. Wenn das Handle gebraucht wird dann auch das Handle mit GUICtrlGetHandle($id...) übergeben.
Ich machs diesma kurz: Bin drüber gestolpert und wollte es nachbauen!
Conway's Game Of Life ist ähnlich, aber hier sieht man schön den zeitlichen Verlauf auf der Y-Achse.
Bisschen was zu lesen:
https://en.wikipedia.org/wiki/Rule_110
https://en.wikipedia.org/wiki/Elementary_cellular_automaton
https://de.wikipedia.org/wiki/Zellul%C3%A4rer_Automat
Wie funktioniert das ganze?
Man sucht sich eine Zahl aus, die als Regel dienen soll, dabei gibt die Binärrepräsentation der Zahl den Zustand einer Zelle im nächsten Zeitpunkt an.
Beispiel 110 (kopiert vom ersten Wikipedia Artikel!):
| Current Pattern | 111 | 110 | 101 | 100 | 011 | 010 | 001 | 000 |
| New state for center cell | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
Dabei stellen die Bits im "Current Pattern" die Zelle links, die selbe Zelle und die Zelle rechts im Zeitpunkt davor dar.
Der neue Zustand ist die Binärrepresentation von 110d = 01101110b gestreckt auf die entsprechenden Patterns.
Anschließend muss man nur noch die erste Reihe angeben von der die restlichen Generationen entstehen sollen.
Der Bereich ist im Skript markiert, entweder kann man hier einfach nur einen Pixel 1 setzen oder man lässt sich was kreatives einfallen
Alle x Pixel, oder ein Muster, ganz links, ganz rechts.
Für den Anfang ist es in der Mitte platziert um es nicht bei einem 'schlechten' Pattern etwas zu verpassen.
Vielleicht etwas träge auf langsameren Systemen, und da ist bestimmt noch ordentlich Performance drin, insbesondere mit bisschen ASM-Magie, wer mag kann sich gerne austoben.
Wie sieht das ganze dann aus?
Ein paar interessante Patterns hab ich im Skript aufgeschrieben. Viel Spaß! ![]()
Du hast immer noch das exakte Problem wie zuvor. Wenn du vor hast mehr Skripte in AutoIt zu basteln rate ich dir dringend die Grundlagen anzueignen, da das Skript, so wie es gebastelt ist, extrem schlechter Codestil ist und es mit der Zeit nicht besser wird.
Der Scope (Gültigkeitsbereich) deiner Variable ist 'falsch'. Der Grund warum es "mal funktioniert" und nach wenigen Minuten nicht mehr ist der, dass die Funktion mit der WinMove Zeile und $width aufgerufen wird.
$width ist aber nirgends in einem Scope deklariert der aus 'AjustarJanela' erreichbar ist.
Um es kurzzufassen:
Nun kriege ich aber den Fehler
Wie sollen wir den Fehler den reproduzieren können wenn du uns ein Skript schickst das bereits von Haus aus nicht lauffähig ist? Damit meine ich nicht deine $groupID-Zeile sondern fehlende Includes.
Deine RegEx-Zeile ist syntaxfehlerfrei, d.h. der Syntaxchecker findet irgendwo vorher einen Fehler der sich durch falsche Annahmen (um weitere Fehler korrekt zu erkennen) wohl durchzieht.
Wie kann ich das selber programmieren?
Du musst einfach nur ein Bitfeld erstellen und die Werte dort abspeichern. Und die Position im Bitfeld spiegelt dann wieder welche Option angewählt ist.
Local $bLaufwerk = True ; 1
Local $bPfad = True ; 1
Local $bDateiname = True ; 1
Local $bDateiendung = False ; 0
Local $aDatei[4] = [ "C:\", "Ordner1\Unterordner1\", "Datei", ".exe" ]
#cs
Bitfield 4 Bits = d c b a (a = Least Significant Bit)
(1) a = Laufwerk anzeigen
(2) b = Pfad anzeigen
(4) c = Dateiname anzeigen
(8) d = Dateiendung anzeigen
#ce
;Baue Bitfeld auf
Local $bitfield = BitOr( _
BitShift($bLaufwerk, -3), _
BitShift($bPfad, -2), _
BitShift($bDateiname, -1), _
$bDateiendung _
)
MsgBox(0, 0, DisplayInfo($aDatei, $bitfield))
Func DisplayInfo($aFile, $bitfield)
Local $sString = ""
;Prüfen ob die Bits im Feld entsprechend gesetzt sind
If BitAND($bitfield, BitShift(1, -3)) Then $sString &= $aFile[0]
If BitAND($bitfield, BitShift(1, -2)) Then $sString &= $aFile[1]
If BitAND($bitfield, BitShift(1, -1)) Then $sString &= $aFile[2]
If BitAND($bitfield, 1) Then $sString &= $aFile[3]
Return $sString
EndFunc
Alles anzeigen
Output ist bei mir ebenfalls 17.
Habe übrigens den selben Fehler wie UEZ.
Du hast einfach nur ein Brett vorm Kopf, so eine Darstellung hat schon viele irritiert. Hier mal ein kleiner Sketch damit du dir das einfacher Visualisieren kannst: