Hast du das Finder-Tool auf das Textfeld gehalten oder nur auf das Fenster?
Wenn du auf das Textfeld hältst könntest du genauere Daten zum Identifizieren bekommen und den Text mit ControlGetText direkt auslesen.
Hast du das Finder-Tool auf das Textfeld gehalten oder nur auf das Fenster?
Wenn du auf das Textfeld hältst könntest du genauere Daten zum Identifizieren bekommen und den Text mit ControlGetText direkt auslesen.
Du musst uns dann auch die Summary mal posten, wir wissen nicht wo der Wert genau auftaucht.
Wird er angezeigt wenn du auf das Control hältst oder nur auf das Fenster...
Ich hab dir mal ne PN geschrieben (u.a. wegen anderen Sachen).
Wegen der Giftcard (so stehts auch in der PN):
Du kannst mir gerne einen 10er Steamguthaben mitbringen oder an das Forum spenden per PayPal, oder keins von beiden.
Immerhin helfen wir hier ehrenamtlich und wenn du nach dem Thread schlauer bist, sind wir auch zufrieden ![]()
Kann ich mich irgendwie für deine Hilfe erkenntlich zeigen?
Was schwebt dir denn vor?
Der Grund warum dein Skript keine Fehler schmeißt und du deine fehlerhafte Logik direkt sehen würdest ist, dass du alle Variablen vorher deklarierst.
Das ist ja auch in Ordnung aber dann musst du schärfer hingucken.
Du versuchst deine GUIs so anzuzeigen, und das ist falsch.
Du darfst GUI-Defintionen gerne in Funktionen schieben, das ist kein Problem aber dann sollte die Funktion nicht-blockierend sein, da ansonsten in der Funktion auf GUI-Nachrichte gewartet wird.
Sind deine anderen GUIs noch nicht initialisiert bringt dir ein GUISetState auch nichts.
Global $hG1, $hG2, $hButton
G1()
G2()
Func G1()
$hG1 = GUICreate("GUI1")
$hButton = GUICtrlCreateButton("Zeige GUI2", 20, 20)
GUISetState(@SW_SHOW, $hG1)
While Sleep(10)
Switch GUIGetMsg()
Case -3
Exit 0
Case $hButton
GUISetState($hG2, @SW_SHOW)
EndSwitch
WEnd
EndFunc
Func G2()
$hG2 = GUICreate("GUI2")
GUISetState(@SW_HIDE, $hG2)
While GUIGetMsg() <> -3
WEnd
EndFunc
Alles anzeigen
Der richtige Weg ist es die GUIs zu erzeugen, sie zu verstecken ohne Eingaben zu verwerten und dann erst sie anzuzeigen bzw. zu verstecken:
Global $hG1, $hG2, $hButton, $hButton2
;Initalisiere GUIs, blockiere nicht
G1()
G2()
GUISetState(@SW_SHOW, $hG1)
While Sleep(10)
Switch GUIGetMsg()
Case -3
Exit
Case $hButton
MsgBox(64, "Button", "Es wurde $hButton auf der GUI1 gedrückt." & @CRLF & "GUI1 wird nun versteckt und GUI2 wird angezeigt.")
GUISetState(@SW_HIDE, $hG1)
GUISetState(@SW_SHOW, $hG2)
Case $hButton2
MsgBox(64, "Button", "Es wurde $hButton2 auf der GUI2 gedrückt." & @CRLF & "GUI2 wird nun versteckt und GUI2 wird angezeigt.")
GUISetState(@SW_HIDE, $hG2)
GUISetState(@SW_SHOW, $hG1)
EndSwitch
WEnd
Func G1()
$hG1 = GUICreate("GUI1")
$hButton = GUICtrlCreateButton("Zeige GUI2", 20, 20)
;Keine Msg-Schleife
EndFunc
Func G2()
$hG2 = GUICreate("GUI2")
$hButton2 = GUICtrlCreateButton("Zeige GUI1", 20, 20)
;Keine Msg-Schleife
EndFunc
Alles anzeigen
Die elegantere Variante wäre es GUIOnEventMode zu verwenden, dann fallen die Msg-Schleifen komplett weg.
Das liegt ganz einfach daran, dass du deine GUIs in den Funktionen erzeugst und in den Funktionen wegen der Msg-Schleife auch wartest.
Erzeuge vorher alle GUIs und verstecke sie ohne irgendwelche GUI-Nachrichten zu lesen.
Nachdem du alle erzeugst hast kannst du anfangen eine Msg-Schleife zu bauen (oder auf Events zu warten wenn du OnEventMode verwendest).
Du solltest die Stringliterale "" um den String nicht vergessen, sonst weiß AutoIt nicht um was für einen Datentyp es sich handelt.
@ScriptDir beinhaltet schon den absoluten Pfad bis zum Skriptverzeichnis.
Dein endgültiger Pfad schaut ungefähr so aus "C:\Users\blabla\Desktop\AutoIt-Skriptverzeichnis\C:\Users\Stefan\Downloads\....".
Entferne einfach das @ScriptDir & und es sollte laufen. Am besten nimmst du aber einen FileOpenDialog dafür, dann kannst du bei jedem Skriptstart die Datei auswählen.
Du solltest aber vorher prüfen ob du auch wirklich was gefunden hast, ansonsten wird dein Programm crashen.
Mit UBound kannst du dir die Größe des Arrays ausgeben lassen.
Bitte sieh dir mal die Hilfe genau und und schau nach welchen Befehl du verwendest.
Bei dem 3. Parameter = 0 $STR_REGEXPMATCH (0) | Returns 1 (match) or 0 (no match). (Default).
Bei dem 3. Parameter = 3 $STR_REGEXPARRAYGLOBALMATCH (3) | Return array of global matches.
Genau, den musst du in deinen String abspeichern.
Guck dir mit _ArrayDisplay doch mal das Array an. Dann siehst du welchen Index du in deinen String speichern musst.
Guck dir bitte die Funktion StringRegExp in der Hilfe an um nachzuvollziehen was der 3. Parameter macht.
Poste dein Script nochmal. Dein erstes Pattern ist übrigens falsch, du sagst ihm, dass er so viele . wie möglich matchen soll obwohl da nur eins stehen kann.
Das kann zu falschen Funden führen.
StringRegExp liefert mit dem Parameter 3 ein Array als Ergebnis zurück, kein String.
_FileListToArray spuckt dir in einem Array alle Dateien in einem Verzeichnis aus. _FileListToArrayRec sogar für Unterverzeichnisse.
Für das Sortieren kannst du _ArraySort verwenden oder etwas eigenes schreiben.
Gab letztens einen Thread zum Löschen von jüngsten Dateien, vielleicht kriegste das ja abgeändert: Jüngste Datei löschen
Herzlich Willkommen im AutoIt.de-Forum ![]()
Solange du den Willen mitbringst neue Sachen zu lernen und keinen Code vorgesetzt haben willst, wird dein Vorkenntnisstand niemanden stören.
Wir helfen immer gerne weiter ![]()
Ich kann dir gerne das Pattern erklären aber nicht RegEx komplett, dazu schaust du dir am besten die Hilfe an.
Auftrag\s+bedeutet suche nach dem String "Auftrag" mit mindestens einem oder so vielen Leerzeichen wie möglich dahinter.
(\d+\/\d+(?:\s[^\s]+)?) bedeutet, gib mir alle Funde zurück dieses Format erfüllen.
In Kombination bedeutet das, gib mir alle Funde mit dem Format zurück welche davor ein "Auftrag" mit einem oder mehr Leerzeichen haben.
Nun zum Format:
\d+ bedeutet matche mir min. einen oder so viele Dezimalziffern wie möglich.
/ ist ein gewöhnlicher Foreslash und muss nicht escaped werden.
(?:\s[^\s]+)? sucht nach der Auftragsnummer Daten welche davor ein Leerzeichen haben und anschließend keine Whitespacezeichen (matcht dabei so viele non-whitespaces wie möglich).
Das ?: bedeutet, dass in dem Ergebnisarray die Funde nicht zurückgegeben werden sollen. Normalerweise wird alles was in () steht im Array zurückgegeben.
Das ? hinter der Klammer bedeutet, dass diese Gruppe existieren kann, aber nicht muss. Wenn sie existiert, matche sie, wenn nicht, dann egal.
Mit Auftrag\s+(\d+\/\d+(?:\s[^\s]+)?) sollte es klappen.
wie würde das den funktionieren mit den Sprüngen weil bei etwas komplexeren Geschichten hat man ja mehr als eine funktion mit schleifen?...
Du könntest auch die Funktion mit AdlibRegister alle x Sekunden ausführen, dann kannst du dich sonst wo im Skript befinden.