Kennt jemand die Ursache oder einen Ausweg?
Wie soll da jemand helfen können?
Wo ist Dein Script?
Wo ist eine (Beispiel-) Datenbankdatei?
Welchen File-Converter meinst Du (Link)?
Was erwartest Du als Ergebnis?
Kennt jemand die Ursache oder einen Ausweg?
Wie soll da jemand helfen können?
Wo ist Dein Script?
Wo ist eine (Beispiel-) Datenbankdatei?
Welchen File-Converter meinst Du (Link)?
Was erwartest Du als Ergebnis?
Frage mich gerade was Sinnvoller ist.
Nach dem Anzeigen in der Listview (?) alle Werte in Datei(en) speichern oder erst wenn ich z. B. einen der Button 1 bis Button 10 drücke. Sinnvoll wäre zweiteres, weil ich dann nur das abspeichere, was ich brauche, also wenn cih den dementsprechende Button drücke.
Wenn das keine rhetorische Frage ist, dann solltest Du uns erstmal darüber aufklären, wozu diese Analyse überhaupt gut sein soll.
Den Sinn dahinter habe ich jedenfalls noch nicht verstanden.
Also ohne die ganzen "Xer+"-Spalten, sieht das jetzt so aus:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 1080, 610)
Global $Input1 = GUICtrlCreateInput("Ich bin eine Testnachricht.", 5, 5, 1000, 20)
Global $Input2 = GUICtrlCreateInput("339499542504568557573498571424356429481419498666371439578426583629574422585557423487", 5, 30, 1000, 20)
Global $Teiler = GUICtrlCreateLabel("Teiler", 5, 75, 25, 25)
Global $aButton[10], $aText = StringSplit('1|2|3|4|5|6|7|8|9|10', '|', 2)
For $i = 0 To 9
$aButton[$i] = GUICtrlCreateButton($aText[$i], 35 + 25 * $i, 65, 25, 25)
Next
Global $Button11 = GUICtrlCreateButton("Analyse starten", 350, 65, 155, 25)
Global $aListview[10], $aText = StringSplit('1er|2er|3er|4er|5er|6er|7er|8er|9er|10er', '|', 2)
For $i = 0 To 9
$aListview[$i] = GUICtrlCreateListView($aText[$i], 10 + 105 * $i, 100, 100, 500)
Next
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Global $nMsg, $sNumbers, $laenge
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button11
$sNumbers = GUICtrlRead($Input2)
$laenge = StringLen($sNumbers)
For $i = 0 To 9
If ($i = 0) Or (Not Mod($laenge, $i + 1)) Then
GUICtrlSetBkColor($aButton[$i], 0x00FF00) ; Grün
_AddToListview($aListview[$i], $sNumbers, $i + 1)
Else
GUICtrlSetBkColor($aButton[$i], 0xFF0000) ; Rot
EndIf
Next
EndSwitch
WEnd
Func _AddToListview($idListview, $sInput, $iChar)
Local $aFrequency = _CreateArray($sInput, $iChar)
_GUICtrlListView_DeleteAllItems($idListview)
For $i = 0 To UBound($aFrequency) - 1
GUICtrlCreateListViewItem($aFrequency[$i][0] & ' : ' & $aFrequency[$i][1], $idListview)
Next
_GUICtrlListView_SetColumnWidth($idListview, 0, $LVSCW_AUTOSIZE)
EndFunc
Func _CreateArray($sInput, $iChar)
Local $mFreq[]
$sInput = StringRegExpReplace($sInput, "[^0-9]", "") ; Trennzeichen und Leerzeichen entfernen
For $i = 0 To StringLen($sInput) - $iChar Step $iChar
$mFreq[StringMid($sInput, $i + 1, $iChar)] += 1
Next
Local $aKeys = MapKeys($mFreq), $iCnt = UBound($aKeys), $aFrequency[$iCnt][2]
For $i = 0 To $iCnt - 1
$aFrequency[$i][0] = $aKeys[$i]
$aFrequency[$i][1] = $mFreq[$aKeys[$i]]
Next
_ArraySort($aFrequency, 1, 0, 0, 1)
Return $aFrequency
EndFunc
Alles anzeigen
Wie bzw. wo baue ich nun die anderen ein. Also "2er+", "3er+" "und 4er+".
Worin besteht denn der Unterschied zwischen "2er" und "2er+" bzw. "3er" und "3er+" usw.?
Oben hast Du die Scripte identisch geschrieben. Das ergibt doch gar keinen Sinn!?
Wenn ich Button11 drücke markiert er die Buttons 1-10 rot oder grün.
Das geht aber viel kürzer (Stichwort Array):
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 615, 437, 192, 124)
Global $Input1 = GUICtrlCreateInput("Ich bin eine Testnachricht.", 5, 5, 500, 20)
Global $Input2 = GUICtrlCreateInput("339499542504568557573498571424356429481419498666371439578426583629574422585557423487", 5, 30, 500, 20)
Global $Teiler = GUICtrlCreateLabel("Teiler", 5, 75, 25, 25)
Global $aButton[10], $aText = StringSplit('1,2,3,4,5,6,7,8,9,10', ',', 2)
For $i = 0 To 9
$aButton[$i] = GUICtrlCreateButton($aText[$i], 35 + 25 * $i, 65, 25, 25)
Next
Global $Button11 = GUICtrlCreateButton("Analyse starten", 350, 65, 155, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Global $nMsg, $laenge
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button11
$laenge = StringLen(GUICtrlRead($Input2))
GUICtrlSetBkColor($aButton[0], 0x00FF00) ; Grün, weil "1" immer zutrifft
For $i = 1 To 9
If Not Mod($laenge, $i + 1) Then
GUICtrlSetBkColor($aButton[$i], 0x00FF00) ; Grün
Else
GUICtrlSetBkColor($aButton[$i], 0xFF0000) ; Annahme für Rot
EndIf
Next
EndSwitch
WEnd
Alles anzeigen
Für das Ergebnis willst Du ein Listview, oder?
Mache ich später, habe jetzt nicht genug Zeit.
Ich weiß nicht, ob ich die Aufgabe richtig verstanden habe, aber auf jeden Fall kann man das mit dem Map-Datentyp ganz gut lösen.
Hier mal als universelle Funktion:
#include <Array.au3>
Local $str = "33 94 99 54 25 04 56 85 57 57 34 98 57 14 24 35 64 29 48 14 19 49 86 66 37 14 39 57 84 26 58 36 29 57 44 22 58 55 57 42 34 87"
Local $aFrequency = _CreateArray($str, 2)
_ArrayDisplay($aFrequency)
Local $aFrequency = _CreateArray($str, 3)
_ArrayDisplay($aFrequency)
Local $aFrequency = _CreateArray($str, 4)
_ArrayDisplay($aFrequency)
Func _CreateArray($sInput, $iChar)
Local $mFreq[]
$sInput = StringRegExpReplace($sInput, "[^0-9]", "") ; Trennzeichen und Leerzeichen entfernen
For $i = 0 To StringLen($sInput) - $iChar Step $iChar
$mFreq[StringMid($sInput, $i + 1, $iChar)] += 1
Next
Local $aKeys = MapKeys($mFreq), $iCnt = UBound($aKeys), $aFrequency[$iCnt][2]
For $i = 0 To $iCnt - 1
$aFrequency[$i][0] = $aKeys[$i]
$aFrequency[$i][1] = $mFreq[$aKeys[$i]]
Next
_ArraySort($aFrequency, 1, 0, 0, 1)
Return $aFrequency
EndFunc
Alles anzeigen
okay das mit den UDfs macht Sinn für local
Nicht nur da!
In Funktionen sollten (möglichst) keine globalen Variablen verwendet werden. Lieber die Variablen als Parameter übergeben und das Ergebnis mit Return zurückgeben.
Das lässt sich zwar nicht immer realisieren, aber grundsätzlich versuche ich mich daran zu halten.
Bei rekursiven Funktionen sind lokale Variablen sowieso wichtig.
Statische (lokale) Variablen sind oftmals auch sehr hilfreich.
Warum benutzt Du nicht das SHORTDATEFORMAT? Damit geht das einfacher:
#include <DateTimeConstants.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
GUICreate("Test", 160, 80)
Global $idDate = GUICtrlCreateDate("", 10, 10, 120, 20, $DTS_SHORTDATEFORMAT)
Global $idTime = GUICtrlCreateDate("", 10, 40, 100, 20, $DTS_TIMEFORMAT)
GUISetState(@SW_SHOW)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd
Global $sDate = GUICtrlRead($idDate)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sDate = ' & $sDate & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
Global $sTime = GUICtrlRead($idTime)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sTime = ' & $sTime & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
Global $sDt = StringRegExpReplace($sDate, '(\d{2})\.(\d{2})\.(\d{4})', '$3$2$1')
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sDt = ' & $sDt & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
Global $sTm = StringReplace($sTime, ':', '')
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sTm = ' & $sTm & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
Alles anzeigen
P.S.: Es wäre schön, wenn Du zukünftig wenigstens ein funktionsfähiges Beispielscript posten würdest. Nicht jeder Helfer ist gewillt, erstmal ein Beispiel zu schreiben.
Global $sOutput[0] = [-1] --->wird von ISN Studio NICHT bemängelt.
Dann ist der Syntax-Check in ISN nicht korrekt!
Ein Null-Elemente-Array darf bei der Deklarierung nicht mit Werten gefüllt werden.
Global $sOutput[0] = [-1] ---> Richtig
Nein, das ist auch falsch! ("Array variable has incorrect number of subscripts or subscript dimension range exceeded.")
So, wäre es korrekt: Global $sOutput[1] = [-1]
oder so: Global $sOutput[] = [-1]
was soll falsch sein an:
Global $sOutput[0] = -1
Mit "Global" deklarierst Du das Array und da Du 0 (also kein Element) angibst, darfst Du auch keine Wertzuweisung vornehmen (die wäre bei der Deklaration so auch falsch).
AutoIt erlaubt zwar mittlerweile ein Array mit null Elementen zu deklarieren, aber bevor Du auf ein Element zugreifst, musst Du das Array vergrößern.
So wäre es ok:
Script?
Du brauchst nicht durch alle Items iterieren.
Es reicht: _GUICtrlListView_SetItemSelected($hActive, -1)
"-1" ist für alle Items.
Ich würde einen anderen Weg vorschlagen:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <WinAPISys.au3>
Opt("GUIOnEventMode", 1)
Global $hGui = GUICreate("Test", 320, 240)
GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI_EVENT_CLOSE")
Global $cLV_Test = GUICtrlCreateListView("Name", 5, 5, 150, 230, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS))
Global $cLV_Test2 = GUICtrlCreateListView("Name", 160, 5, 150, 230, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS))
For $i = 1 To 9
_GUICtrlListView_AddItem($cLV_Test, "Item" & $i)
_GUICtrlListView_AddItem($cLV_Test2, "Item" & $i)
Next
Global $cDummy = GUICtrlCreateDummy()
GUICtrlSetOnEvent(-1, '_SelectAll')
Global $aAccelKeys[1][2] = [["^a", $cDummy]]
GUISetAccelerators($aAccelKeys)
GUISetState(@SW_SHOW)
While Sleep(10)
WEnd
Func _GUI_EVENT_CLOSE()
Exit
EndFunc ;==>_GUI_EVENT_CLOSE
Func _SelectAll()
Local $sClassName = ControlGetFocus($hGui)
If $sClassName <> '' Then
Local $hActive = ControlGetHandle($hGui, '', $sClassName)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hActive = ' & $hActive & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
EndIf
EndFunc
Alles anzeigen
Wobei ich die Funktion sogar noch so wegkürzen würde und die Gleiche Funktionalität hätte:
Natürlich kann man _Iif auch als Funktion abbilden (war in alten Versionen ja so), aber wozu?
Der ternäre Operator wird mit Sicherheit schneller sein, weil er in AutoIt eingebaut ist und somit nicht erst vom Interpreter zur Laufzeit ausgeführt werden muss.
Ist das Gegenstück für IIf nicht einfach eine logische Verknüpfung?
Nicht, so wie ich Iif verstehe, denn als Ergebnis bekommt man ja nicht TRUE/FALSE, sondern den Wert von A bzw. B.
Also: $C = Iif($x > 50, $A, $B) ; wenn $x größer als 50, dann wird $A zurückgegeben, ansonsten $B.
Zumindest war das in alten AutoIt-Versionen mit "_Iif()" so. VBA kenne ich nicht.
In den neuen AutoIt-Versionen gibt es ja den ternären Operator: $C = $x > 50 ? $A : $B
In VBA habe ich z.B. auch "IIf", was ganz hilfreich ist, ein Äquivalent dazu scheint es in AutoIt nicht zu geben.
Such mal nach "ternary". Dass ist genau das, wonach Du suchst.
Und was meinst Du mit mehrere ENUM? Beispielscript bitte!
Wenn ich jetzt richtig verstehe, kann ich mit "False" auch sagen, dass nur die angegebenen Ordner eingelesen werden sollen!?
Ja, das geht auch!
Dann solltest Du aber die Konstante umbenennen, damit Du das Script später auch noch verstehst.
Man müsste ja auch zur Laufzeit entfernen und hinzufügen können?
Besser, man liest sie erst gar nicht ein:
#include <APIShellExConstants.au3>
#include <FileConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <WinAPIFiles.au3>
#include <WinAPIIcons.au3>
#include <WinAPIRes.au3>
#include <WinAPIShellEx.au3>
#include <WinAPIShPath.au3>
#include <WindowsConstants.au3>
Opt('GUIOnEventMode', 1)
Global Const $sSearchDir = @ScriptDir ; hier das Verzeichnis mit den Dokumenten eintragen
Global Const $sExcludeDirs = 'icon;settings;toolbar' ; hier die Unterverzeichnisse, die NICHT eingelesen werden sollen
Global Const $sFileExtensions = '*.pdf;*.docx;*.xlsm' ; die Dateiendungen, die angezeigt werden sollen
Global Const $bLargeIcons = False ; ob grosse oder kleine Icons benutzt werden sollen
_WinAPI_FileIconInit() ; System-Imagelist initialisieren
Global $hSystemImgList = _WinAPI_ShellGetImageList(Not $bLargeIcons) ; System-Imagelist holen
Global $hBusyCur = _WinAPI_LoadCursorFromFile(@WindowsDir & '\Cursors\aero_busy_xl.ani') ; Busy-Animation-Cursor laden
Global $mPathMap[] ; Map-Datentyp zum speichern des Treeview-Handle und des dazugehoerigen Pfades
Global $hMainGui = GUICreate('Test', 1000, 600)
GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseMainGui')
Global $idTreeview = GUICtrlCreateTreeView(10, 10, 400, 580, $GUI_SS_DEFAULT_TREEVIEW, $WS_EX_CLIENTEDGE)
GUICtrlSetFont(-1, 10 + $bLargeIcons, 400, 0, 'Verdana')
GUICtrlSetResizing(-1, $GUI_DOCKBOTTOM + $GUI_DOCKTOP + $GUI_DOCKLEFT)
_GUICtrlTreeView_SetNormalImageList($idTreeview, $hSystemImgList)
Global $hRoot = _CreateRoot($idTreeview, $sSearchDir, $bLargeIcons) ; Root-Eintrag erstellen
GUISetState(@SW_SHOW, $hMainGui)
; Fuer Mausklicks auf ein Treeview muss man WM_NOTIFY registrieren und dort auswerten
GUIRegisterMsg($WM_NOTIFY, '_WM_NOTIFY')
; Den ganzen Verzeichnisbaum rekursiv durchsuchen und im Treeview erstellen (kann lange dauern)
Global $hOldCur = _WinAPI_SetCursor($hBusyCur ? $hBusyCur : 9)
_GUICtrlTreeView_BeginUpdate($idTreeview)
_ReadDirectory($idTreeview, $hRoot, $sSearchDir, $bLargeIcons)
_GUICtrlTreeView_EndUpdate($idTreeview)
_WinAPI_SetCursor($hOldCur)
; zum Schluss den Root-Eintrag aufklappen
_SendMessage(GUICtrlGetHandle($idTreeview), $TVM_EXPAND, $TVE_EXPAND, $hRoot, 0, 'wparam', 'handle')
While Sleep(1000)
WEnd
Func _CloseMainGui()
_GUIImageList_Destroy($hSystemImgList)
If $hBusyCur Then _WinAPI_DestroyCursor($hBusyCur)
GUIDelete($hMainGui)
Exit
EndFunc ;==>_CloseMainGui
Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $tNMTREEVIEW, $tNMHDR, $hItem, $hWndFrom, $sPath
Local $sSepChar = Opt('GUIDataSeparatorChar')
$tNMTREEVIEW = DllStructCreate($tagNMTREEVIEW, $ilParam)
$hWndFrom = DllStructGetData($tNMTREEVIEW, 'hWndFrom')
Switch $hWndFrom
Case GUICtrlGetHandle($idTreeview)
Switch DllStructGetData($tNMTREEVIEW, 'Code')
Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW
$hItem = DllStructGetData($tNMTREEVIEW, 'NewhItem')
If $hItem Then
$sPath = $mPathMap[$hItem] ; den Pfad anhand des Item-Handle auslesen
; In $sPath steht der Pfad zur angeklickten Datei. Damit kann dann die Anzeige aufgerufen werden.
ConsoleWrite('@@ Zeile: ' & @ScriptLineNumber & ' -> $sPath = ' & $sPath & @CRLF)
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>_WM_NOTIFY
Func _CreateRoot(ByRef $idTreeview, $sPath, $bLargeIcons)
Local $iIndex, $hItem, $sName
$iIndex = _GUIImageList_GetFileIconIndex($sPath, $bLargeIcons, True)
$sName = StringRegExpReplace($sPath, '.+\\(.+)', '$1')
$hItem = _GUICtrlTreeView_AddFirst($idTreeview, 0, $sName, $iIndex, $iIndex)
$mPathMap[$hItem] = $sPath ; den Pfad anhand des Item-Handle speichern
Return $hItem
EndFunc ;==>_CreateRoot
Func _ReadDirectory(ByRef $idTreeview, $hItem, $sPath, $bLargeIcons)
Local $iIndex, $aFolder, $aFiles, $hChild = $hItem, $sName
If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
$aFolder = _WinAPI_EnumFiles($sPath, 2, $sExcludeDirs, True) ; nur Verzeichnisse einlesen
If Not @error Then
For $i = 1 To $aFolder[0][0]
If Not BitAND($aFolder[$i][6], $FILE_ATTRIBUTE_REPARSE_POINT) And _
Not BitAND($aFolder[$i][6], $FILE_ATTRIBUTE_HIDDEN) Then
$sName = StringRegExpReplace($sPath & $aFolder[$i][0], '.+\\(.+)', '$1')
$iIndex = _GUIImageList_GetFileIconIndex($sPath & $aFolder[$i][0], $bLargeIcons, True)
$hChild = _GUICtrlTreeView_AddChild($idTreeview, $hItem, $sName, $iIndex, $iIndex)
$mPathMap[$hChild] = $sPath & $aFolder[$i][0] ; den Pfad anhand des Item-Handle speichern
_ReadDirectory($idTreeview, $hChild, $sPath & $aFolder[$i][0], $bLargeIcons)
EndIf
Next
EndIf
_WinAPI_SetCursor($hBusyCur ? $hBusyCur : 9)
$aFiles = _WinAPI_EnumFiles($sPath, 1, $sFileExtensions) ; nur Dateien einlesen
If Not @error Then
For $i = 1 To $aFiles[0][0]
If Not BitAND($aFiles[$i][6], $FILE_ATTRIBUTE_HIDDEN) Then
$sName = StringRegExpReplace($sPath & $aFiles[$i][0], '.+\\(.+)\..+', '$1')
$iIndex = _GUIImageList_GetFileIconIndex($sPath & $aFiles[$i][0], $bLargeIcons, True)
$hChild = _GUICtrlTreeView_AddChild($idTreeview, $hItem, $sName, $iIndex, $iIndex)
$mPathMap[$hChild] = $sPath & $aFiles[$i][0] ; den Pfad anhand des Item-Handle speichern
EndIf
Next
EndIf
EndFunc ;==>_ReadDirectory
Func _GUIImageList_GetFileIconIndex($sFilePath, $bLargeIcons = False, $bForceLoadFromDisk = False)
Local $tFileInfo = DllStructCreate($tagSHFILEINFO)
Local $iFlags = BitOR($SHGFI_SYSICONINDEX, _
$bLargeIcons ? $SHGFI_LARGEICON : $SHGFI_SMALLICON, _
$bForceLoadFromDisk ? 0 : $SHGFI_USEFILEATTRIBUTES)
Local $ret = _WinAPI_ShellGetFileInfo($sFilePath, $iFlags, $FILE_ATTRIBUTE_NORMAL, $tFileInfo)
If $ret Then Return DllStructGetData($tFileInfo, 'iIcon')
Return SetError(1, 0, -1)
EndFunc ;==>_GUIImageList_GetFileIconIndex
Alles anzeigen
Der Code stammt aus dem Internet.
Ein voll funktionsfähiges Beispiel wäre sinnvoller gewesen!
Aber das Problem liegt mit Sicherheit an "_GUIImageList_Create". Das musst Du mit "5" als dritten Parameter starten (die ersten beiden musst Du dann auch angeben).
Die "5" besagt: "Use a 32 bit DIB section". 32 Bit ist mit Alphawert (transparenz). 24Bit ist ohne Alpha.