Füge mal am Anfang Opt('TCPTimeout', 500) ein.
Als Fehlermeldung kommt nämlich ein TimeOut. Scheinbar kommt da die Antwort zu spät.
Beiträge von Oscar
-
-
Alle Variablen, die Du in den Funktionen verwendest, solltest Du als Local deklarieren, dann gibt es auch keine Probleme mit "MustDeclareVars".
Im Hinblick auf mögliche spätere Fehler mit anderen Scripten ist das sowieso anzuraten, denn die Funktionen werden immer Probleme machen, wenn globale Variablen mit den gleichen Namen verwendet werden. -
Danke, für den Hinweis!
Da es sich ja um einen WindowsHook handelt reagiert der natürlich systemweit. Das hatte ich nicht bedacht.
Ich habe das jetzt auf den aktiven Hex-Viewer beschränkt. Neue Version in Post#1. -
Mit "_GUICtrlListView_FindInText" suchst Du nach dem Index im ListView und mit "_GUICtrlListView_SetItemText" änderst Du den Inhalt des (Sub)Items.
Wenn Dir das jetzt nicht ausreicht, dann bitte Dein Script posten.
-
Ich würde den Abschicken-Button solange deaktivieren, bis alle Eingaben gemacht worden sind.
Das erspart Dir eine Menge an If-Anweisungen. Im übrigen kann man mit _GUICtrlEdit_SetCueBanner Vorgaben in die Inputfelder schreiben, die beim Klick in das Eingabefeld automatisch verschwinden.AutoIt
Alles anzeigen#include <ComboConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <GuiEdit.au3> #include <WindowsConstants.au3> $WinTitle = " BDG Mail " $GUI = GUICreate($WinTitle, 500, 230) GUISetBkColor(0xdfddff) GUICtrlCreateGroup("", 12, 0, 475, 192) GUICtrlSetFont(-1, 8, 800, 0, "Verdana") $combo_anrede = GUICtrlCreateCombo("Anrede auswählen:", 20, 15, 115, -1, $CBS_DROPDOWNLIST) GUICtrlSetData(-1, "Sehr geehrter Herr |Sehr geehrte Frau ", "") $input_anrede = GUICtrlCreateInput("", 140, 15, 100, 21) _GUICtrlEdit_SetCueBanner($input_anrede, "Name") GUICtrlSetState($input_anrede, $GUI_HIDE) $input_phone = GUICtrlCreateInput("", 250, 15, 105, 21) _GUICtrlEdit_SetCueBanner($input_phone, "Telefonnummer") $combo_customer_type = GUICtrlCreateCombo("Kundentyp:", 362, 15, 115, -1, $CBS_DROPDOWNLIST) GUICtrlSetData(-1, "Private |Business", "") $input = GUICtrlCreateEdit("", 20, 50, 457, 120, BitOR($WS_VSCROLL, $ES_MULTILINE, $ES_AUTOVSCROLL, $ES_WANTRETURN)) $button_input = GUICtrlCreateButton("Mediatrix Mail erstellen", 190, 200, 120, 19) GUICtrlSetState($button_input, $GUI_DISABLE) GUISetState(@SW_SHOW, $GUI) AdlibRegister("_CheckInput") While 1 Switch GUIGetMsg() Case $button_input MsgBox(0, $WinTitle, "Jetzt kann die Mail verschickt werden! :-)") Case $combo_anrede If GUICtrlRead($combo_anrede) <> "Anrede auswählen:" Then GUICtrlSetState($input_anrede, $GUI_SHOW) Else GUICtrlSetState($input_anrede, $GUI_HIDE) EndIf Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Func _CheckInput() Local $iCheck = 0 $iCheck += Number(GUICtrlRead($combo_anrede) <> "Anrede auswählen:") $iCheck += Number(GUICtrlRead($input_anrede) <> "") $iCheck += Number(GUICtrlRead($input_phone) <> "") $iCheck += Number(GUICtrlRead($combo_customer_type) <> "Kundentyp:") $iCheck += Number(GUICtrlRead($input) <> "") If $iCheck = 5 Then GUICtrlSetState($button_input, $GUI_ENABLE) Else GUICtrlSetState($button_input, $GUI_DISABLE) EndIf EndFunc -
Hier mal ein Beispiel, wie das im OnEventMode ganz ohne WM_NOTIFY funktioniert:
AutoIt
Alles anzeigen#include <Array.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <ListViewConstants.au3> Opt('GUIOnEventMode', 1) $hGui = GUICreate('Test', 320, 300) GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseGui') $idListview = GUICtrlCreateListView('col 1|col 2|col 3', 10, 10, 300, 280, $LVS_SHOWSELALWAYS) For $i = 0 To 9 $sItem = Random(1, 9, 1) & '|' & Random(1, 9, 1) & '|' & Random(1, 9, 1) GUICtrlCreateListViewItem($sItem, $idListview) GUICtrlSetOnEvent(-1, '_ClickListView') Next GUISetState(@SW_SHOW) WinWaitClose($hGui) Exit Func _CloseGui() GUIDelete($hGui) EndFunc ;==>_CloseGui Func _ClickListView() ; Single-Select Local $sText = GUICtrlRead(@GUI_CtrlId) ConsoleWrite($sText & @CR) ; Multi-Select Local $sSelected = ControlListView($hGui, '', $idListview, 'GetSelected', 1) If $sSelected = '' Then Return Local $aSelectedIndices = StringSplit($sSelected, '|', 2) Local $aSelectedText[UBound($aSelectedIndices)] For $i = 0 To UBound($aSelectedIndices) - 1 For $j = 0 To 2 $aSelectedText[$i] &= ControlListView($hGui, '', $idListview, 'GetText', $aSelectedIndices[$i], $j) & '|' Next $aSelectedText[$i] = StringTrimRight($aSelectedText[$i], 1) Next _ArrayDisplay($aSelectedText) EndFunc ;==>_ClickListView -
Benutze statt "StringLower" einfach "_StringProper".
-
Auch wenn das geht, was ist, wenn der Benutzer den Sound ausgeschaltet hat?
Mal abgesehen davon, dass das viel zu umständlich ist. Wenn ein Fehler auftritt wird mit großer Wahrscheinlichkeit der Benutzer auch über ein Fenster darauf hingewiesen.
Und das auftauchen des Fensters lässt sich viel leichter feststellen (WinExists, WinWait). -
Also das: "\\?\d:\" (mit Doppelpunkt für das Laufwerk) funktioniert. Die anderen Freigaben wie z.B. "Users" funktionieren so aber nicht.
-
Ähm...ich weiß nicht wieso, aber heute klappt der Zugriff auf einen anderen Rechner im lokalen Netzwerk (_WinAPI_EnumFiles liefert mir die Verzeichnis-/Dateiliste).
Der Zugriff auf Localhost (egal ob über Localhost, Computernamen oder IP) verursacht aber immer noch den Fehler (error: 10 extended: C000000D).
Das ist alles sehr eigenartig...
Schade, ich würde gern _WinAPI_EnumFiles nutzen, aber wenn das nicht überall funktioniert, dann muss ich wohl doch auf _FileListToArray ausweichen.
-
So, ich habe jetzt von v3.3.14.0. noch auf v3.3.14.1 geupdatet.
Zu Deinen Fragen:
1. Ich weiß nicht, was Du mit Kommandozeile meinst, aber in einer Eingabeaufforderung kann man das Verzeichnis so nicht eingeben: "Der Befehl "\\localhost\d\" ist entweder falsch geschrieben oder konnte nicht gefunden werden.".
2. Der Fehler tritt auch auf, wenn ich das Script bei mir auf meinen Rechner (Localhost) aufrufe. Das Laufwerk "D" ist als erweiterte Freigabe (Heimnetzgruppe) mit Berechtigung "Jeder" und "Vollzugriff" freigegeben.
3. Keine versteckte Freigabe (siehe 2.)
4. Ich kann den Pfad im Explorer öffnen, mit dem TotalCommander und selbst mit Firefox kann ich auf den Pfad zugreifen.
5. aktuellste AutoIt-Version v3.3.14.1
6. MD5-Hash von "WinApiFiles.au3": 869827e8ee7867c597e7925859fdc581
7. Ich habe ebenfalls Win7, 64 Bit
8. Ziel ist Localhost
9. Siehe 8.Hier noch das Testscript:
AutoIt
Alles anzeigen#include <Array.au3> #include <File.au3> #include <WinAPIFiles.au3> Global $sPath = '\\localhost\d\' Global $aFolder = _WinAPI_EnumFiles($sPath) ConsoleWrite('error: ' & @error & ' extended: ' & Hex(@extended, 8) & @CR) _ArrayDisplay($aFolder, '_WinAPI_EnumFiles') Global $aFolder = _FileListToArray($sPath) ConsoleWrite('error: ' & @error & ' extended: ' & Hex(@extended, 8) & @CR) _ArrayDisplay($aFolder, '_FileListToArray')Der erste Teil schmeißt als Fehler: error: 10 extended: C000000D
Der zweite Teil gibt mir die Verzeichnisliste aus. -
Wie ich oben schon geschrieben habe, funktioniert es ja mit "_FileListToArray". An den Zugriffsrechten liegt es nicht.
Nur mit "_WinAPI_EnumFiles" funktioniert es nicht. -
Ich würde gern die Funktion "_WinAPI_EnumFiles" einsetzen, um mir Verzeichnisse/Dateien von einer Netzwerk-Freigabe ("\\Server\d\") anzeigen zu lassen, aber damit bekomme ich immer eine Fehlermeldung:
error: 10 extended: C000000DNun habe ich danach gegoogelt und lt. MSDN bedeutet das: STATUS_INVALID_PARAMETER (An invalid parameter was passed to a service or function.)
Tja, und jetzt weiß ich nicht weiter.
Wenn ich hingegen die Funktion "_FileListToArray" benutze, bekomme ich eine Auflistung der Verzeichnisse/Dateien von der Freigabe. Es liegt also nicht am Netzwerk oder an den Zugriffsrechten.
Weiß jemand, warum das nicht mit "_WinAPI_EnumFiles" funktioniert? -
Das ist das Problem! Wenn ein Variant-Datentyp benutzt wird, dann müssen auch die Funktionen damit arbeiten können.
Wenn ich jetzt bei jeder Funktion erst checken muss, ob der Datentyp passt, dann ist es einfacher gleich die Variablen entsprechend zu deklarieren.
Für mich handelt es sich dabei um einen Bug. -
Das hatte auch mal ohne Berechnung funktioniert. In irgendeiner AutoIt-Version muss das geändert worden sein.
-
Ein Beispiel dafür, dass die ListView-UDF noch Probleme mit der Control-ID hat.
_GUICtrlListView_SetItemSelected funktioniert nur mit dem Handle des ListViews:AutoIt
Alles anzeigen#include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> #include <ListViewConstants.au3> #include <GuiListView.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Form1", 376, 284, 192, 124) $ListView1 = GUICtrlCreateListView("TEST - Name", 152, 50, 177, 217) GUICtrlCreateListViewItem("Tester", $ListView1) GUICtrlCreateListViewItem("Mustermann", $ListView1) $Button1 = GUICtrlCreateButton("Button1", 24, 40, 113, 33) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Button1 $selected = _GUICtrlListView_GetSelectedIndices($ListView1) ConsoleWrite('$selected: ' & $selected & @CR) _GUICtrlListView_DeleteAllItems($ListView1) GUICtrlCreateListViewItem("Tester", $ListView1) GUICtrlCreateListViewItem("MusterFrau", $ListView1) $iRet = _GUICtrlListView_SetItemSelected(GUICtrlGetHandle($ListView1), $selected, True, True) ConsoleWrite($iRet & @CR) EndSwitch WEnd
Edit: Nanu!? AutoBert hat auch recht. Wenn man explizit in Int wandelt, funktioniert auch die Ctlr-ID. Was ist denn mit der automatischen Typwandlung von AutoIt los? -
Ich bin ja gerade dabei den FileCommander in großen Teilen neu zu schreiben. Bei der Gelegenheit war mir der alte Hex-Viewer schon lange ein Dorn im Auge.
Der war quasi nur für kleine Dateien zu gebrauchen, bei großen Dateien ist er mit einem Speicherfehler (nicht genügend Arbeitsspeicher) abgestürzt.Jetzt habe ich mal einen Hex-Viewer geschrieben, der immer nur einen kleinen Teil (512 Byte) der Datei in den Speicher lädt und diesen Teil anzeigt (Adresse, Hex-Darstellung und ASCII-Anzeige).
Scrollen kann man mit dem rechten, vertikalen Scrollbalken oder über diverse Tasten: {up}, {down}, {pgup}, {pgdown}, {home} und {end}
Wenn die Maus über ein Scrollrad verfügt, dann kann man auch damit scrollen.Dateien mit einer Dateigröße bis 2^32 Byte ( = 4 GB) sollten sich damit problemlos anzeigen lassen.
Es handelt sich "nur" um einen Hex-Viewer (kein Editor). Die Datei wird auch nur zum lesen geöffnet.
Update 05.09.2015 Version 1.1:
- Fehler beim scrollen mit dem Mausrad behoben. Jetzt wird nur noch im aktiven Hex-Viewer gescrollt. -
Der Standard-Stil bei einem ListView ist: $LVS_SHOWSELALWAYS und $LVS_SINGLESEL.
Will man nun ein ListView mit der Möglichkeit mehrere Einträge zu selektieren, dann lässt man einfach $LVS_SINGLESEL weg oder anders ausgedrückt, man darf den Stil nicht weglassen, sondern muss $LVS_SHOWSELALWAYS als Stil eintragen. Will man diesen Stil auch nicht haben, dann trägt man eine "0" ein. Wichtig ist halt, dass dort kein "-1" steht. -
Das mit dem teilweisen "nicht refreshen" des Fensters konnte ich reproduzieren (Win7 64 Bit, AutoIt v3.3.14.0).
Wenn ich aber ein paar kleine Änderungen in Deinem Script vornehme (Style: BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS, $WS_CLIPCHILDREN) und WM_PAINT) dann scheint das nicht mehr aufzutreten, zumindest bei mir nicht mehr.AutoIt
Alles anzeigen#include <GUIConstantsEx.au3> #include <Math.au3> #include <WinAPIGdi.au3> #include <WindowsConstants.au3> #AutoIt3Wrapper_UseX64=n Opt('GUIOnEventMode', 1) Global $pdfReader, $pdfCtrl, $pdfGUI, $pdfWin $pdfReader = ObjCreate("AcroPDF.PDF.1") If Not IsObj($pdfReader) Then Exit MsgBox(16, 'PDF', 'Der AcrobatReader ist nicht installiert!') $pdfReader.src = @ScriptDir & "\test.pdf" $pdfReader.SetLayoutMode("SinglePage") $pdfReader.SetPageMode("none") $pdfReader.SetShowToolbar(0) $pdfReader.SetShowScrollbars(0) $pdfReader.SetView("Fit") $pdfGUI = GUICreate("PDF", 1000, 600, 50, 0, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS, $WS_CLIPCHILDREN)) GUISetOnEvent($GUI_EVENT_CLOSE, '_GuiClose') $pdfCtrl = GUICtrlCreateObj($pdfReader, 5, 5, 1000 - 10, 600 - 10) GUISetState() GUIRegisterMsg($WM_SYSCOMMAND, "myEventHandler") GUIRegisterMsg($WM_PAINT, 'WM_PAINT') WinWaitClose($pdfGUI) Exit Func _GuiClose() GUIDelete($pdfGUI) Exit EndFunc ;==>_GuiClose Func WM_PAINT($hWnd, $Msg, $wParam, $lParam) If $hWnd = $pdfGUI Then GUICtrlSetState($pdfCtrl, $GUI_HIDE) GUICtrlSetState($pdfCtrl, $GUI_SHOW) EndIf Return $GUI_RUNDEFMSG EndFunc ;==>WM_PAINT Func myEventHandler($hWnd, $Msg, $wParam, $lParam) If $hWnd = $pdfGUI Then Switch $wParam Case 0x0000F060 Exit EndSwitch EndIf Return $GUI_RUNDEFMSG EndFunc ;==>myEventHandler -
Und nun schau Dir mal das Beispiel zu GUICtrlCreateUpdown an...
