Da Dies aber eine DotNet DLL ist und AutoIt damit nicht umgehen kann, musst du dir wohl eine andere DLL suchen.
Indirekt schon:
Möglichkeit 1
Möglichkeit 2
Da Dies aber eine DotNet DLL ist und AutoIt damit nicht umgehen kann, musst du dir wohl eine andere DLL suchen.
Indirekt schon:
Möglichkeit 1
Möglichkeit 2
Der von Dir vorgeschlagene Test setzt @error auf 1 und liefert keine Ergebnisse...
Naja, du hast ja selbst gesagt, dass 1x StderrRead einem Teil einer Zeile entspricht, somit kann auch nicht immer eine Prozentzahl gefunden werden. Außerdem dauert 1% wahrscheinlich auch länger als ein Schleifendurchlauf, weshalb StderrRead nicht immer neuen Text zurück gibt.
Ich fürchte auch, dass es das Skript sehr "fett" macht, wenn ich den Stream ständig mit StringRegExp behandle und dann das Array verarbeite.
Den Stream auszulesen + RegExp + eventuelles Update der Progressbar sind zusammen ca. 5 Zeilen, ich denke "sparsamer" geht es nicht wirklich. Es sei denn du meinst damit etwas anderes...
Meintest du vielleicht ich soll pro Runde nach xxx% suchen?
Das wäre wahrscheinlich am einfachsten. Solange sonst keine Prozentzahlen auftauchen sollte das kein Problem sein.
Mit StringRegExp würde das übrigens so aussehen:
StringRegExp($var, "(\d{1,3})%", 3)
[/autoit]Wofür brauchst du überhaupt die graphische Anzeige (in Form von Text) des Fortschritts? Soweit ich das verstehe sollte es reichen den Error-Stream zeilenweise auszulesen, die Prozentzahl herauszufiltern (dafür braucht man auch nur ganz wenig StringInStr bzw. regex) und diesen dann an eine ProgressBar weiterzuleiten. Und was genau meinst du mit den Meldungen, die dir dann entgehen?
Ich kenne die Schreibweise als $spCfg, wobei das s den Datentyp, und das p den Verwendungszweck angibt (wie auch in der ungarischen Notation gedacht), aber ein p allein signalisiert für gewöhnlich einen Zeiger / Pointer, und das ist in AutoIt bei einem String nicht so.
Bezieht sich die Klammer auf den Datentyp und den Zweck oder nur auf den Zweck? Falls ersteres der Fall ist: Der ursprüngliche Verwendungszweck der ungarischen Notation ist es Variablen gleichen Typs zu unterscheiden, deren Verwendungszweck bzw. Inhalt so unterschiedlich ist dass es ein großer Fehler wäre sie in irgendeiner Form zu kombinieren. Das Angeben des Typs ist erst später hinzugekommen und gibt dem Programmierer keine zusätzlichen Informationen, da man erstens einen (groben) Überblick über seine Variablen haben sollte und zweitens seine Variablen so benennen sollte, dass automatisch klar ist von welchem Typ die Variable ist und was in ihr gespeichert wurde. Ich bin mir natürlich dessen bewusst, dass die Angabe des Typs gerade Anfängern (und natürlich auch allen anderen) eine Hilfe sein kann.
Die ungarische Notation macht vor allem Sinn wenn es darum geht Fehler im Code hervorzuheben: Wenn man zum Beispiel Benutzereingaben verwaltet ist eine Unterscheidung zwischen string und unsafe string sinnvoll, da man bei einer Zeile wie $sMessage = $usMessage sofort sieht, dass da irgendwas falsch ist.
Da sich die andere Form der ungarischen Notation mit der Angabe des Datentyps allerdings fest in AutoIt eingebürgert hat und sich das auch in Zukunft wahrscheinlich nicht ändern wird ist dieser Post eigentlich vollkommen unnötig, vor allem da das ganze Thema sowieso Off-Topic ist. Ich wollte das aber trotzdem mal erwähnt haben.
Je nach dem wie viele Items die ComboBox haben soll solltest du als Style stattdessen eher BitOR($CBS_DROPDOWNLIST, $WS_VSCROLL) benutzen, sonst werden dir eventuell nicht alle Items angezeigt.
Ich habe bei "Demo" aber maximal das 4K-Format im Auge.
AutoIt ist ideal, die "Umgebung" bereitzustellen, d.h. Darstellung der Fenster usw.
Aber da wir ja dann anscheinend trotzdem noch AutoIt verwenden wie es uns momentan zur Verfügung steht, wie willst du dann die 4K Grenze erreichen?
Viel schöner wäre doch, wirklich EINFACHE Schleifen und Berechnungen im AutoIt-Code direkt in den Speicher zu compilieren und dort auszuführen, ein "Mini-Compiler" sozusagen. Aber das ist wohl etwas viel verlangt, aber was meint ihr?
Wir haben doch schon mehrere Projekte die Assembler in AutoIt einbinden und zur Laufzeit benutzen, ist es dann wirklich so schwer das ganze mit einem geeigneten Compiler zu machen? Oder willst du Teile des AutoIt Codes kompilieren und nicht nur einen String mit z.B. C Code?
Ist das denn so ziemlich der einzige Bereich? Ich hätte Lust auf ne Veranstaltung die da etwas offener ist vll ... oder andere Themen hat
Meines Wissens nach nicht. Auch Wikipedia definiert den Begriff so.
Within the computer subculture known as the demoscene, a non-interactive multimedia presentation is called a demo (or demonstration).
Links hat Andy ja schon gepostet, ansonsten ist auch Wikipedia sehr zu empfehlen was bestimmte Algorithmen angeht. (Beispiel: Diamond-square algorithm)
Zudem würde es mich interessieren was euer lieblings RPG ist.
Vampire: The Masquerade - Bloodlines, wobei ich dazusagen muss, dass ich bis jetzt nur zwei RPGs gespielt habe (VTMB und Skyrim).
Edit: An The Legend of Zelda habe ich natürlich überhaupt nicht gedacht :pinch: ...dann eben VTMB und The Legend of Zelda: Link's Awakening.
Edit #2: Hier mal eine kleine Ansammlung von Features die Vampire: Bloodlines meiner Meinung nach zu einem guten RPG machen:
Ich kann dir bei deinem Problem zwar nicht helfen, will aber anmerken, dass du den Fehler vielleicht sogar selbst finden würdest, wenn du das Skript mit Arrays zusammenkürzen würdest. Alles ordentlich einzurücken ist auch nie schlecht, denn irgendwann kennst du dich selbst nicht mehr aus.
Alles Gute zum Geburtstag.
Mir ist klar, dass ein/der Obfuscator keinen 100%igen Schutz bietet. Dennoch möchte ich gerne weiterhin meine Programme schützen.
Keinen 100%igen Schutz ist gut gesagt, der offizielle Obfuscator bietet wahrscheinlich überhaupt keinen Schutz, da die Dekompiler (zumindest die die ich kenne) die notwendigen Gegenmaßnahmen alle schon eingebaut haben (ist auch irgendwie kein Wunder, den Obfuscator gibt es ja jetzt auch schon eine Weile).
Auch weiß ich, dass ich den momentanen Obfuscator noch verwenden kann, doch die AutoIt-Entwicklung geht ja weiter und wie z.B. die AutoIT-Version 3.3.11.4 zeigt, gibt es weitere Scipt Breaking Changes, was der Obfuscator sicherlich nicht mehr berücksichtigt.
Hast du das denn schon ausprobiert? Solange das Programm noch funktioniert spricht ja nichts dagegen es weiterhin zu verwenden.
Gibt es Alternativen? Wie handhabt Ihr das zukünftig?
Da die neue bzw. erweiterte AutoIt-Syntax jetzt auch schon wieder einige Monate alt ist wird es sicherlich in Bälde neue Obfuscatoren geben. Ansonsten hasse ich es das sagen zu müssen, aber AutoIt ist für so etwas einfach nicht geeignet.
ich habe ein Projekt, welches ich schon mit der AutoIt Version 3.3.8.1 erfolgreich kompiliert habe. Nun bin ich auf die neue Version (3.3.10.2) umgestiegen und seit dem ist mein Programm sehr langsam geworden.
Da stellt sich mir die Frage wieso du umgestiegen bist. Das Programm schien ja auch vorher schon zu laufen, also kann es ja nicht an den Neuerungen der aktuellen Version liegen. (Edit Andy: "es" bezieht sich hierbei auf den Umstieg und nicht auf das Langsamerwerden des Programms) Somit wäre die einfachste Möglichkeit das Problem zu lösen wieder auf Version 3.3.8.1 zu wechseln.
Kannst du mir diesen Teil (?:<[^>]+>(?:[^<]+)</[^<]+>\s*) des Pattern bitte noch erläutern.
Das ist einfach nur ein beliebiges XML Tag bzw. eine Ansammlung von Tags, d.h. z.B. <irgendwas>a = b</irgendwas>. genauere Erklärung
@all Auch wenn sich das Thema jetzt geklärt hat wüsste ich trotzdem gerne ob und wie man einzelne Strings von der Suche ausschließen kann, vielleicht weiß das ja jemand.
Gefällt mir, habe für mich ein paar kleinigkeiten umgestellt, wie z.b. meine WPM von 600, mit der ich am besten zurecht komme...
Genau dafür ist das Eingabefeld neben den Buttons, 250 ist nur der Standardwert.
Was noch cool wäre, wenn man die Zeit stoppt, wie lange man benötigt diesen Text zu lesen, ich glaube ich bastel mir da auch noch etwas herum, wenn ich darf?
Klar, aber das wollte ich sowieso noch einbauen. Das mache ich wenn ich nachher aus der Schule zurückkomme. Dann wahrscheinlich ähnlich wie bei Squirt: "You just read x words in y {optimale Zeiteinheit}!"
Edit:
Die "Stoppuhr" habe ich jetzt eingebaut, der Rest folgt gegen Ende der Woche, da ich dafür das Skript etwas umstrukturieren muss.
Nicht schlecht, wenns auch hier und da noch hakt. Z.B. mit Umlauten kommt das Programm gar nicht klar. Ein Wort wie Büro wird in die Teile B und ro getrennt. So ist das Programm für deutsche Texte leider nicht wirklich nützlich.
Und das passiert, wenn man das Programm nur mit englischen Texten testet. Wird natürlich sofort geändert, danke für den Tipp.
Anpassung der Anzeigezeit an die Länge der Wörter
Wenn ihr mir sagt wie ihr euch das genau vorstellt (wie viel langsamer das Wort dargestellt werden soll) baue ich das demnächst ein.
Es fehlt noch eine Anpassung der Anzeigezeit an die Länge der Wörter
Macht das überhaupt einen Unterschied?
iReadFast verwendet z.B. ein Flackern (in etwa wie in eine, GuiCtrl ohne Double-Buffer) um das eigentliche Lesen von Wörtern zu verhindern, damit kann man sogar noch schneller lesen. Ich weiß nicht, wovon dieses Flackern abhängig gemacht wird, aber es wäre auch noch eine Idee
Sollte sich das ändern baue ich das natürlich gerne noch ein, sollte mit ein bisschen JavaScript ja kein großes Problem sein.
#NoTrayIcon
[/autoit] [autoit][/autoit] [autoit]Global Const $GUI_ENABLE = 64
Global Const $GUI_DISABLE = 128
Global $oIE, $Form1, $btnStart, $btnPause, $inputWPM, $editText, $b = False, $nWPM, $aWords, $iWord = 0, $iTimer = -1
Global $sHTML = '<center style="font-family: Courier New;font-size: 24px"><span id="text">%%</span></center>'
$oIE = ObjCreate("Shell.Explorer.2")
If @error Then Exit MsgBox(16, "Error", "Sorry, but you need to have the 'Shell.Explorer.2' object installed to use this program.")
$Form1 = GUICreate("AutoIt Speed Reading Demo", 400, 320)
GUICtrlCreateObj($oIE, 20, 20, 360, 80)
GUISetFont(10, 1000, 0, "Courier New")
$btnStart = GUICtrlCreateButton("Start", 20, 120, 80, 20)
$btnPause = GUICtrlCreateButton("Pause", 110, 120, 80, 20)
GUICtrlSetState($btnPause, $GUI_DISABLE)
$inputWPM = GUICtrlCreateInput("", 200, 120, 180, 20)
GUICtrlSendMsg($inputWPM, 0x1501, 0, "Words / Minute")
$editText = GUICtrlCreateEdit("The quick brown fox jumps over the lazy dog.", 20, 150, 360, 130)
$labelInfo = GUICtrlCreateLabel("", 20, 290, 360, 20)
GUISetState(@SW_SHOW, $Form1)
$oIE.navigate("about:blank")
Sleep(10)
UpdateHTML("Hello World!")
Do
Switch GUIGetMsg()
Case -3
ExitLoop
Case $btnStart
If $b Then
_Stop()
Else
ParseText()
_Start()
$iWord = 0
GUICtrlSetData($btnStart, "Stop")
GUICtrlSetState($btnPause, $GUI_ENABLE)
$b = True
EndIf
Case $btnPause
If $b Then
AdlibUnRegister("DisplayNextWord")
GUICtrlSetData($btnPause, "Resume")
$b = False
Else
_Start()
GUICtrlSetData($btnPause, "Pause")
$b = True
EndIf
EndSwitch
Until False
AdlibUnRegister("DisplayNextWord")
$oIE = 0
Exit
Func _Start()
$nWPM = Number(GUICtrlRead($inputWPM))
If ($nWPM < 60) Then $nWPM = 250
AdlibRegister("DisplayNextWord", Floor(60000/$nWPM))
If ($iTimer < 0) Then $iTimer = TimerInit()
EndFunc
Func _Stop()
AdlibUnRegister("DisplayNextWord")
GUICtrlSetData($labelInfo, StringFormat("You just read %d word(s) in %s!", $iWord, _FormatSeconds(TimerDiff($iTimer)/1000)))
$iTimer = -1
GUICtrlSetState($btnPause, $GUI_DISABLE)
GUICtrlSetData($btnStart, "Start")
$b = False
EndFunc
Func ParseText()
Local $text = GUICtrlRead($editText), $i, $a, $b
Local $html = '\1<span style="color: #FF0000;">\2</span>\3'
$aWords = StringRegExp($text, '("?[\wÄäÖöÜüß]+[,.:;!?-]*"?)', 3)
For $i = 0 To UBound($aWords)-1
$a = StringRegExp($aWords[$i], "[A-Za-zÄäÖöÜüß]+", 3)
If (Not @error) Then
$a = $a[0]
If (StringLen($a) > 2) Then
$b = getORPIndex($a)
$aWords[$i] = StringReplace($aWords[$i], $a, StringRegExpReplace($a, '^(.{' & $b & '})(.)(.*)$', $html), 1, 1)
EndIf
EndIf
Next
EndFunc
Func getORPIndex($s)
Local $l = StringLen($s)
If ($l = 1) Then Return 0
If ($l = 2) Then Return 1
If ($l = 3) Then Return 1
Return Floor($l / 2) - 1
EndFunc
Func UpdateHTML($sContent)
$oIE.document.body.innerHTML = StringReplace($sHTML, "%%", $sContent)
EndFunc
Func DisplayNextWord()
UpdateHTML($aWords[$iWord])
$iWord += 1
If ($iWord >= UBound($aWords)) Then _Stop()
EndFunc
Func _FormatSeconds($n)
If ($n > 86400) Then
Return Round($n/86400, 2) & " day(s)"
EndIf
If ($n > 3600) Then
Return Round($n/3600, 2) & " hour(s)"
EndIf
If ($n > 60) Then
Return Round($n/60, 2) & " minute(s)"
EndIf
Return Round($n, 2) & " second(s)"
EndFunc