*ein "y" nachreiche* ![]()
die Homepage ist http://www.digijay.at/
*ein "y" nachreiche* ![]()
die Homepage ist http://www.digijay.at/
Wer aber dennoch eine "sichere" RegEx findet oder kennt um Kommentare vom Code zu trennen (eigentlich benötigt man den Kommentartrenner doch in jeder Programmiersprache) bitte ich um Info!
Da ich gerade im Zusammenhang mit dem finden der zugehörigen schließenden Tags zu den öffnenden in HTML darauf gestoßen bin:
so etwas lässt sich wohl mit RegEx prinzipiell nicht fehlersicher lösen. M$ hat zwar in seine .Net-Implementierung eine Hilfsfunktion dafür eingebaut, die arbeitet aber auch nicht unter allen Bedingungen fehlerfrei.
Um solche Probleme zu lösen, braucht man wohl einen Parser für die jeweilige Sprache, der den Quelltext von Anfang an durchgeht, sich dabei Zustandsänderungen merkt (z.B. Strings an den Anführungszeichen erkennt und entsprechend Flags setzt, wie "alles innerhalb Singlequotes wird nicht weiter interpretiert"), und damit Ziechen abhängig vom Kontext, in dem sie stehen, interpretiert.
Ich weiß nicht, ob man den in Scite eingebauten Parser, der das Syntaxhilighting macht, evtl. abfragen kann dazu, als was er ein Semikolon an einer bestimmten Position interpretiert. Falls man die Schriftfarbe abfragen kann, könnte man das verwenden. Ich hab mich vor Jahren mal ein bischen damit beschäftigt, und meine, das müsste man abfragen können, bin aber nicht sicher.
SciTE ist der AutoIt-Standard, nicht Notepad++!
Ich nehm alles zurück und behaupte das Gegenteil. Da hast Du recht. Damit ist mein Gemecker darüber hinfällig, weil die Probleme nicht auftreten, wenn man die Skripte nicht wie ich direkt aus der Hilfe heraus aufruft.
Benutzt hab ich die NPP-Console auch schon. Werd mich in Zukunft zu solchen Themen aber zurückhalten, weil die Probleme, die ich da sehe, mit meinem Environment zusammenhängen und andere garnicht betreffen.
Ich meinte die Erwähnung von Scite unter ConsoleWrite im ersten Beispiel im Kommentar. Da könnte man einen Link auf die von Dir erwähnte Scite-Hilfe einbauen, oder den Hinweis mit F5 dort direkt geben - aber muß man auch nicht.
___________________________________________________________________________________________
"AutoItSetOption" > "GUICoordMode" > Param = 2
Positionierung relativ zur unteren rechten Ecke des letzten Controls.
Ausnahme: mit "-1" übernimmt man den top/left-Wert des letzten Controls.
Um ein Control genau 1px höher/links als das letzte zu positionieren (-1 ist ja reserviert für "gleicher Abstand von oben/links"), muß man es mit negativen Werten um ("Höhe/Breite des letzten Controls" + 1) nach oben/links verschieben/positionieren.
Das halte ich für wesentlich verständlicher.
Eine Fehlerbehandlung in nem Beispielskript mit ConsoleWrite zu machen, wäre ja durchaus Ok, damit der Anfänger beim lesen auch mal über diesen Befehl stolpert und ihn evtl. nachschlägt, aber das eigentliche Ergebnis einer Funktion sollte aus der Hilfe heraus schon direkt sichtbar sein.
Warum geben wir denn auf dem Monitor nicht Maschinencode aus? Warum wandeln wir den in Binärcode um, und diesen in Hex, und den in ASCII/UTF-8/etc.? Warum basteln wir GUIs, statt zu erwarten, daß die Leute ihre Bewerbung auf der Konsole schreiben und die Formatierungsbefehle von Hand eingeben? Wozu das alles? Um etwas zu vereinfachen, es verständlicher, anschaulicher, einfacher handhabbar zu machen.
Ich suche in der Hilfe nicht nach Skripten. Ich suche nach der Erklärung für eine Funktion. Und wenn die sich liest, wie eine dieser berüchtigten chinesischen Bedienungsanleitungen, wie z.B. "AutoItSetOption" > "GUICoordMode" > Option 2 , dann probiere ich das Beispielskript aus, in der Hoffnung, daß es mir dadurch klar wird.
Wenn ich ein Script aus der Hilfe starte, wird es direkt ausgeführt, weil ich Notepad++ schon so lange benutze (und mir dafür selber noch Hilfstools benaut hab), daß ich nicht auf Scite umsteigen will. Wenn ich das Script dann im Editor haben will, kann ich es immer noch rauskopieren.
Wenn übrigens "2. unfassbar viele MsgBoxen" aufpoppen, "die einfach nur nerven.", schreibt man die Ausgabe halt in eine GUI, da bleibt sie genauso stehen und ist nachvollziehbar. Es gibt ja schon solche Beispiele zB. zu StringRegExp, wo man besser die MsgBoxen zusammenfassen oder durch ne GUI ersetzen sollte.
Ich finde, wir sollten Leute da abholen, wo sie stehen, und das ist bei einigen eben ganz am Anfang. Für viele, die sich schon länger mit etwas beschäftigen, sind die Basics halt "doch ganz klar".
Ich halte mich aber in Zukunft zurück bei dem Thema. Hab oft genug, z.B. bei Wikipedia, die Erfahrung gemacht, daß der Einsatz nicht lohnt, wenn Insider/Fortgeschrittene was dagegen haben. Auch im engl. Forum schon. Da können ja einige hier auch ein Lied von singen, daß Bugreports ignoriert werden, etc.
PS: Unter ConsoleWrite wird übrigens Scite zwar erwähnt, aber F5 nicht. Hielte ich auch für ne sinnvolle Verbesserung.
Deshalb lernen so wenig Leute in Eigeninitiative C++, weil die Doku für Einsteiger so grottig, ist. Da muß man schon Programmierer sein, um um lernen zu können, einer zu werden - ein Widerspruch in sich für etwas, das sich "Hilfe" nennt.
<Ironie>Warum gibst Du die Ergebnisse Deiner Scripte nicht in DllStruct's aus? Die Leute können doch als Anfänger erst mal lernen, wie man nen Debugger benutzt? Console ist doch sowas von lame.</Ironie>
Der Jammer mit Anfängern ist nun mal, daß sie ANFANGEN, und anfangen tut man immer mit dem ersten Schritt. Der erste Schritt ist nun mal der erste Befehl, den man lernt, und die "Hilfe" soll mit Beispielen verANSCHAUlichen, was die Auswirkung des Befehls ist. Die Hilfe hat nun mal keine Console. Was Du erwartest ist, daß die Leute einen Teil der Syntax schon KÖNNEN, bevor sie anfangen, sie zu lernen.
Du mußt Dich ja selber garnicht daran beteiligen, das zu ändern, aber wenn Du darauf bestehst, daß das auch andere nicht tun sollen, klingt das für mich nach "Ein bischen sollen die sich schon quälen, zu leicht will ich's ihnen auch nicht machen.".
Ich benutze AutoIt seit vielen Jahren und mich nervt es immer wieder, wenn ich wegen einer mir unverständlichen (engl.) Erklärung einer UDF-Funktion ein Script erst rauskopieren muß, um mir die Ausgabe anschauen zu können. Und ich gestehe mir zu, es für arrogant zu halten, wenn dann jemand meint: "Dann mußt Du halt die Begriffe erst mal alle lernen.".
Nicht funktionierende Beispielskripte in der Hilfe
ConsoleWrite in Beispielskripten
Wie ich schon schrieb, Beispielskripte sollten ihre Ausgabe nicht in die Console machen. Gebt mal "ConsoleWrite" in die Suche der Hilfe ein, da gibts jede Menge Scripte, bei denen der Anfänger garkeine Reaktion zu sehen bekommt, wenn er die aus der Hilfe heraus aufruft. Das lässt sich fast alles durch MsgBox ersetzen, oder notfalls durch ne simple Gui.
FileReadToArray
Das Beispielskript soll sich zur Demonstration selber einlesen, was natürlich nicht funktionieren kann, wennn es in eine *.chm gezippt ist.
Das meiste Wissen bezügl. Computern hab ich mir selbst erschlossen (und dabei mit Javascript in prozeduraler Form angefangen). Unser C++Dozent (FI/SI-Ausbildung) kommentierte ständig: "Hast Du da nicht einen [Punkt|DoppelPunkt|zwei Doppelpunkte|Ausrufezeichen|Komma|etc.] vergessen? .. Kaum macht man's richtig, schon funktionierts." Die Leute waren mehr damit beschäftigt, an Syntaxfehlern zu verzweifeln, als daß sich Erfolge eingestellt haben.
Sowas wie automatische Typkonvertierung ist halt immer Fluch und Segen. Es macht den Einstieg oft erst mal leichter, weil man sich nicht um so viele Dinge kümmern muß, bevor mal was funktioniert, aber es ist auch fehleranfälliger, und ein späteres Umlernen dann nochmal anstrengend.
Ich hab mich schon mal etwas mit OOP beschäftigt, aber da ich meine Aufgabenstellungen bisher auch anders lösen konnte, hatte ich bisher nicht die Motivation, mich so dahinter zu klemmen, daß ich da Fuß fasse.
Ja. Ich seh da allerdings bisher nichts, was ich vermisst hätte.
Oh, das heißt dann wohl C++. Da bin ich dann leider nur Zaungast.
Argh! Ich muß meine Regex-Kenntnisse auffrischen .. Schande über mich! ![]()
Hat diese "Objektisierung" irgendwelche Vorteile bezügl. Ausführungsgeschwindigkeit oder erweiterter Möglichkeiten, die AutoIt selbst nicht bietet; außer daß sie vielleicht Leuten, die diese Syntax schon von anderen Programmiersprachen gewohnt sind, besser liegt?
Ich fürchte, wenn AutoIt komplett auf OOP umgestellt würde, wäre der Einstieg für viele Programierneulinge wesentlich schwerer. ![]()
Muß das nicht '\s+' heißen, also [whitespace) gefolgt von weiteren Zeichen aus der Zeichengruppe?
'\s*' bedeutet doch "ein Whitespace, gefolgt von weiteren BELIEBIGEN Zeichen" ?
Was hat Tampermonkey denn mehr zu bieten? Bin mal umgestiegen, aber mir fällt erst mal nur auf, daß ich beim ersten Click aufs Greasemonkey-Icon schon meine Scripte zu sehen bekam. Noch nen Click aufs Script, und noch einer auf 'Edit', und ich konnte es bearbeiten. Fand ich angenehmer.
Was siehst Du bei Tampermonkey für Vorteile?
Da AutoIt ja Windows-orientiert ist, macht Plattformunabhängigkreit überhaupt Sinn?
Zum einen wäre wichtig, welche Toolkits diese Container-Verschachtelung/Strukturierung/Gruppierung unterstützen, die uns in AutoIt fehlt (umzusetzen ohne übermäßigen Aufwand).
Zum anderen ist Verbreitung schon interessant (am besten auf jedem Windows-System vorhanden), damit man nicht erst die zugehörigen DLLs besorgen muß (evtl.Versions-Probleme?), denn aus Copyright-Gründen können wir die wohl schlecht selbst hier anbieten. Auch würden mitzuliefernde DLLs (FileInstall) die Programm-Datei aufblähen.
Also erst mal aussortieren, was nicht in Frage kommt, und dann hier die Doku zu dem Toolkit verlinken, das dann letztlich umgesetzt werden soll. Dann machen sicher auch mehr Leute mit bei der Umsetzung, wenn sie die Resourcen nicht selber zusammensuchen müssen. ![]()
Hab die beiden (DE 3.3.14.2 und EN 3.3.12.0) mal verglichen. Bis auf die Strings sind sie gleich (funktional).
Ich hab grad beide (DE und EN) nebeneinander geöffnet, und da die en schon 'ne StringRegExpGUIPattern.dat angelegt hat, spuckt die DE jetzt in dem Pattern-Combo die (EN) Header-Zeile mit aus.
Wenn ich die readDatFile()-Funktion mittels FileReadToArray() umbaue, fällt das Geraffel zur Entfernung der Zeilenumbrüche weg, und die erste Zeile lässt sich unabhängig vom (DE oder EN) Inhalt "entsorgen". Die ganze Funktion lässt sich viel kompakter (und weniger fehleranfällig) schreiben, mach ich mich morgen abend mal dran.
Übersetzung mach ich dann gleich mit.
Fehler/Verbesserungen melde ich auf Basis der Online-Hilfe.
Danke Andy , habs mal oben im Post angepasst, und noch ein paar Kleinigkeiten.
Dann könnte der jetzt mit in die Hilfe übernommen werden (im "Tutorial - Regular Expression").
PS NOCH NICHT! Sind noch Fehler drin. Jetzt sollte alles funktionieren. Ruckelt immer noch was, muß aber erst mal weg, kümmer mich später drum.
So, soweit möglich, ruckeln und flackern beseitigt. Falls nochmal jemand drüberschauen mag ... ansonsten ist das Script jetzt fertig.
* Resource aus dem Netz laden
* Gui resizable
_____________________________________________________________________________________________________________________
Placeholder für Input, etc. setzen mit $EM_SETCUEBANNER - könnte man noch mit aufnehmen in die Hilfe.
Hab den Regexp-Tester aus der Hilfe jetzt mal entsprechend Oscars Vorschlag umgebaut. Das Ergebnis ist ebenso unbefriedigend. Die Radio-Controls springen auf und ab und überlagern sich teilweise beim Resizen:
PS: Nach weiteren Anpassungen ist das Ergebnis jetzt befriedigend.
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GuiConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <StaticConstants.au3>
#include <StringConstants.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
Global Const $g_sSep = Chr(11) ; --> 0x0B = VT - use as a separator for use in the combo control. By default this uses a "|" and this charactor is likely to be used in a pattern file
Opt("GUIDataSeparatorChar", $g_sSep)
Global $g_sInitialDir = @ScriptDir
Global Const $GREEN = 0xAAFFD5
Global Const $GREY = 0xD4D0C8
Global Const $RED = 0xFF8888
Global Const $BLACK= 0x000000
Global Const $BLUE = 0x0000FF
Global Const $SOFTYELLOW = 0xFBFFC6
Global Const $YELLOW = 0xFFFC8A
Global $StringToTest ; $StringToTest holds the currently selected tab for the input string to be tested (ie from the edit box or from the text file)
; results from StringRegExp come in 3 forms: a single string (rtn flag 0), a single array (rtn flag 1,2,3) or an array of arrays (rtn flag 4)
Global $g_bResultTrueFalseExpected = False
Global $g_bArrayOfArraysExpected = False
Global $g_sPatterns = readDatFile()
Global $iGuiW = 632, $iGuiH = 628
GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")
GUIRegisterMsg($WM_SIZE, "_WM_SIZE")
$hMainForm = GUICreate("StringRegExp Idea by w0uter, modified Steve8tch and fakeraol", $iGuiW, $iGuiH, -1, -1, $WS_MINIMIZEBOX + $WS_MAXIMIZEBOX + $WS_SIZEBOX)
$WindowSize = WinGetPos($hMainForm)
Local $Tab = GUICtrlCreateTab(10, 10, 610, 190)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP)
Global $Tabitem1 = GUICtrlCreateTabItem("Test text")
Local $InputEditBox = GUICtrlCreateEdit("", 20, 40, 590, 150, BitOR($ES_WANTRETURN, $WS_VSCROLL, $WS_HSCROLL, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL))
GUICtrlSetResizing (-1,$GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKHEIGHT)
GUICtrlSetBkColor($InputEditBox, $SOFTYELLOW)
Global $Tabitem2 = GUICtrlCreateTabItem("Load text from File")
Local $Browse = GUICtrlCreateButton("Browse for file", 20, 40, 100, 20)
GUICtrlSetResizing (-1,$GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKSIZE)
Global $PathToInputFile = GUICtrlCreateEdit("", 130, 40, 480, 20, BitOR($ES_WANTRETURN, $WS_HSCROLL, $ES_AUTOHSCROLL))
GUICtrlSetResizing (-1,$GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKHEIGHT)
Global $InputFromFile = GUICtrlCreateEdit("", 20, 70, 590, 120, BitOR($ES_WANTRETURN, $WS_VSCROLL, $WS_HSCROLL, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL))
GUICtrlSetResizing (-1,$GUI_DOCKTOP + $GUI_DOCKLEFT)
GUICtrlSetBkColor($InputFromFile, $SOFTYELLOW)
Global $Tabitem3 = GUICtrlCreateTabItem("Get website text/HTML")
$WebTextButton = GUICtrlCreateButton("Text", 20, 40, 60, 20)
GUICtrlSetResizing (-1,$GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKSIZE)
$WebHTMLButton = GUICtrlCreateButton("HTML", 85, 40, 60, 20)
GUICtrlSetResizing (-1,$GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKSIZE)
$WebADDRInput = GUICtrlCreateInput("", 155, 40, 453, 20)
GUICtrlSetResizing (-1,$GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKHEIGHT)
GUICtrlSendMsg(-1, $EM_SETCUEBANNER, False, "http://...")
$InputFromWeb = GUICtrlCreateEdit("", 20, 70, 590, 120)
GUICtrlSetResizing (-1,$GUI_DOCKTOP + $GUI_DOCKLEFT)
GUICtrlSetBkColor(-1, $SOFTYELLOW)
GUICtrlCreateTabItem("");
$patternGroup = GUICtrlCreateGroup("The pattern", 10, 210, 610, 60)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT)
Local $Test = GUICtrlCreateButton("Test", 20, 234, 40, 20, $BS_DEFPUSHBUTTON)
GUICtrlSetResizing (-1,$GUI_DOCKSIZE + $GUI_DOCKLEFT)
Global $Pattern = GUICtrlCreateCombo("", 70, 230, 500, 30)
GUICtrlSetFont($Pattern, 14, -1, -1, "Arial")
GUICtrlSetColor($Pattern, $BLUE)
GUICtrlSetBkColor($Pattern, $YELLOW)
GUICtrlSetData($Pattern, $g_sPatterns, "(.*)")
Global $DoPtnAdd = GUICtrlCreateButton("Add", 584, 225, 30, 18)
Local $DoPtnDel = GUICtrlCreateButton("Del", 584, 245, 30, 18)
Global $Radio_0 = GUICtrlCreateRadio("Match", 15, 300, 115, 18)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT)
Global $Radio_1 = GUICtrlCreateRadio("ArrayMatch", 15, 318, 115, 18)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT)
GUICtrlSetState($Radio_1, $GUI_CHECKED)
Global $Radio_2 = GUICtrlCreateRadio("ArrayFullMatch", 15, 336, 115, 18)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT)
Global $Radio_3 = GUICtrlCreateRadio("ArrayGlobalMatch", 15, 354, 115, 18)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT)
Global $Radio_4 = GUICtrlCreateRadio("ArrayGlobalFullMatch", 15, 372, 115, 18)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT)
$returnGroup = GUICtrlCreateGroup(" Return Flag", 10, 280, 125, 120) ; created after its content controls to avoid overlap on resizing
GUICtrlSetResizing (-1,$GUI_DOCKLEFT + $GUI_DOCKSIZE)
$offsetGroup = GUICtrlCreateGroup(" Offset", 10, 410, 125, 50)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT + $GUI_DOCKSIZE)
Global $Offset = GUICtrlCreateInput("1", 40, 430, 60, 20)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT + $GUI_DOCKSIZE)
$errorGroup = GUICtrlCreateGroup("@error @extended", 10, 470, 125, 50)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT + $GUI_DOCKSIZE)
Global $Err = GUICtrlCreateInput("", 20, 490, 40, 20, $ES_READONLY)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT + $GUI_DOCKSIZE)
Global $Ext = GUICtrlCreateInput("", 70, 490, 50, 20, $ES_READONLY)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT + $GUI_DOCKSIZE)
Local $_Help = GUICtrlCreateButton("StringRegExp HELP", 10, 544, 120, 30)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT + $GUI_DOCKSIZE + $GUI_DOCKBOTTOM)
$outputGroup = GUICtrlCreateGroup("Output", 145, 280, 475, 295)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT)
Global $Out = GUICtrlCreateEdit("", 155, 296, 455, 270, BitOR($ES_WANTRETURN, $WS_VSCROLL, $WS_HSCROLL, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL))
GUICtrlSetResizing (-1,$GUI_DOCKLEFT)
GUICtrlSetBkColor($Out, $SOFTYELLOW)
Global $TimerDisplay = GUICtrlCreateLabel("Time (ms)", 3, 583, 132, 20, $SS_SUNKEN)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
Global $StatusBar = GUICtrlCreateLabel("Status..", 140, 583, 487, 20, $SS_SUNKEN)
GUICtrlSetResizing (-1,$GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
$StringToTest = $InputEditBox ; default - read the string to be tested from the edit box
; setup tool tips
; GUICtrlSetTip required IE version 5+
If Number(StringLeft(RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer", "Version"), 1)) > 4 Then
GUICtrlSetTip($Radio_0, "Returns 1 (matched) or 0 (no match)", "Return Flag= 0", 1, 1)
GUICtrlSetTip($Radio_1, "Returns an array containing the matches.", "Return Flag = 1", 1, 1)
GUICtrlSetTip($Radio_2, "Returns the full matched string AND an array containing the matches (Perl / PHP style).", "Return Flag = 2", 1, 1)
GUICtrlSetTip($Radio_3, "Returns an array containing the global matches.", "Return Flag = 3", 1, 1)
GUICtrlSetTip($Radio_4, "Returns an array of arrays containing the full matched strings AND global matches. (Perl / PHP style).", "Return Flag = 4", 1, 1)
GUICtrlSetTip($Offset, "[optional] The string position to start the match (starts at 1) The default is 1.", "Offset option", 1, 1)
Else
GUICtrlSetTip($Radio_0, "Returns 1 (matched) or 0 (no match)")
GUICtrlSetTip($Radio_1, "Returns an array containing the matches.")
GUICtrlSetTip($Radio_2, "Returns the full matched string AND an array containing the matches (Perl / PHP style).")
GUICtrlSetTip($Radio_3, "Returns an array containing the global matches.")
GUICtrlSetTip($Radio_4, "Returns an array of arrays containing the full matched strings AND global matches. (Perl / PHP style).")
GUICtrlSetTip($Offset, "[optional] The string position to start the match (starts at 1) The default is 1.")
EndIf
GUISetState(@SW_SHOW)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Test
doStringRegExpTest()
Case $Browse
doBrowseForFile()
Case $WebTextButton
_IELoadWaitTimeout(30000)
GUICtrlSetData($InputFromWeb, "Please wait...")
$oIE = _IECreate(GUICtrlRead($WebADDRInput), 0, 0)
If @error = 6 Then
GUICtrlSetData($InputFromWeb, "Load Timeout")
Else
GUICtrlSetData($InputFromWeb, _IEBodyReadText($oIE))
EndIf
_IEQuit($oIE)
Case $WebHTMLButton
_IELoadWaitTimeout(30000)
GUICtrlSetData($InputFromWeb, "Please wait...")
$oIE = _IECreate(GUICtrlRead($WebADDRInput), 0, 0)
If @error = 6 Then
GUICtrlSetData($InputFromWeb, "Load Timeout")
Else
GUICtrlSetData($InputFromWeb, _IEBodyReadHTML($oIE))
EndIf
_IEQuit($oIE)
Case $Tab
Switch GUICtrlRead($Tab)
Case 0
$StringToTest = $InputEditBox
Case 1
$StringToTest = $InputFromFile
Case 2
$StringToTest = $InputFromWeb
EndSwitch
Case $DoPtnAdd
doPtnAdd(GUICtrlRead($Pattern))
Case $DoPtnDel
doPtnDel(GUICtrlRead($Pattern))
Case $_Help
doDisplayHelp()
EndSwitch
WEnd
Func doStringRegExpTest()
Local $aA, $aB ;use for arrays
Local $i, $j ; use for stepping through arrays
Local $c ; counter
Local $hTimer, $t ; use for timing
Local $iErr, $iExt ; use to hold result of @error and @extended
Local $sResult = "" ; use to hold result
Local $iStrLgth ; use to the string length of the number of results expected. (eg Use in the StringFormat function
Local $x, $y ; local vars.
GUICtrlSetData($Out, "")
GUICtrlSetData($StatusBar, "Performing test..... please wait.")
GUICtrlSetBkColor($StatusBar, $GREEN)
;set up timer
$hTimer = TimerInit()
$aA = StringRegExp(GUICtrlRead($StringToTest), GUICtrlRead($Pattern), getReturnFlag(), getOffset())
$iErr = @error
$iExt = @extended
$t = TimerDiff($hTimer)
GUICtrlSetData($TimerDisplay, $t & " ms")
GUICtrlSetData($Err, $iErr)
GUICtrlSetData($Ext, $iExt)
Select
Case $iErr = 0
GUICtrlSetData($StatusBar, "Valid pattern - updating display. Please wait....")
GUICtrlSetBkColor($StatusBar, $GREEN)
Case $iErr = 1
GUICtrlSetData($StatusBar, "Array is invalid. No matches")
GUICtrlSetBkColor($StatusBar, $RED)
Case $iErr = 2
GUICtrlSetData($StatusBar, "Bad pattern, (array is invalid). @extended = offset of error in pattern.")
GUICtrlSetBkColor($StatusBar, $RED)
EndSelect
If $iErr = 0 Then
$x = UBound($aA)
If $g_bArrayOfArraysExpected Then
$y = UBound($aA[0])
$x *= $y
EndIf
$iStrLgth = StringLen(String($x - 1))
If $g_bArrayOfArraysExpected Then ; results -> array of arrays expected
$c = 0 ; use $c as a counter to help display the results
If UBound($aA) Then
For $i = 0 To UBound($aA) - 1
$aB = $aA[$i]
For $j = 0 To UBound($aB) - 1
$sResult &= StringFormat("%0" & $iStrLgth & "i", $c) & ' => ' & $aB[$j] & @CRLF
$c += 1
Next
$sResult &= @CRLF
Next
GUICtrlSetData($Out, $sResult)
GUICtrlSetData($StatusBar, "Complete")
EndIf
ElseIf $g_bResultTrueFalseExpected Then ; result string expected
If $aA = 1 Then
$sResult &= "1 <-- SUCCESS, matches found" & @CRLF
Else
$sResult &= "0 <-- FAIL, no matches found" & @CRLF
EndIf
GUICtrlSetData($Out, $sResult)
GUICtrlSetData($StatusBar, "Complete")
Else ; a single array expected
If UBound($aA) Then
For $i = 0 To UBound($aA) - 1
$sResult &= StringFormat("%0" & $iStrLgth & "i", $i) & ' => ' & $aA[$i] & @CRLF
Next
GUICtrlSetData($Out, $sResult)
GUICtrlSetData($StatusBar, "Complete")
EndIf
EndIf
EndIf
EndFunc
Func getReturnFlag()
$g_bArrayOfArraysExpected = False
$g_bResultTrueFalseExpected = False
Switch $GUI_CHECKED
Case GUICtrlRead($Radio_0)
$g_bResultTrueFalseExpected = True
Return $STR_REGEXPMATCH
Case GUICtrlRead($Radio_1)
Return $STR_REGEXPARRAYMATCH
Case GUICtrlRead($Radio_2)
Return $STR_REGEXPARRAYFULLMATCH
Case GUICtrlRead($Radio_3)
Return $STR_REGEXPARRAYGLOBALMATCH
Case GUICtrlRead($Radio_4)
$g_bArrayOfArraysExpected = True
Return $STR_REGEXPARRAYGLOBALFULLMATCH
EndSwitch
EndFunc
Func getOffset()
Local $x
$x = Int(GUICtrlRead($Offset))
If @error Then
Return 1
Else
Return $x
EndIf
EndFunc
Func doBrowseForFile()
Local $sFilePath, $sFileTxt
$sFilePath = FileOpenDialog("Select text file to test", $g_sInitialDir, "Text files (*.*)", 1)
$g_sInitialDir = StringTrimRight($sFilePath, StringInStr($sFilePath, "\", "-1"))
GUICtrlSetData($StatusBar, "Loading file..")
GUICtrlSetBkColor($StatusBar, $GREEN)
GUICtrlSetData($PathToInputFile, $sFilePath)
$sFileTxt = FileRead($sFilePath)
GUICtrlSetData($StatusBar, "File loaded... updating display")
GUICtrlSetData($InputFromFile, $sFileTxt)
GUICtrlSetData($StatusBar, "")
GUICtrlSetBkColor($StatusBar, $GREY)
EndFunc
Func readDatFile()
Local $sDat, $sOut = ""
Local $sHeader = "[do not delete this file - Patterns are listed below]" & @CRLF
Local $sDatFile = @AppDataDir & "\StringRegExpGUIPattern.dat"
If FileExists($sDatFile) = 0 Then
$sDat = $sHeader & "(.*)"
FileWrite($sDatFile, $sDat)
$sOut = "(.*)"
Else
$sDat = FileRead($sDatFile)
$sDat = StringReplace($sDat, $sHeader, "") ; strip out header line
;Strip out any leading or trailing @CRLF
If StringLeft($sDat, 2) = @CRLF Then $sDat = StringTrimLeft($sDat, 2)
If StringRight($sDat, 2) = @CRLF Then $sDat = StringTrimRight($sDat, 2)
If $sDat <> "" Then ; we should have 1 or more patterns
$sOut = StringReplace($sDat, @CRLF, $g_sSep)
Else
FileWrite($sDatFile, $sHeader & "(.*)")
$sOut = "(.*)"
EndIf
EndIf
Return $sOut
EndFunc
Func doPtnDel($x)
Local $sDat
Local $sDatFile = @AppDataDir & "\StringRegExpGUIPattern.dat"
$sDat = FileRead($sDatFile)
;now find and remove this entry from the dat file
$sDat = StringReplace($sDat, $x, "")
;If $x was in the middle of the dat file - we will now need to find and remove any double @CRLF entries
$sDat = StringReplace($sDat, @CRLF & @CRLF, @CRLF)
;If $x was at the beginning or the end of the file - we now need to stop off a leading or trailing @CRLF entry
If StringLeft($sDat, 2) = @CRLF Then $sDat = StringTrimLeft($sDat, 2)
If StringRight($sDat, 2) = @CRLF Then $sDat = StringTrimRight($sDat, 2)
;Now delete the previous dat file and create a new one
If FileDelete($sDatFile) Then
FileWrite($sDatFile, $sDat)
Else
MsgBox($MB_SYSTEMMODAL, "***ERROR**", "Failed to delete entry from the dat file" & @CRLF & _
"Reason: Failed to delete old file.")
EndIf
;Now read in new dat file
$g_sPatterns = readDatFile()
GUICtrlSetData($Pattern, $g_sSep & $g_sPatterns, "(.*)")
EndFunc ;==>doPtnDel
Func doPtnAdd($x)
Local $sDat
Local $sDatFile = @AppDataDir & "\StringRegExpGUIPattern.dat"
$sDat = FileRead($sDatFile)
;now add this entry to the end of the dat file
$sDat &= @CRLF & $x
;Now delete the previous dat file and create a new one
If FileDelete($sDatFile) Then
FileWrite($sDatFile, $sDat)
Else
MsgBox($MB_SYSTEMMODAL, "***ERROR**", "Failed to delete entry from the dat file" & @CRLF & _
"Reason: Failed to delete old file.")
EndIf
;Now read in new dat file
$g_sPatterns = readDatFile()
GUICtrlSetData($Pattern, $g_sSep & $g_sPatterns, $x)
EndFunc ;==>doPtnAdd
Func doDisplayHelp()
Local $iErr = 0
If @Compiled = 0 Then
Local $sPathToHelpFile = StringLeft(@AutoItExe, StringInStr(@AutoItExe, "\", 0, -1))
Run($sPathToHelpFile & "AutoIt3Help.exe StringRegExp")
$iErr = @error
Else
; X64 running support
Local $sWow64 = ""
If @AutoItX64 Then $sWow64 = "\Wow6432Node"
;Try and file to help file (if available at all)
;get AutoIt install dir
Local $sPathToAutoIt = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE" & $sWow64 & "\AutoIt v3\AutoIt", "InstallDir")
$iErr = @error
If $iErr = 0 Then
Run($sPathToAutoIt & "\AutoIt3Help.exe StringRegExp")
$iErr = @error
EndIf
EndIf
If $iErr Then MsgBox($MB_SYSTEMMODAL, "error", "Cannot find help file - sorry")
EndFunc
Func WM_GETMINMAXINFO($hwnd, $Msg, $wParam, $lParam)
#forceref $hwnd, $Msg, $wParam, $lParam
Local $tagMaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
DllStructSetData($tagMaxinfo, 7, $WindowSize[2]) ; min X
DllStructSetData($tagMaxinfo, 8, $WindowSize[3]) ; min Y
DllStructSetData($tagMaxinfo, 9, @DesktopWidth) ; max X
DllStructSetData($tagMaxinfo, 10, @DesktopHeight) ; max Y
Return 0
EndFunc
Func _WM_SIZE($hWnd, $Msg, $wParam, $lParam)
Local $iW = BitAND($lParam, 0x0000ffff) ; Low-Order-Word = new Client-Width
Local $iH = BitShift(BitAND($lParam, 0xffff0000), 16) ; Hi-Order-Word = new Client-Height
LOcal $iM = Floor($iH * .39)
GUICtrlSetPos($Tab, 10, 10, $iW - 20, $iM - 45)
GUICtrlSetPos($InputEditBox, 20, 40, $iW - 40, $iM - 85)
GUICtrlSetPos($WebADDRInput, 155, 40, $iW - 175, 20)
GUICtrlSetPos($InputFromFile, 20, 70, $iW - 40, $iM - 115)
GUICtrlSetPos($PathToInputFile, 130, 40, $iW - 150, 20)
GUICtrlSetPos($InputFromWeb, 20, 70, $iW - 40, $iM - 115)
GUICtrlSetPos($patternGroup, 10, $iM - 25, $iW - 20, 60)
GUICtrlSetPos($Test, 20, 235, 40, 20)
GUICtrlSetPos($Pattern, 70, $iM - 5, $iW - 120, 30)
GUICtrlSetPos($DoPtnAdd, $iW - 45, $iM - 10, 30, 18)
GUICtrlSetPos($DoPtnDel, $iW - 45, $iM + 10, 30, 18)
GUICtrlSetPos($returnGroup, 10, $iM + 45, 125, 120)
GUICtrlSetPos($Radio_0, 15, $iM + 65, 117, 18)
GUICtrlSetPos($Radio_1, 15, $iM + 83, 117, 18)
GUICtrlSetPos($Radio_2, 15, $iM + 101, 117, 18)
GUICtrlSetPos($Radio_3, 15, $iM + 119, 117, 18)
GUICtrlSetPos($Radio_4, 15, $iM + 137, 117, 18)
GUICtrlSetPos($offsetGroup, 10, $iM + 175, 125, 50)
GUICtrlSetPos($Offset, 40, $iM + 195, 60, 20)
GUICtrlSetPos($errorGroup, 10, $iM + 235, 125, 50)
GUICtrlSetPos($Err, 20, $iM + 255, 40, 20)
GUICtrlSetPos($Ext, 70, $iM + 255, 50, 20)
GUICtrlSetPos($outputGroup, 145, $iM + 45, $iW - 155, $iH - ($iM + 74))
GUICtrlSetPos($Out, 155, $iM + 61, $iW - 175, $iH - ($iM + 101))
Return $GUI_RUNDEFMSG
EndFunc
Alles anzeigen