Du könntest die ID auch mit _WinAPI_CreateGUID() erzeugen...
Beiträge von Bitnugger
-
-
Schau mal, ob du hiermit was anfangen kannst...
AutoIt
Alles anzeigen;-- TIME_STAMP 2018-11-06 21:03:52 v 0.1 #AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7 #include-once ;~ #include <Array.au3> #include <File.au3> #include <WinAPIConv.au3> ; Press Ctrl+Shift+O in the line with the link to open the link in the browser. ;~ https://autoit.de/index.php?thread/86173-com-error-80020009/&postID=691927#post691927 ;~ https://tel.search.ch/api/help ; The IXMLDOMNodeType enumeration defines the following valid values that can appear in the nodeType property. Global Const $NODE_ELEMENT = 1, $NODE_ATTRIBUTE = 2, $NODE_TEXT = 3, $NODE_CDATA_SECTION = 4, $NODE_ENTITY_REFERENCE = 5, $NODE_ENTITY = 6, $NODE_PROCESSING_INSTRUCTION = 7, $NODE_COMMENT = 8, _ $NODE_DOCUMENT = 9, $NODE_DOCUMENT_TYPE = 10, $NODE_DOCUMENT_FRAGMENT = 11, $NODE_NOTATION = 12 ; API-Key, wird benötigt, wenn mehr als eine Anfrage pro Tag gesendet wird, oder detaillierte Informationen (/feed/entry/tel:.*) benötigt werden. ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Global $key = "" ; Hier den Key eingeben! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; URL für die Anfrage Global $sURL ; Dateiname, unter der das Ergebnis der Anfrage gespeichert werden soll Global $g_sResponse ; Die erstellte/n HTML-Tabelle/n Global $g_sHTML_STRING ;~ _Example_1() _Example_2() Func _Example_1() ; Allgemeiner Suchstring. Suche nach Namen, Rubriken oder Telefonnummern Local $was = "UBS Zürich" _MakeURL($sURL, $was, $key) $g_sResponse = 'api-response_was=' & $was & '.xml' If Not InetGet($sURL, $g_sResponse, 1) Then Exit MsgBox(16, @ScriptName, 'Error by InetGet!') _CW('! "' & $g_sResponse & '" wurde soeben gespeichert' & @CRLF) $g_sHTML_STRING = _Response_XML_To_HTML($g_sResponse) EndFunc ;==>_Example_1 Func _Example_2() $g_sResponse = 'api-response-example.xml' ; Datei muss im Scriptverzeichnis vorhanden sein, weil ich kein API-Key habe! $g_sHTML_STRING = _Response_XML_To_HTML($g_sResponse) EndFunc ;==>_Example_2 Func _MakeURL(ByRef $sURL, $was, $key) If $key Then $sURL = StringFormat("https://tel.search.ch/api/?maxnum=1&was=%s&key=%s", $was, $key) ; mit API-Key suchen Else $sURL = StringFormat("https://tel.search.ch/api/?maxnum=1&was=%s", $was) ; ohne API-Key suchen EndIf EndFunc ;==>_MakeURL Func _Response_XML_To_HTML($sResponse) _CW("> $sResponse --> " & $sResponse & @CRLF) Local Static $aInf = _ [ _ ['Zusammenfassung:' , 'content'], _ ['Pos:' , 'tel:pos'], _ ['ID:' , 'tel:id'], _ ['Art:' , 'tel:type'], _ ['Nachname/Firma:' , 'tel:name'], _ ['Vorname:' , 'tel:firstname'], _ ['Beruf:' , 'tel:occupation'], _ ['Strasse:' , 'tel:street'], _ ['Nr:' , 'tel:streetno'], _ ['PLZ:' , 'tel:zip'], _ ['Ort:' , 'tel:city'], _ ['Tel:' , 'tel:phone'], _ ['Fax:' , 'tel:extra type = "fax"'], _ ['Mobile:' , 'tel:extra type = "mobile"'], _ ; - dieser Eintrag fehlt auf der Seite https://tel.search.ch/api/help ...haben die wohl vergessen! ['E-Mail:' , 'tel:extra type = "email"'], _ ['Website:' , 'tel:extra type = "website"'] _ ], $sInfHeader = StringReplace(_ArrayToString($aInf, '|', -1, -1, '|', 0, 0), ':', '') ; Error monitoring. This will trap all COM errors while alive. ; This particular object is declared as local, meaning after the function returns it will not exist. ObjEvent("AutoIt.Error", "_ErrFunc") Local $html_string = '<html><body>' & @CRLF, $aTel[0][0], $aNodes, $aExtra, $sNode, $iExtra, $iIndex, $iEntrys, $iPos, $oXML, $oNodeList, $oInfos, $oAttributes If Not FileExists($sResponse) Then MsgBox(16, @ScriptName, 'Error: File "' & $sResponse & '" not found!') Return SetError(1, 0, False) EndIf $oXML = ObjCreate("Msxml2.DOMDocument") $oXML.async = False $oXML.load($sResponse) If $oXML.parseError.errorCode Then Local $oErr = $oXML.parseError, $sErr = StringFormat('XML Parse Error\r\n\r\nError Code: %i\r\nError Line: %i\r\nError Reason: %s', $oXML.parseError.errorCode, $oErr.line, $oErr.reason) _CW('! ' & $sErr) MsgBox(16, @ScriptName, $sErr) Return SetError(2, 0, False) EndIf $oInfos = $oXML.SelectNodes("//feed/entry") $iEntrys = $oInfos.length ; Anzahl der entry-Nodes If $iEntrys = 0 Then Return SetError(3, 0, False) ReDim $aTel[$iEntrys][UBound($aInf)] ; Namen der Nodes für die Suche sortieren, damit die Einträge "tel:extra" am Ende der Liste stehen, weil wir den TagName nur einmal suchen wollen $aNodes = _ArrayExtract($aInf, -1, -1, 1, 1) _ArraySort($aNodes) $aExtra = _ArrayFindAll($aNodes, 'tel:extra', 0, 0, 0, 1) For $i = UBound($aExtra) -1 To 0 Step -1 $iExtra = $aExtra[$i] $aExtra[$i] = $aNodes[$aExtra[$i]] _ArrayDelete($aNodes, $iExtra) Next For $i = 0 To UBound($aExtra) -1 Step 1 _ArrayAdd($aNodes, $aExtra[$i]) Next For $i = 0 To UBound($aInf) - 1 Step 1 $iIndex = 0 For $oInfo In $oInfos $sNode = StringRegExpReplace($aNodes[$i], '(.+?) .*', '\1') $oNodeList = $oInfo.getElementsByTagName($sNode) For $n = 0 To $oNodeList.length -1 Step 1 Select Case $oNodeList.item($n).NodeName = 'content' $iPos = _ArraySearch($aInf, $oNodeList.item($n).NodeName, 0, 0, 0, 0, 1, 1) If $iPos > -1 Then _CW(StringFormat('> $sNode --> %-26s $i --> %3i $iIndex --> %3i $iPos --> %3i $n --> %3i $oNodeList.item('&$n&').text --> %s', _ $sNode, $i, $iIndex, $iPos, $n, StringRegExpReplace($oNodeList.item($n).text, '\R(?: ){0,4}', '; '))) $aTel[$iIndex][$iPos] = $oNodeList.item($n).text ; Eintrag unverändert übernehmen ;~ $aTel[$iIndex][$iPos] = StringRegExpReplace($oNodeList.item($n).text, '\R(?: ){0,4}', '; ') ; Zeilenumbrüche und Einrückungen entfernen EndIf Case $oNodeList.item($n).NodeName = 'tel:extra' $oAttributes = $oNodeList.item($n).attributes If $oAttributes.length And $oAttributes.item(0).name = 'type' Then $iPos = _ArraySearch($aInf, StringFormat('%s type = "%s"', $oNodeList.item($n).NodeName, $oAttributes.item(0).value), 0, 0, 0, 3, 1, 1) If $iPos > -1 Then $i = $iPos _CW(StringFormat('+ $sNode --> %-26s $i --> %3i $iIndex --> %3i $iPos --> %3i $n --> %3i $oNodeList.item('&$n&').text --> %s', _ StringFormat('%s type = "%s"', $oNodeList.item($n).NodeName, $oAttributes.item(0).value), $i, $iIndex, $iPos, $n, $oNodeList.item($n).text)) $aTel[$iIndex][$iPos] = $oNodeList.item($n).text EndIf EndIf Case StringLeft($oNodeList.item($n).NodeName, 4) = 'tel:' $iPos = _ArraySearch($aInf, $oNodeList.item($n).NodeName, 0, 0, 0, 0, 1, 1) If $iPos > -1 Then _CW(StringFormat('- $sNode --> %-26s $i --> %3i $iIndex --> %3i $iPos --> %3i $n --> %3i $oNodeList.item('&$n&').text --> %s', _ $sNode, $i, $iIndex, $iPos, $n, $oNodeList.item($n).text)) $aTel[$iIndex][$iPos] = $oNodeList.item($n).text EndIf EndSelect Next $iIndex += 1 Next Next _ArrayDisplay($aTel, '$aTel', '', 0, Default, $sInfHeader) ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; HTML-Tabelle/n erstellen ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - For $i = 0 To UBound($aTel) - 1 Step 1 $html_string &= @TAB & '<table width=500>' & @CRLF For $j = 0 To UBound($aTel, 2) - 1 Step 1 If $j = 0 Then ; Zusammenfassung splitten Local $aSplit = StringSplit($aTel[$i][$j], @LF, 2) If UBound($aSplit) Then For $c = 0 To UBound($aSplit) -1 Step 1 $html_string &= @TAB & @TAB & '<tr><td width=150 align=left>' & ($c = 0 ? $aInf[$j][0] : '') & '</td><td width=350 align=left>' & $aSplit[$c] & '</td></tr>' & @CRLF Next Else $html_string &= @TAB & @TAB & '<tr><td width=150 align=left>' & $aInf[$j][0] & '</td><td width=350 align=left>' & $aTel[$i][$j] & '</td></tr>' & @CRLF EndIf Else $html_string &= @TAB & @TAB & '<tr><td width=150 align=left>' & $aInf[$j][0] & '</td><td width=350 align=left>' & $aTel[$i][$j] & '</td></tr>' & @CRLF EndIf Next $html_string &= @TAB & '</table>' & @CRLF Next $html_string &= '</body></html>' & @CRLF _CW(@CRLF & $html_string) If FileExists('html_string.html') Then If MsgBox(262180,'tel_search_ch', 'Die Datei "html_string.html" existiert bereits, soll sie überschrieben werden?') <> 6 Then Return $html_string ; nein, nicht überschreiben FileDelete('html_string.html') EndIf FileWrite('html_string.html', $html_string) _CW('! "html_string.html" wurde soeben gespeichert' & @CRLF) ShellExecute('html_string.html') Return $html_string EndFunc ;==>_Response_XML_To_HTML Func _CW($sText) ConsoleWrite(_WinAPI_WideCharToMultiByte($sText, 65001) & @CRLF) EndFunc ;==>_CW ; User's COM error function. Will be called if COM error occurs Func _ErrFunc($oError) ; Do anything here. ConsoleWrite(@ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _ @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _ @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _ @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _ @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _ @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _ @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _ @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _ @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _ @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF) EndFunc ;==>_ErrFunc
-
Nutzt du die "Console.au3" selbst? Das sieht so aus als wäre die auf eigene Bedürfnisse zugeschnitten.
Nein, aber die war sehr hilfreich als erste Inspiration bzw. Wegweiser, als ich mich mit dem Thema Console befasst hatte, denn auch ich wollte wissen, ob sich fremde Consolen steuern lassen - und ja, es geht.
Lediglich Zeile 15, 16 (haben da nichts zu suchen und sind nur eine vergessene Notiz zu einem Ticket im blauen Forum) und der Kommentarblock am Ende mit den Funktionsnamen stammen von mir.
Übrigens: Nicht nur die Antworten bringen Erleuchtung, manchmal sind es auch die Fragen!
-
Ok, du willst also für jeden Eintrag eine Tabelle haben... das ist eigentlich kein Problem... aber... wie du schon gemerkt hast, nicht ganz einfach, weil wir das Auslesen der response.xml momentan noch total falsch angehen.
Warum falsch? Weil wir davon ausgehen, dass sich die Reihenfolge der Einträge in der response.xml nicht ändert, was aber nicht der Fall ist!!!
Richtig wäre... umgangssprachlich formuliert:
...
- Besorge mir alle Nodes mit dem NodeNamen "entry"
- Durchsuche alle ChildNodes in diesen Nodes und wenn wir davon eine ChildNode haben wollen, dann füge sie in die aktuelle Tabelle ein.
- Hat die entry-Node keinen Eintrag mehr, dann schließe die Tabelle und wenn es noch mehr entry-Nodes gibt, erstelle eine neue Tabelle und durchsuche die nächste entry-Node.
- Sind alle entry-Nodes durchlaufen, dann schließe die letzte Tabelle und den $html_string mit '</body></html>'.
Falls ich es noch nicht erwähnt habe... das sind auch meine ersten Gehversuche mit XML und momentan weiß ich noch nicht, wie ich an die ChildNodes der einzelnen entry-Nodes komme!
Heute habe ich aber schon mehr als genug getan und morgen ist wohlverdienter Ruhetag... du wirst also frühestens Mo. gegen Abend wieder von mir hören.
-
Darum hab ich mir bisher nie weitere Gedanken bzgl des "Showflags" gemacht, aber ich kann dann bestimmt auch @SW_SHOW nehmen, wenn es dafür mit Flag sauberer ist?
Ja, wenn du die Console sehen willst, ansonsten eben @SW_HIDE oder Default.
Bzgl $STDIN_CHILD, $STDERR_MERGED beim SubThread, könnte das vlt helfen das ein SubThread befehle an die PythonApp senden kann?
Ich denke mal nein, denn das geht wohl nur, wenn die PythonApp von diesem SubThread gestartet wurde und somit dessen Child ist. $STDIN_CHILD, $STDERR_MERGED beim SubThread sogt nur dafür, dass der MainThread darauf zugreifen kann.
Du könntest aber die Console der PythonApp mit _WinAPI_AttachConsole() an die des SubThread anfügen... dann sollte es mit StdinWrite() oder _WinAPI_WriteConsole() gehen.
Schau dir mal die Console.au3 im Anhang an... das hilft dir bestimmt weiter.
-
Mein MainThread startet mit $iPythonPID = Run($sPythonAPIPath & "Main_work.exe", $sPythonAPIPath, "", $STDIN_CHILD + $STDERR_MERGED) die PythonApp.
Du gibst hier als showflag "" an... auch wenn es funktioniert, ich würde es ändern in @SW_HIDE oder Default.
Später startet mein MainThread einen SubThread mit $iPID = Run($sMultiThreadFile & " --au-thread """ & $sCallback & """").
Hier fehlt das opt_flag... und die Anführungszeichen... scheinen mir einige überflüssig zu sein.
Versuche es mal so...
$iPythonPID = Run($sPythonAPIPath & "Main_work.exe", $sPythonAPIPath, @SW_HIDE, BitOr($STDIN_CHILD, $STDERR_MERGED) )
$iPID = Run($sMultiThreadFile & ' --au-thread "' & $sCallback & '"', '', @SW_HIDE, BitOr($STDIN_CHILD, $STDERR_MERGED))
oder so...
$iPID = Run(StringFormat('"%s" --au-thread "%s"', $sMultiThreadFile, $sCallback), '', @SW_HIDE, BitOr($STDIN_CHILD, $STDERR_MERGED))
...oder du nimmst für den SubThread als opt_flg $STDIO_INHERIT_PARENT, wenn der MainThread als Konsolenanwendung (CUI) kompiliert wurde.
-
Nur wenn ich von meinem SubThread per StdinWrite/-Read auf die PythonApp zugreifen möchte, passiert nichts.
Wie startest du denn die PythonApp.exe mit der main.exe?
Meiner Recherche nach funktionieren die Funktionen nur wenn die jeweilige Anwendung ein "Child Prozess" ist?!
Du meinst mit den nativen AutoIt-Funktionen... ja, das stimmt, aber es gibt ja noch andere Wege (DllCall), um an die Ausgaben einer Console zu kommen. Das Problem sollte für dich aber ohne Bedeutung sein, da die PythonApp.exe und auch die SubTasks von deiner main.exe gestartet wurden und diese somit Child-Prozesse der main.exe sind.
-
Du doch einen kurzen Tipp, wie kann ich solche Herangehensweisen erlernen, wie ich ein Problem am Besten löse und wie ich zb. mehrere Schleifen ineinanderpacke oder wie ich kompliziertere Arrays aufbaue. Durch Praxis?
Die optimale Herangehensweise ergibt sich automatisch, wenn du genügend Erfahrungen gesammelt hast und du dir nicht mehr bei jeder Funktion noch mal die Hilfe anschauen musst, damit du weiß was da passiert, denn das lenkt enorm von der eigentlichen Aufgabe ab. Erfahrungen bekommt man durch Üben, denn Übung macht den Meister!
Es gibt kleine Hürden, die man oft nicht mal bemerkt oder nur als lästigen Stolperstein wahrnimmt, aber auch große, die einem alles abverlangen, die man erst nach einem langen, erbitterten und hartem Kampf als gelöst abhaken kann, und auch solche, die einem schier unlösbar erscheinen, dies aber auch nur, weil einem das nötige Rüstzeug dafür noch fehlt.
Ich würde mal vorsichtig schätzen, dass rund 95 % der Coder an den großen Hürden scheitern, weil sie zu früh aufgegeben haben, denn nur in den seltensten Fällen liegt es daran, weil ihnen die nötige Intelligenz fehlt.
Mehrere Schleifen ineinander verschachteln... das wie ergibt sich doch automatisch. Jede innere Schleife hat eine spezielle Aufgabe und benötigt die äußere Schleife, um an die Daten zu kommen, die in ihr verarbeitet werden sollen. Sehr hilfreich ist, wenn man die Aufgabenstellung umgangssprachlich formuliert, wodurch die benötigten Schleifen dann quasi von links nach rechts (von außen nach innen) ablesbar sind.
Komplizierte Arrays... damit meinst du sicher mehrdimensionale Arrays... die sind aber nicht wirklich komplizierter, sondern beinhalten einfach nur mehr Daten. Kompliziert wird es, wenn man sich scheut, diese zu nutzen. Hier findest du ein Array-Tutorial von BugFix : Was ist ein Array?
-
Dann versuche doch mal, die PID der PythonApp.exe als Umgebungsvariable zu speichern, wenn du sie mit der Main.exe startest, damit dein SubThread sie dann mit EnvGet auslesen kann. Wenn das nicht funktioniert, speichere sie in ein Lockfile, dass dein SubThread sie daraus auslesen kann.
-
Für Dich als Profi ist es vermutlich Gebastel, würde mich aber trotzdem interessieren, wie Du dieses bewertest.
Diese Frage ist für mich extrem schwer zu beantworten, weil ich mich gar nicht mehr in die Lage versetzten kann, wie ich an so eine Aufgabe herangegangen wäre, als ich noch Anfänger in Sachen AutoIt war... eine Bewertung von mir reflektiert also bestenfalls, wie gut oder schlecht ich einen Profi bewerten würde... das bist du momentan definitiv noch nicht, wirst es aber ganz sicher werden, wenn du so weiter machst! Nach dem Schema von IMDB bekommst du dafür fette 7/10. Wieso nur 7? Weil du bei deiner Anpassung ein paar Fehler gemacht hast, die du hättest sehen müssen und auch alle Fehler übersehen hast, die in meinen Beispielen stecken, denn sobald sich irgendwas an der API ändert, könnte es dazu führen, dass das Script nicht mehr funktioniert.
Ich habe schon mit einer erweiterten Version angefangen, die solche Änderungen berücksichtigt... werde evtl. morgen damit fertig.
Hier noch kurz die mir aufgefallen Fehler in der umgebauten Funktion _Response_XML_To_Array...
- Der Funktionsname macht keinen Sinn mehr, da die Funktion kein Array mehr als Ergebnis liefert, sondern einen String. ==> _Response_XML_To_HTML
- Zeile 7, hier macht das Static keinen Sinn... solche Fehler können dich in großen Skripten zum Wahnsinn treiben.
- Zeile 41 muss vor Zeile 40, also nicht mit in die Schleife, weil wir ja nur eine Tabelle haben wollen.
- Zeile 57 muss vor Zeile 71, weil wir den schließenden Tag für die Tabelle erst setzen dürfen, wenn alles fertig ist.
- In $aInf hättest du noch die Strings für tel:extra ... einpflegen können, aber ok, das ist nicht wirklich ein Fehler.
Hier die korrigierte Version mit angepasstem Namen...
AutoIt
Alles anzeigenFunc _Response_XML_To_HTML($sResponse) _CW("$sResponse --> " & $sResponse) Local Static $aTel[1][12] = [['content', 'tel:pos', 'tel:id', 'tel:type', 'tel:name', 'tel:firstname', 'tel:occupation', 'tel:street', 'tel:streetno', 'tel:zip', 'tel:city', 'tel:phone']] Local Static $aInf[16] = _ ['Zusammenfassung:', _ ; content 'Pos:', _ ; tel:pos 'ID:', _ ; tel:id 'Art:', _ ; tel:type 'Nachname/Firma:', _ ; tel:name 'Vorname:', _ ; tel:firstname 'Beruf:', _ ; tel:occupation 'Strasse:', _ ; tel:street 'Nr:', _ ; tel:streetno 'PLZ:', _ ; tel:zip 'Ort:', _ ; tel:city 'Tel:', _ ; tel:phone 'Fax:', _ ; tel:extra type = "fax" 'Mobile:', _ ; tel:extra type = "mobile" - dieser Eintrag fehlt auf der Seite https://tel.search.ch/api/help ...haben die wohl vergessen! 'E-Mail:', _ ; tel:extra type = "email" 'Website:' _ ; tel:extra type = "website" ] Local $html_string = '<html><body>', $iIndex, $aContent, $oElemList, $oXML, $sAttribValue $oXML = ObjCreate("Msxml2.DOMDocument") $oXML.load('api-response.xml') If Not FileExists($sResponse) Then Exit MsgBox(16, @ScriptName, 'Error: File "' & $sResponse & '" not found!') If Not $oXML.load($sResponse) Then Exit MsgBox(16, @ScriptName, 'Error by $oXML.load --> "' & $sResponse & '"') $oElemList = $oXML.SelectNodes('//feed/entry/tel:extra') For $i = 0 To UBound($aTel, 2) - 1 Step 1 $iIndex = 1 $oInfos = $oXML.SelectNodes("//feed/entry/" & $aTel[0][$i]) ; or //Other For $oInfo In $oInfos If $i = 0 Then ReDim $aTel[UBound($aTel) + 1][12] If _ArraySearch($aTel, $oInfo.NodeName, 0, 0) = -1 Then ContinueLoop $aTel[$iIndex][$i] = $oInfo.Text Do $aTel[$iIndex][$i] = StringReplace($aTel[$iIndex][$i], ' ', ' ') Until @extended = 0 $aTel[$iIndex][$i] = StringReplace($aTel[$iIndex][$i], @LF, ';') $iIndex += 1 Next Next If UBound($aTel) < 2 Then Return SetError(1, 0, False) ; keine Einträge gefunden ConsoleWrite(@CRLF) $html_string &= '<table width=400>' For $i = 1 To UBound($aTel) - 1 Step 1 For $j = 0 To UBound($aTel, 2) - 1 Step 1 If $j = 0 Then $aContent = StringSplit($aTel[$i][$j], '; ', 3) If @error Then ContinueLoop ;~ _ArrayDisplay($aContent, '$aContent') _CW(StringFormat('- %-56s: %s', $aInf[$j], $aContent[0])) For $k = 1 To UBound($aContent) - 1 Step 1 _CW(StringFormat('- %-56s: %s', '', $aContent[$k])) Next Else If $aTel[$i][$j] = '' Then ContinueLoop _CW(StringFormat('- %-56s: %s', $aInf[$j], $aTel[$i][$j])) $html_string &= '<tr><td width=150 align=left>' & $aInf[$j] & '</td><td width=250 align=left>' & $aTel[$i][$j] & '</td></tr>' EndIf Next Next For $oElem In $oElemList $oAttributes = $oElem.attributes $iAttribute = 0 For $oAttribute In $oAttributes $iAttribute += 1 If $oAttribute.name = 'type' Then Switch $oAttribute.value Case 'fax' $sAttribValue = $aInf[12] Case 'mobile' $sAttribValue = $aInf[13] Case 'email' $sAttribValue = $aInf[14] Case 'website' $sAttribValue = $aInf[15] Case Else ContinueLoop EndSwitch $html_string &= '<tr><td width=150 align=left>' & $sAttribValue & '</td><td width=250 align=left>' & $oElem.Text & '</td></tr>' _CW(StringFormat('> .NodeName = %-22s .Text = %-42s .nodeTypeString = %-20s .nodeType = %s $iAttribute = %i $oAttribute.name = %s $oAttribute.value = %s', _ $oElem.NodeName, $oElem.Text, $oElem.nodeTypeString, $oElem.nodeType, $iAttribute, $oAttribute.name, $oAttribute.value)) EndIf Next Next $html_string &= '</table>' $html_string &= '</body></html>' _CW($html_string) If Not FileExists('html_string.html') Then FileWrite('html_string.html', $html_string) Return $html_string EndFunc ;==>_Response_XML_To_HTML
-
Ich brauche das Gegenstück zu GUICtrlSetPos()
Local $PositionInputBox = ControlGetPos($hGUIParent1, '', $id)
-
Hier hast du schon mal eine kleine Hilfe und somit was zum Spielen...
AutoIt
Alles anzeigen;-- TIME_STAMP 2018-10-31 19:17:12 v 0.1 #include <Array.au3> ;~ Local $oXML = ObjCreate("Microsoft.XMLDOM") ; deprecated Local $oXML = ObjCreate("Msxml2.DOMDocument") $oXML.load('api-response-example.xml') Local $sAttrib, $iAttribute, $oAttributes, $oElemList, $oRoot = $oXML.documentElement For $Child In $oRoot.childNodes $sAttrib = '' If $Child.NodeName = 'link' Then $oAttributes = $Child.attributes For $oAttribute In $oAttributes If $oAttribute.name = 'href' Then $sAttrib = $oAttribute.value ExitLoop EndIf Next EndIf ConsoleWrite(StringFormat('- %-30s %s\r\n', $Child.NodeName, StringReplace($Child.Text, @LF & ' ', @LF & '- ' & _Space(31)) & $sAttrib)) Next ConsoleWrite('--------------------------------' & @CRLF) Local $iAttribute, $oAttributes, $oElemList = $oXML.SelectNodes('//feed/entry/tel:extra') For $oElem In $oElemList $oAttributes = $oElem.attributes $iAttribute = 0 For $oAttribute In $oAttributes $iAttribute += 1 If $oAttribute.name = 'type' Then ConsoleWrite(StringFormat('> .NodeName = %-22s .Text = %-42s .nodeTypeString = %-20s .nodeType = %s $iAttribute = %i $oAttribute.name = %s $oAttribute.value = %s\r\n', _ $oElem.NodeName, $oElem.Text, $oElem.nodeTypeString, $oElem.nodeType, $iAttribute, $oAttribute.name, $oAttribute.value)) EndIf Next Next Func _Space($iNum) Local $sSpace For $i = 1 To $iNum Step 1 $sSpace &= ' ' Next Return $sSpace EndFunc
-
Da Kanton bei uns weniger wichtig, habe ich tel:canton mit tel:extra type="Fax" ersetzt.
In das Array $aTel sollen die Namen der Knoten rein, die du ausgewertet haben willst... und du hast es auch fast richtig gemacht.
Allerdings darfst du anstelle tel:canton nicht tel:extra type="fax" schreiben, sondern nur tel:extra, weil dem Knoten mit type lediglich das Attribut "fax" zugewiesen wird und dieser Teil somit nicht mehr zum Namen des Knoten gehört.
Das Script bricht mit einem COM ERROR ab, weil es (noch) keinen COM ERROR HANDLER gibt und in dem Array $aTel für jeden Knoten jeweils nur ein Wert gespeichert wird, tel:extra aber mehrere hat - daran hatte ich gar nicht gedacht.
Heute habe ich aber keine Energie mehr, um noch was zu machen und morgen bin ich zum Brunch eingeladen... danach werde ich den Rest des Tages durch Alkohol bedingte Unfähigkeit glänzen... komme also frühestens Fr. dazu, mich wieder damit zu befassen.
Das erste Example war dazu gedacht, eine Anfrage ohne API-Key zu machen, das zweite mit API-Key. Ich habe aber kein API-Key und werte deshalb im zweiten Example die manuell heruntergeladene api-response-example.xml aus, die hier als Beispiel bereitgestellt wird.
-
Wäre es möglich...
Ja, das ist möglich.
Hier noch mal eine letzte Version...
AutoIt
Alles anzeigen;-- TIME_STAMP 2018-10-29 22:11:03 v 0.1 #include-once ;~ #include <Array.au3> #include <File.au3> #include <WinAPIConv.au3> ;~ https://tel.search.ch/api/help Global Enum $e_content, $e_telpos, $e_telid, $e_teltype, $e_telname, $e_telfirstname, $e_teloccupation, $e_telstreet, $e_telstreetno, $e_telzip, $e_telcity, $e_telcanton, $e_telphone, $e_telSizeOff Global $g_aResponse, $FO = '> tel:id : %-22s, tel:name : %-48s, telfirstname : %-32s, telphone : %s\r\n' ; API-Key, wird benötigt, wenn mehr als eine Anfrage pro Tag gesendet wird, oder wenn detaillierte Informationen (/feed/entry/tel:.*) benötigt werden. ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Global $key = "" ; Hier den Key eingeben! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; URL für die Anfrage Global $sURL ; Dateiname, unter der das Ergebnis der Anfrage gespeichert werden soll Global $g_sResponse _Example_1() ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' & @CRLF & @CRLF) _Example_2() ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' & @CRLF & @CRLF) Func _Example_1() ; Allgemeiner Suchstring. Suche nach Namen, Rubriken oder Telefonnummern Local $was = "UBS Zürich" _MakeURL($sURL, $was, $key) $g_sResponse = 'api-response_was=' & $was & '.xml' If Not InetGet($sURL, $g_sResponse, 1) Then Exit MsgBox(16, @ScriptName, 'Error by InetGet!') _CW('! "' & $g_sResponse & '" wurde soeben gespeichert' & @CRLF) $g_aResponse = _Response_XML_To_Array($g_sResponse) If Not @error Then _ShowResponse() EndFunc ;==>_Example_1 Func _Example_2() $g_sResponse = 'api-response-example.xml' ; Datei muss im Scriptverzeichnis vorhanden sein! $g_aResponse = _Response_XML_To_Array($g_sResponse) If Not @error Then _ShowResponse() EndFunc ;==>_Example_2 Func _MakeURL(ByRef $sURL, $was, $key) If $key Then $sURL = StringFormat("https://tel.search.ch/api/?maxnum=1&was=%s&key=%s", $was, $key) ; mit API-Key suchen Else $sURL = StringFormat("https://tel.search.ch/api/?maxnum=1&was=%s", $was) ; ohne API-Key suchen EndIf EndFunc ;==>_MakeURL Func _ShowResponse() _ArrayDisplay($g_aResponse, '$g_aResponse') For $i = 1 To UBound($g_aResponse) - 1 Step 1 If $g_aResponse[$i][$e_telid] Then ConsoleWrite(StringFormat($FO, $g_aResponse[$i][$e_telid], $g_aResponse[$i][$e_telname], $g_aResponse[$i][$e_telfirstname], $g_aResponse[$i][$e_telphone])) _ShowTelData($g_aResponse[$i][$e_telid], $e_telid) _ShowTelData($g_aResponse[$i][$e_telname], $e_telname) _ShowTelData($g_aResponse[$i][$e_telname], $e_telname, 1) ; partial search EndIf Next Local $sSaveAs = StringTrimRight($g_sResponse, 3) & 'txt' _FileWriteFromArray($sSaveAs, $g_aResponse, Default, Default, '|') ; Ausgewertete Daten in Datei speichern, um sie wieder in ein Array laden zu können. ShellExecute($sSaveAs) MsgBox(64, @ScriptName, 'Click OK to continue') EndFunc ;==>_ShowResponse Func _ShowTelData($vData, $iField, $iCompare = 0) Local $aShow[0][$e_telSizeOff], $aFindAll _ArrayAdd($aShow, _ArrayToString(_ArrayExtract($g_aResponse, 0, 0, -1, -1))) $aFindAll = _ArrayFindAll($g_aResponse, $vData, 1, 0, 0, $iCompare, $iField) If Not @error Then For $i = 0 To UBound($aFindAll) - 1 Step 1 _ArrayAdd($aShow, _ArrayExtract($g_aResponse, $aFindAll[$i], $aFindAll[$i], -1, -1)) Next _ArrayDisplay($aShow, '$aRet - $iCompare = ' & $iCompare & ', ' & $g_aResponse[0][$iField] & ' = ' & $vData) EndIf EndFunc ;==>_ShowTelData Func _Response_XML_To_Array($sResponse) Local Static $aTel[1][13] = [['content', 'tel:pos', 'tel:id', 'tel:type', 'tel:name', 'tel:firstname', 'tel:occupation', 'tel:street', 'tel:streetno', 'tel:zip', 'tel:city', 'tel:canton', 'tel:phone']] Local Static $aInf[13] = _ [ 'Zusammenfassung des Eintrags in Plaintext', _ ; content 'Position des Eintrags im gesamten Resultateset', _ ; tel:pos 'Eindeutige tel.search.ch-ID des Eintrags', _ ; tel:id 'Art des Eintrags: Person oder Organisation', _ ; tel:type 'Nachname der Person resp. Name der Firma/Organisation', _ ; tel:name 'Vorname der Person', _ ; tel:firstname 'Beruf der Person, Zusatzbezeichnung bei Firmeneinträgen', _ ; tel:occupation 'Strassenbezeichnung', _ ; tel:street 'Hausnummer', _ ; tel:streetno 'Postleitzahl', _ ; tel:zip 'Ortsbezeichnung', _ ; tel:city 'Kantonskürzel (ZH,BE,AG,...)', _ ; tel:canton 'Telefonnummer mit Ländervorwahl' _ ; tel:phone ] If Not FileExists($sResponse) Then Exit MsgBox(16, @ScriptName, 'Error: File "' & $sResponse & '" not found!') Local $oXML = ObjCreate("Microsoft.XMLDOM") If Not $oXML.load($sResponse) Then Exit MsgBox(16, @ScriptName, 'Error by $oXML.load --> "' & $sResponse & '"') Local $iIndex, $aContent For $i = 0 To UBound($aTel, 2) - 1 Step 1 $iIndex = 1 $oInfos = $oXML.SelectNodes("//feed/entry/" & $aTel[0][$i]) ; or //Other For $oInfo In $oInfos If $i = 0 Then ReDim $aTel[UBound($aTel) + 1][13] If _ArraySearch($aTel, $oInfo.NodeName, 0, 0) = -1 Then ContinueLoop $aTel[$iIndex][$i] = $oInfo.Text Do $aTel[$iIndex][$i] = StringReplace($aTel[$iIndex][$i], ' ', ' ') Until @extended = 0 $aTel[$iIndex][$i] = StringReplace($aTel[$iIndex][$i], @LF, ';') $iIndex += 1 Next Next If UBound($aTel) < 2 Then Return SetError(1, 0, False) ; keine Einträge gefunden ConsoleWrite(@CRLF) For $i = 1 To UBound($aTel) - 1 Step 1 For $j = 0 To UBound($aTel, 2) - 1 Step 1 If $j = 0 Then $aContent = StringSplit($aTel[$i][$j], '; ', 3) If @error Then ContinueLoop _ArrayDisplay($aContent, '$aContent') _CW(StringFormat('%-56s: %s\r\n', $aInf[$j], $aContent[0])) For $k = 1 To UBound($aContent) -1 Step 1 _CW(StringFormat('%-56s: %s\r\n', '', $aContent[$k])) Next Else If $aTel[$i][$j] = '' Then ContinueLoop _CW(StringFormat('%-56s: %s\r\n', $aInf[$j], $aTel[$i][$j])) EndIf Next ConsoleWrite(@CRLF) Next Return $aTel EndFunc ;==>_Response_XML_To_Array Func _CW($sText) ConsoleWrite(_WinAPI_WideCharToMultiByte($sText, 65001)) EndFunc ;==>_CW
-
Das hier läuft bei mir wie es soll... kann allerdings nur ohne API-Key testen. Den musst du noch eingeben, wenn du mit abfragen willst, um detaillierte Informationen (/feed/entry/tel:.*) zu bekommen!
AutoIt
Alles anzeigen;-- TIME_STAMP 2018-10-29 15:51:57 v 0.1 #include-once ;~ #include <Array.au3> #include <File.au3> ;-- Press Ctrl+Shift+O in the line with the link to open the link in the browser. ;-- https://tel.search.ch/api/help Global Enum $e_content, $e_telpos, $e_telid, $e_teltype, $e_telname, $e_telfirstname, $e_teloccupation, $e_telstreet, $e_telstreetno, $e_telzip, $e_telcity, $e_telcanton, $e_telphone, $e_telSizeOff Global $g_aResponse, $FO = '> $e_telid: %-22s, %-telname: %-48s, telfirstname: %-32s, telphone: %s\r\n' ; API-Key, wird benötigt, wenn mehr als eine Anfrage pro Tag gesendet wird, oder wenn detaillierte Informationen (/feed/entry/tel:.*) benötigt werden. ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Global $key = "" ; Hier den Key eingeben! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; Allgemeiner Suchstring. Suche nach Namen, Rubriken oder Telefonnummern Global $was = "UBS Zürich" ; URL für die Anfrage Global $sURL If $key Then $sURL = StringFormat("https://tel.search.ch/api/?maxnum=1&was=%s&key=%s", $was, $key) ; mit API-Key suchen Else $sURL = StringFormat("https://tel.search.ch/api/?maxnum=1&was=%s", $was) ; ohne API-Key suchen EndIf ; Dateiname, unter der das Ergebnis der Anfrage gespeichert werden soll Global $sResponse = 'api-response_was=' & $was & '.xml' If Not InetGet($sURL, $sResponse, 1) Then Exit MsgBox(16, @ScriptName, 'Error by InetGet!') ConsoleWrite('! "'&$sResponse&'" wurde soeben gespeichert' & @CRLF) $g_aResponse = _Response_XML_To_Array($sResponse) If Not @error Then For $i = 1 To UBound($g_aResponse) - 1 Step 1 ConsoleWrite(StringFormat($FO, $g_aResponse[$i][$e_telid], $g_aResponse[$i][$e_telname], $g_aResponse[$i][$e_telfirstname], $g_aResponse[$i][$e_telphone])) _ShowTelData($g_aResponse[$i][$e_telid], $e_telid) _ShowTelData($g_aResponse[$i][$e_telname], $e_telname) _ShowTelData($g_aResponse[$i][$e_telname], $e_telname, 1) ; partial search Next Local $sSaveAs = StringTrimRight($sResponse, 3) & 'txt' _FileWriteFromArray($sSaveAs, $g_aResponse, Default, Default, '|') ShellExecute($sSaveAs) EndIf Func _ShowTelData($vData, $iField, $iCompare = 0) Local $aRet[0][$e_telSizeOff], $aFindAll _ArrayAdd($aRet, _ArrayToString(_ArrayExtract($g_aResponse, 0, 0, -1, -1))) $aFindAll = _ArrayFindAll($g_aResponse, $vData, 1, 0, 0, $iCompare, $iField) If Not @error Then For $i = 0 To UBound($aFindAll) - 1 Step 1 _ArrayAdd($aRet, _ArrayExtract($g_aResponse, $aFindAll[$i], $aFindAll[$i], -1, -1)) Next _ArrayDisplay($aRet, '$aRet - $iCompare = ' & $iCompare & ', ' & $g_aResponse[0][$iField] & ' = ' & $vData) EndIf EndFunc ;==>_ShowTelData Func _Response_XML_To_Array($sResponse_XML) Local Static $aTel[1][13] = [['content', 'tel:pos', 'tel:id', 'tel:type', 'tel:name', 'tel:firstname', 'tel:occupation', 'tel:street', 'tel:streetno', 'tel:zip', 'tel:city', 'tel:canton', 'tel:phone']] If Not FileExists($sResponse_XML) Then Exit MsgBox(16, @ScriptName, 'Error: File "' & $sResponse_XML & '" not found!') Local $oXML = ObjCreate("Microsoft.XMLDOM") If Not $oXML.load($sResponse_XML) Then Exit MsgBox(16, @ScriptName, 'Error by $oXML.load --> "' & $sResponse_XML & '"') Local $iIndex For $i = 0 To UBound($aTel, 2) - 1 Step 1 $iIndex = 1 $oInfos = $oXML.SelectNodes("//feed/entry/" & $aTel[0][$i]) ; or //Other For $oInfo In $oInfos If $i = 0 Then ReDim $aTel[UBound($aTel) + 1][13] $aTel[$iIndex][$i] = $oInfo.Text Do $aTel[$iIndex][$i] = StringReplace($aTel[$iIndex][$i], ' ', ' ') Until @extended = 0 $aTel[$iIndex][$i] = StringReplace($aTel[$iIndex][$i], @LF, ',') $iIndex += 1 ConsoleWrite(StringFormat('NodeName = %-14s , Text = %s\r\n', $oInfo.NodeName, $oInfo.Text)) Next Next If UBound($aTel) < 2 Then Return SetError(1, 0, False) ; keine Einträge gefunden _ArrayDisplay($aTel, '$aTel') Return $aTel EndFunc ;==>_Response_XML_To_Array
-
So wie ich das rausfinden konnte, kann ich diese Knoten dann nicht direkt über xml ansprechen, sondern muss im Script eine Abfrage machen, dass nur zb. Daten des Knoten so&so, wo id = so&so ist, erfasst werden. Ist das so korrekt oder gibts da doch eine elegantere Lösung
Knoten = Node
Das ginge, wenn du in einem ersten Durchlauf die IDs aus der response.xml ausliest.
Schau mal hier... vielleicht bringt dich das auf den rechten Weg...
AutoIt
Alles anzeigen;-- TIME_STAMP 2018-10-29 00:28:14 v 0.1 #include <Array.au3> Global Enum $e_content, $e_telpos, $e_telid, $e_teltype, $e_telname, $e_telfirstname, $e_teloccupation, $e_telstreet, $e_telstreetno, $e_telzip, $e_telcity, $e_telcanton, $e_telphone, $e_telSizeOff Global $FO = '> $e_telid: %-22s, %-telname: %-48s, telfirstname: %-32s, telphone: %s\r\n' Global $g_aResponse = _Response_XML_To_Array('api-response-example.xml') If Not @error Then For $i = 1 To UBound($g_aResponse) - 1 Step 1 ConsoleWrite(StringFormat($FO, $g_aResponse[$i][$e_telid], $g_aResponse[$i][$e_telname], $g_aResponse[$i][$e_telfirstname], $g_aResponse[$i][$e_telphone])) _ShowTelData($g_aResponse[$i][$e_telid], $e_telid) _ShowTelData($g_aResponse[$i][$e_telname], $e_telname) _ShowTelData($g_aResponse[$i][$e_telname], $e_telname, 1) ; partial search Next EndIf Func _ShowTelData($vData, $iField, $iCompare = 0) Local $aRet[0][$e_telSizeOff], $aFindAll Local $iAdd = _ArrayAdd($aRet, _ArrayToString(_ArrayExtract($g_aResponse, 0, 0, -1, -1))) ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & " var: $iAdd --> " & $iAdd & @CRLF) $aFindAll = _ArrayFindAll($g_aResponse, $vData, 1, 0, 0, $iCompare, $iField) If Not @error Then For $i = 0 To UBound($aFindAll) - 1 Step 1 _ArrayAdd($aRet, _ArrayExtract($g_aResponse, $aFindAll[$i], $aFindAll[$i], -1, -1)) Next _ArrayDisplay($aRet, '$aRet - $iCompare = ' & $iCompare & ', ' & $g_aResponse[0][$iField] & ' = ' & $vData) EndIf EndFunc ;==>_ShowTelData Func _Response_XML_To_Array($sResponse_XML) Local Static $aTel[1][13] = [['content', 'tel:pos', 'tel:id', 'tel:type', 'tel:name', 'tel:firstname', 'tel:occupation', 'tel:street', 'tel:streetno', 'tel:zip', 'tel:city', 'tel:canton', 'tel:phone']] If Not FileExists($sResponse_XML) Then Exit MsgBox(16, @ScriptName, 'Error: File "' & $sResponse_XML & '" not found!') Local $oXML = ObjCreate("Microsoft.XMLDOM") If Not $oXML.load($sResponse_XML) Then Exit MsgBox(16, @ScriptName, 'Error by $oXML.load --> "' & $sResponse_XML & '"') Local $iIndex For $i = 0 To UBound($aTel, 2) - 1 Step 1 $iIndex = 1 $oInfos = $oXML.SelectNodes("//feed/entry/" & $aTel[0][$i]) ; or //Other For $oInfo In $oInfos If $i = 0 Then ReDim $aTel[UBound($aTel) + 1][13] $aTel[$iIndex][$i] = StringReplace($oInfo.Text, @LF, '|') $iIndex += 1 ConsoleWrite(StringFormat('NodeName = %-14s , Text = %s\r\n', $oInfo.NodeName, $oInfo.Text)) Next Next If UBound($aTel) < 2 Then Return SetError(1, 0, False) ; keine Einträge gefunden _ArrayDisplay($aTel, '$aTel') Return $aTel EndFunc ;==>_Response_XML_To_Array
-
Hallo Bitnagger,
Mein Nick ist Bitnugger
ist es Möglich, mit dem Befehl _GUICtrlListView_FindInText nur in einer Spalte zu suchen, ohne 'www.'
Nein, das ist nicht möglich.
Ich würde aber eh hingehen und die Daten in einem Array verwalten und dann auch darin suchen, denn so kannst du explizit eine Spalte angeben, in der gesucht werden soll.
Schau mal, ob dir das hier weiterhilft...
AutoIt
Alles anzeigen;-- TIME_STAMP 2018-10-28 22:38:27 v 0.1 #include <GUIConstantsEx.au3> #include <GuiImageList.au3> #include <GuiListView.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> ;~ #include <WinAPISys.au3> #include <WinAPIConv.au3> Global $g_hListView, $g_idInputSuche, $g_hInputSuche Global $g_iSearchColumn = 0 Global $g_aLVData = _ [ _ [1, 'www.domain1' , 'überschrift1', 'domainbeschreibung1 Beschreibungtext1'], _ [2, 'www.nocheinedomain2' , 'überschrift2', 'domainbeschreibung2 Beschreibungtext2'], _ ; hier hattest du "www.nocheinedomian2" stehen! [3, 'www.wiedereinedomain3' , 'überschrift3', 'domainbeschreibung3 Beschreibungtext3'], _ ; hier hattest du "www.wiedereinedomains3" stehen! [4, 'www.tolledomain4' , 'überschrift4', 'domainbeschreibung4 Beschreibungtext4'] _ ] Example() Func Example() Local $hGUI, $hImage $hGUI = GUICreate('ListView - Suche in Spalte n', 700, 305) $g_hListView = _GUICtrlListView_Create($hGUI, "Projekt-Nr.|Domainname|Überschrift|Beschreibung", 2, 2, 694, 268, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS)) _GUICtrlListView_SetExtendedListViewStyle($g_hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_BORDERSELECT)) _GUICtrlListView_SetSelectedColumn($g_hListView, $g_iSearchColumn) $g_idInputSuche = GUICtrlCreateInput('Suchtext eingeben...', 2, 275, 120, 22) $g_hInputSuche = GUICtrlGetHandle($g_idInputSuche) GUICtrlSetColor($g_idInputSuche, 0x008800) GUICtrlCreateLabel('Info: Spaltenüberschrift anklicken, um die Spalte zu ändern, in der gesucht werden soll.', 130, 278, 430, 22) ControlFocus($g_hListView, '', '') Local $idEnterDummy = GUICtrlCreateDummy() ; Set GUIAccelerator (for the input control) Local $aAccelKeys[1][2] = [["{ENTER}", $idEnterDummy]] GUISetAccelerators($aAccelKeys) GUISetState(@SW_SHOW) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ; Add items _GUICtrlListView_AddArray($g_hListView, $g_aLVData) ; Alle Daten in einem Rutsch hinzufügen Local $aColumnWidth = [50, 150, 180, 250] For $i = 0 To UBound($aColumnWidth) -1 Step 1 _GUICtrlListView_SetColumnWidth($g_hListView, $i, $aColumnWidth[$i]) Next ; Loop until the user exits. #Region - GUI SwitchLoop While True Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $idEnterDummy ConsoleWrite('Msg = $idEnterDummy' & @CRLF) If ControlFocus($hGUI, '', $g_idInputSuche) Then _SelectSearchInListView() EndIf EndSwitch WEnd #EndRegion GUIDelete() EndFunc ;==>Example Func _SelectSearchInListView() ConsoleWrite('> _SelectSearchInListView:' & @CRLF) Local Static $iStart = 0, $iEnd = 0, $iCase = 0, $iCompare = 1, $iForward = 1, $iSearchColumn = -1, $sOldSuchtext Local $iIndex = -1, $sSuchtext = GUICtrlRead($g_idInputSuche) If $iSearchColumn <> $g_iSearchColumn Then $iSearchColumn = $g_iSearchColumn $iStart = 0 $sOldSuchtext = '' EndIf _GUICtrlListView_SetSelectedColumn($g_hListView, $g_iSearchColumn) If $sSuchtext And $sSuchtext <> 'Suchtext eingeben...' Then Local $iItemCount = _GUICtrlListView_GetItemCount($g_hListView) If $sOldSuchtext = $sSuchtext Then $iStart += 1 Else $sOldSuchtext = $sSuchtext EndIf $iIndex = _ArraySearch($g_aLVData, $sSuchtext, $iStart, $iEnd, $iCase, $iCompare, $iForward, $g_iSearchColumn) If $iIndex = -1 Then $iStart = 0 $iIndex = _ArraySearch($g_aLVData, $sSuchtext, $iStart, $iEnd, $iCase, $iCompare, $iForward, $g_iSearchColumn) EndIf If $iIndex > -1 Then GUICtrlSetColor($g_idInputSuche, 0x000000) For $i = 0 To $iItemCount -1 Step 1 _GUICtrlListView_SetItemState($g_hListView, $i, $i = $iIndex ? BitOR($LVIS_FOCUSED, $LVIS_SELECTED) : 0, BitOR($LVIS_FOCUSED, $LVIS_SELECTED)) Next Else For $i = 0 To $iItemCount -1 Step 1 _GUICtrlListView_SetItemState($g_hListView, $i, 0, BitOR($LVIS_FOCUSED, $LVIS_SELECTED)) Next GUICtrlSetColor($g_idInputSuche, 0xFF0000) $iStart = 0 EndIf EndIf ConsoleWrite('- $iSearchColumn = ' & $iSearchColumn & @CRLF & _ '- $g_iSearchColumn = ' & $g_iSearchColumn & @CRLF & _ '- $sSuchtext = ' & $sSuchtext & @CRLF & _ '- $iStart = ' & $iStart & @CRLF & _ '- $iIndex = ' & $iIndex & @CRLF & _ '- Text = ' & ($iIndex > -1 ? $g_aLVData[$iIndex][$g_iSearchColumn] : '') & @CRLF & @CRLF) EndFunc ;==>_SelectSearchInListView Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo ; Local $tBuffer $hWndListView = $g_hListView If Not IsHWnd($g_hListView) Then $hWndListView = GUICtrlGetHandle($g_hListView) $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iIDFrom = DllStructGetData($tNMHDR, "IDFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hWndListView Switch $iCode Case $LVN_COLUMNCLICK ; A column was clicked $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam) _DebugPrint("$LVN_COLUMNCLICK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _ "-->Code:" & @TAB & $iCode & @CRLF & _ "-->Item:" & @TAB & DllStructGetData($tInfo, "Item") & @CRLF & _ "-->SubItem:" & @TAB & DllStructGetData($tInfo, "SubItem") & @CRLF & _ "-->NewState:" & @TAB & DllStructGetData($tInfo, "NewState") & @CRLF & _ "-->OldState:" & @TAB & DllStructGetData($tInfo, "OldState") & @CRLF & _ "-->Changed:" & @TAB & DllStructGetData($tInfo, "Changed") & @CRLF & _ "-->ActionX:" & @TAB & DllStructGetData($tInfo, "ActionX") & @CRLF & _ "-->ActionY:" & @TAB & DllStructGetData($tInfo, "ActionY") & @CRLF & _ "-->Param:" & @TAB & DllStructGetData($tInfo, "Param")) $g_iSearchColumn = DllStructGetData($tInfo, "SubItem") _SelectSearchInListView() ; No return value EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg Local $hWndFrom, $iIDFrom, $iCode $hWndFrom = $lParam $iIDFrom = _WinAPI_LoWord($wParam) $iCode = _WinAPI_HiWord($wParam) Switch $hWndFrom Case $g_hInputSuche Local $sSuchtext = GUICtrlRead($g_idInputSuche) Switch $iCode Case $EN_CHANGE _SelectSearchInListView() _DebugPrint("$EN_CHANGE" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _ "-->Code:" & @TAB & $iCode) ; no return value Case $EN_KILLFOCUS ; Sent when an edit control loses the keyboard focus If $sSuchtext = '' Then GUICtrlSetData($g_idInputSuche, 'Suchtext eingeben...') GUICtrlSetColor($g_idInputSuche, 0x008800) EndIf _DebugPrint("$EN_KILLFOCUS" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _ "-->Code:" & @TAB & $iCode) ; no return value Case $EN_SETFOCUS ; Sent when an edit control receives the keyboard focus If $sSuchtext = 'Suchtext eingeben...' Then GUICtrlSetData($g_idInputSuche, '') GUICtrlSetColor($g_idInputSuche, 0x000000) EndIf _DebugPrint("$EN_SETFOCUS" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _ "-->Code:" & @TAB & $iCode) ; no return value EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_COMMAND Func _DebugPrint($s_Text, $sLine = @ScriptLineNumber) ;~ Return ConsoleWrite( _ "!===========================================================" & @CRLF & _ "+======================================================" & @CRLF & _ "-->Line(" & _WinAPI_WideCharToMultiByte(StringFormat("%04d", $sLine), 65001) & "):" & @TAB & $s_Text & @CRLF & _ "+======================================================" & @CRLF) EndFunc ;==>_DebugPrint
Das nächste Vorkommen des Suchtextes kannst du finden, indem du wiederholt im ListView auf die bereits ausgewählte Spaltenüberschrift klickst, oder die Enter-Taste in dem Eingabefeld drückst, in dem der Suchtext steht.
-
Ich hoffe ich konnte mich verständlich ausdrücken.
Im Prinzip schon, doch einen wirklichen Sinn sehe ich darin nicht.
Schau mal, ob dir das hier weiterhilft...
AutoIt
Alles anzeigen;-- TIME_STAMP 2018-10-26 20:57:58 v 0.1 #include <GUIConstantsEx.au3> #include <GuiImageList.au3> #include <GuiListView.au3> #include <WindowsConstants.au3> ;~ #include <WinAPISys.au3> #include <WinAPIConv.au3> Global $g_hListView Example() Func Example() Local $hGUI, $hImage $hGUI = GUICreate("(UDF Created) ListView Create", 700, 300) $g_hListView = _GUICtrlListView_Create($hGUI, "Projekt-Nr.|Domainname|Überschrift|Beschreibung", 2, 2, 694, 268) _GUICtrlListView_SetExtendedListViewStyle($g_hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES)) GUISetState(@SW_SHOW) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") ; Add items _GUICtrlListView_AddItem($g_hListView, "1") ; Projekt-Nr. _GUICtrlListView_AddSubItem($g_hListView, 0, "www.domain1", 1); Domainname _GUICtrlListView_AddSubItem($g_hListView, 0, "überschrift1", 2); Überschrift _GUICtrlListView_AddSubItem($g_hListView, 0, "domainbeschreibung1 Beschreibungtext1", 3); Beschreibung _GUICtrlListView_AddItem($g_hListView, "2") ; Projekt-Nr. _GUICtrlListView_AddSubItem($g_hListView, 1, "www.nocheinedomian2", 1); Domainname _GUICtrlListView_AddSubItem($g_hListView, 1, "überschrift2", 2); Überschrift _GUICtrlListView_AddSubItem($g_hListView, 1, "domainbeschreibung2 Beschreibungtext2", 3); Beschreibung _GUICtrlListView_AddItem($g_hListView, "3") ; Projekt-Nr. _GUICtrlListView_AddSubItem($g_hListView, 2, "www.wiedereinedomains3", 1); Domainname _GUICtrlListView_AddSubItem($g_hListView, 2, "überschrift3", 2); Überschrift _GUICtrlListView_AddSubItem($g_hListView, 2, "domainbeschreibung3 Beschreibungtext3", 3); Beschreibung _GUICtrlListView_AddItem($g_hListView, "4") ; Projekt-Nr. _GUICtrlListView_AddSubItem($g_hListView, 3, "www.tolledomain4", 1); Domainname _GUICtrlListView_AddSubItem($g_hListView, 3, "überschrift4", 2); Überschrift _GUICtrlListView_AddSubItem($g_hListView, 3, "domainbeschreibung4 Beschreibungtext4", 3); Beschreibung _GUICtrlListView_SetColumnWidth($g_hListView, 0, 50) _GUICtrlListView_SetColumnWidth($g_hListView, 1, 150) _GUICtrlListView_SetColumnWidth($g_hListView, 2, 180) _GUICtrlListView_SetColumnWidth($g_hListView, 3, 250) ; Loop until the user exits. Do Until GUIGetMsg() = $GUI_EVENT_CLOSE GUIDelete() EndFunc ;==>Example Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo ; Local $tBuffer $hWndListView = $g_hListView If Not IsHWnd($g_hListView) Then $hWndListView = GUICtrlGetHandle($g_hListView) $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iIDFrom = DllStructGetData($tNMHDR, "IDFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hWndListView Switch $iCode Case $LVN_KEYDOWN ; A key has been pressed $tInfo = DllStructCreate($tagNMLVKEYDOWN, $lParam) Local $iVK = DllStructGetData($tInfo, "VKey"), $sChar, $iIndex Switch $iVK Case 65 To 90 ; a-z $sChar = StringLower(Chr($iVK)) Case 219 ; ß $sChar = 'ß' Case 222 ; ä $sChar = 'ä' Case 192 ; ö $sChar = 'ö' Case 186 ; ü $sChar = 'ü' Case Else Return EndSwitch _DebugPrint("$LVN_KEYDOWN" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _ "-->Code:" & @TAB & $iCode & @CRLF & _ "-->VKey:" & @TAB & DllStructGetData($tInfo, "VKey") & @CRLF & _ "-->Char:" & @TAB & $sChar & @CRLF & _ "-->Flags:" & @TAB & DllStructGetData($tInfo, "Flags")) Local Static $iStart = -1, $bWrapOK = True $iIndex = _GUICtrlListView_FindInText($g_hListView, 'www.' & $sChar, $iStart, $bWrapOK) ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & " var: $iIndex --> " & $iIndex & @CRLF) If $iIndex > -1 Then $iStart = $iIndex _GUICtrlListView_SetItemState($g_hListView, $iIndex, $LVIS_FOCUSED, $LVIS_FOCUSED) _GUICtrlListView_SetItemState($g_hListView, $iIndex, $LVIS_SELECTED, $LVIS_SELECTED) Else $iStart = -1 EndIf ; No return value EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Func _DebugPrint($s_Text, $sLine = @ScriptLineNumber) ConsoleWrite( _ "!===========================================================" & @CRLF & _ "+======================================================" & @CRLF & _ "-->Line(" & _WinAPI_WideCharToMultiByte(StringFormat("%04d", $sLine), 65001) & "):" & @TAB & $s_Text & @CRLF & _ "+======================================================" & @CRLF) EndFunc ;==>_DebugPrint
-
Habe dir mal eben eine kleine Funktion dafür geschrieben, weil ich gerade in der Warteschleife hänge und nichts Besseres zu tun habe...
AutoIt
Alles anzeigen;-- TIME_STAMP 2018-10-24 16:24:17 v 0.1 #include <Array.au3> Global $sListe = _ '"source","End Time","Duration","Protocol"' & @CRLF & _ 'xspw2,"Oct 22, 2018 04:00:59 PM",1539340540,tcp' & @CRLF & _ 'xspw1,"Oct 22, 2018 04:04:34 PM",1539340540.05,tcp' & @CRLF & _ 'xspw1,"Oct 22, 2018 04:22:37 PM",1539340147.9,tcp' & @CRLF Global $aConvert = _ConvertList($sListe) ConsoleWrite($sListe & @CRLF) _ArrayDisplay($aConvert, '$aConvert') Func _ConvertList(ByRef $sListe) Local Static $aMonate = ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] Local $aTime, $aList = StringRegExp($sListe, '.+', 3) For $i = 0 To UBound($aList) -1 Step 1 For $j = 0 To UBound($aMonate) -1 Step 1 If StringRegExp($aList[$i], $aMonate[$j]) Then ; Datum konvertieren $aList[$i] = StringRegExpReplace($aList[$i], $aMonate[$j], StringFormat('%02i', $j + 1)) $aList[$i] = StringRegExpReplace($aList[$i], '(\d{2}) (\d{2}), (\d{4})', '\3/\1/\2') ; Zeit konvertieren $aTime = StringRegExp($aList[$i], '(\d{2}):(\d{2}):(\d{2})', 1) Switch True Case StringRegExp($sListe, 'PM') $aTime[0] += $aTime[0] < 12 ? 12 : 0 Case StringRegExp($sListe, 'AM') $aTime[0] += $aTime[0] = 12 ? 0 : $aTime[0] EndSwitch $aList[$i] = StringRegExpReplace($aList[$i], '(\d{2}):(\d{2}):(\d{2})', StringFormat('%02i:%02i:%02i', $aTime[0], $aTime[1], $aTime[2])) ; PM|AM entfernen $aList[$i] = StringRegExpReplace($aList[$i], ' PM| AM', '') ContinueLoop 2 EndIf Next Next $sListe = _ArrayToString($aList, @CRLF) Return $aList EndFunc
-
Du könntest es z.B. auch so machen...
...du könntest aber auch die Ergebnisse der (erfolgreichen) Suchen (mit Datum) in eine Ini-Datei speichern und diese dann vor der nächsten Anfrage bei tel.search.ch auswerten, bzw. falls bereits ein Eintrag vorhanden ist, danach fragen, ob dieser angezeigt, oder ob eine erneute Suchanfrage gestellt werden soll. Im Prinzip stehen dir alle Wege offen... es kommt halt darauf an, war du mit den Ergebnissen der Suche machen willst.
Ich denke, er möchte wissen, ob die Datei überschrieben wird (ja), wenn er eine neue Anfrage abschickt und die Datei bereits vorhanden ist, oder ob die neuen Daten an die bereits vorhanden angefügt werden, oder ob evtl. gar nichts passiert.