Ordnersuche - oder sowas ähnliches

  • Hey,

    bei und im Büro werden alle Kundeninformationen (Schriftverkehr, Anlagen usw.) in einem zentralen Ordner gespeichert.
    Ordnerstruktur:

    Code
    Serverlaufwerk 
                          -  Kunden 
                                          - Kunde1
                                          - Kunde2
                                          - Kunde3


    Dadurch muss ich mich immer durch die lange Kundenliste kämpfen um zum gesuchten Ordner zu kommen. Mit der Windowshilfe komme ich irgendwie auch nicht so zurecht.

    Daher dachte ich an ein kleines Autoit-Programm - das ist aber gar nicht so einfach X(

    Ich wollte den gesuchten Ordner mit hilfe der Infos aus einer Inputbox ermitteln.
    Quasi so:

    1. Schritt: alle Ordner einlesen
    2. Schritt: Eingabe in die Inputbox, z.B. den Buchstaben A
    3. Schritt: es werden nurnoch alle Ordner mit Anfangsbuchstabe A angezeigt

    Allerdings fehlt mir irgendwie der Ansatz dazu. Muss ich bei jedem aufgelisteten Ordner den Anfangsbuchstaben ermittel und dann mit der Eingabe vergleichen?
    Gibts vielleicht eine viel einfachere Lösung mit dem Mitteln der Windowshilfe?
    Beim Schreiben fällt mir noch eine gute Beschreibung ein: Ich suche die Funktion der Autoithilfe (Index) nur eben für Ordnernamen


    So und damit es nicht heisst ich hab gar nichts gemacht ( :D ) hier mal das drumherum:

    Spoiler anzeigen
    [autoit]


    #include<Guilistview.au3>
    #include <File.au3>
    ;#include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $NB_DBLCLK = -3
    Global Const $WM_NOTIFY = 0x004E
    Global Const $GUI_EVENT_CLOSE = -3

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate("", 300, 480)
    Global $hListView = GUICtrlCreateListView("Ordner", 0, 0, 280, 420, $LVS_SHOWSELALWAYS)
    Global $hLoad = GUICtrlCreateButton("Test", 180, 440, 70, 20)
    Global $isuche = GUICtrlCreateInput("", 10, 440,150)
    Global $path = 'C:\Programme' ;Beispiel

    [/autoit] [autoit][/autoit] [autoit]

    Global $hLVHandle = GUICtrlGetHandle($hListView)
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Ordner", 240, 0)

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_RegisterSortCallBack($hLVHandle)
    GUISetState(@SW_SHOW, $hGui)
    GUIRegisterMsg($WM_NOTIFY, "_DoubleClickOnListView")
    _Load()

    [/autoit] [autoit][/autoit] [autoit]

    while 1
    $Msg = GUIGetMsg()
    switch $Msg
    case $GUI_EVENT_CLOSE
    _GUICtrlListView_UnRegisterSortCallBack($hLVHandle)
    Exit
    case $hLoad
    MsgBox(1, "", _GUICtrlListView_GetItemCount($hLVHandle)) ;nur zu testzwecken
    EndSwitch
    wend

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Load() ;Array ins Listview laden
    _GUICtrlListView_BeginUpdate($hLVHandle) ; Listview sperren
    $aFolder = _FileListToArray($path, "*", 2)
    for $i = 1 to $aFolder[0]
    $string = stringsplit($afolder[$i], "\")
    GUICtrlCreateListViewItem($string[$string[0]], $hListView) ; mit den eingelesenen Daten einen neuen Listview-Eintrag erstellen
    next
    _GUICtrlListView_EndUpdate($hLVHandle) ; Listview wieder freigeben
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Openfolder()
    local $iselection = _GUICtrlListView_GetSelectionMark($hLVHandle)
    local $itext =_GUICtrlListView_GetItemText ($hLVHandle,$iselection)
    ShellExecute($path & "\" & $itext)
    endfunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _DoubleClickOnListView($hWnd, $Msg, $wParam, $lParam) ;Doppelklick auf ein Listviewitem
    Local $tagNMHDR, $event, $hwndFrom, $code
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3); Checkt wie das EVENT aussieht
    If $wParam = $hListView and $event = $NB_DBLCLK Then ;Wenn der Klick auf das ListView ging und es ein Doppelklick war, dann
    _Openfolder()
    EndIf
    $tagNMHDR = 0
    $event = 0
    $lParam = 0
    EndFunc ;==>_DoubleClickOnListView

    [/autoit]

    2 Mal editiert, zuletzt von nuts (23. April 2009 um 12:02)

  • Also,
    ist das der Windows-Explorer in dem Ihr euch bewegt?
    Wenn ja dann den Ordner Kunden öffnen und einfach auf der Tastatur den Anfangsbuchstaben des Kunden eingeben und du sprongst schonmal dahin.
    Wenn du etwas schneller tippenkannst, kannst du auch einfach den Namen des Kunden schreiben. ;)
    Dafür brauchst du nicht mal Autoit.

    MfG
    Der_Doc

  • Hab mal was gebastelt:

    Spoiler anzeigen
    [autoit]

    #include <GuiListBox.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $Ordner = 'C:\Programme'
    Local $TempFile = _TempFile()
    Global $aOrdner

    [/autoit] [autoit][/autoit] [autoit]

    RunWait(@ComSpec & " /c " & 'dir "'&$Ordner&'" /ad /b > "'&$TempFile&'"', "", @SW_HIDE)
    _FileReadToArray($TempFile, $aOrdner)
    FileDelete($TempFile)

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate('Schnelle Ordnerauswahl by funkey', 400, 600, -1, -1)
    GUISetOnEvent(-3, '_Ende')
    GUIRegisterMsg($WM_COMMAND, "_Check_Eingabe")

    [/autoit] [autoit][/autoit] [autoit]

    Global $Input = GUICtrlCreateInput('', 10, 10, 380, 20)
    GUICtrlSetOnEvent(-1, '_Open_Ordner')
    Global $List = GUICtrlCreateList('', 10, 40, 380, 560)
    Global $hList = GUICtrlGetHandle(-1)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aOrdner[0]
    GUICtrlSetData(-1, $aOrdner[$i])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Check_Eingabe($hWnd, $Msg, $wParam, $lParam)
    _GUICtrlListBox_SetCurSel($hList, _GUICtrlListBox_FindString($hList, GUICtrlRead($Input)))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Open_Ordner()
    If GUICtrlRead($List) <> "" Then ShellExecute($Ordner & '\' & GUICtrlRead($List))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Ende()
    Exit
    EndFunc

    [/autoit]
  • Habs etwas ausgebaut.
    So kann man auch durch einen Doppelklick einen Ordner öffnen und man kann per TAB direkt in die Listbox und mit Hoch/Runter darin navigieren.

    Spoiler anzeigen
    [autoit]


    #include <GuiListBox.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $Ordner = 'C:\Programme'
    Local $TempFile = _TempFile()
    Global $aOrdner
    HotKeySet("{ENTER}", "_Open_Ordner")

    [/autoit] [autoit][/autoit] [autoit]

    RunWait(@ComSpec & " /c " & 'dir "'&$Ordner&'" /ad /b > "'&$TempFile&'"', "", @SW_HIDE)
    _FileReadToArray($TempFile, $aOrdner)
    FileDelete($TempFile)

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    $gui = GUICreate('Schnelle Ordnerauswahl by funkey', 400, 600, -1, -1)
    GUISetOnEvent(-3, '_Ende')
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

    [/autoit] [autoit][/autoit] [autoit]

    Global $Input = GUICtrlCreateInput('', 10, 10, 380, 20)
    Global $List = GUICtrlCreateList('', 10, 40, 380, 560)
    Global $hList = GUICtrlGetHandle(-1)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aOrdner[0]
    GUICtrlSetData(-1, $aOrdner[$i])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Check_Eingabe($iwParam)
    switch $iwParam
    case 0x03000003
    _GUICtrlListBox_SetCurSel($hList, _GUICtrlListBox_FindString($hList, GUICtrlRead($Input)))
    EndSwitch
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Open_Ordner()
    If GUICtrlRead($List) <> "" Then ShellExecute($Ordner & '\' & GUICtrlRead($List))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Ende()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    _Check_Eingabe($iwParam)
    Local $hWndFrom, $iIDFrom, $iCode, $hWndListBox
    If Not IsHWnd($List) Then $hWndListBox = GUICtrlGetHandle($List)
    $hWndFrom = $ilParam
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
    $iCode = BitShift($iwParam, 16) ; Hi Word
    Switch $hWndFrom
    Case $List, $hWndListBox
    Switch $iCode
    Case $LBN_DBLCLK
    _Open_Ordner()
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND (Bugfix - http://www.autoit.de)

    [/autoit]

    Beeindruckend ist der Speed beim Einlesen der Ordner.

    [autoit]

    RunWait(@ComSpec & " /c " & 'dir "'&$Ordner&'" /ad /b > "'&$TempFile&'"', "", @SW_HIDE)
    _FileReadToArray($TempFile, $aOrdner)
    FileDelete($TempFile)

    [/autoit]


    Das sind wohl diese Zeilen. Vielleicht kann mir noch jemand die erste Zeile erklären? Auch Verzeichnisse mit sehr vielen Ordnern sind sofort geladen (als Vergleich meine "drumherum" aus Post1) und ich wüsste gerne wie genau der gute funkey das gemacht hat.

    edit \ Noch ne Frage ..
    Es gibt ja verschieden Windows Konstanten, die in der <WindowsConstants.au3> deklariert sind.
    Hier im Skript wird z.B. $WM_COMMAND verwendete. Wo sind diese näher erklärt? Im Beispiel quasi: Mit welchem COMMAND wird die jeweilige Funktion angesprochen?
    In der Hilfe bin ich nicht fündig geworden.

    Einmal editiert, zuletzt von nuts (24. April 2009 um 19:24)