Indexsuche

  • Hiho
    Ihr kennt ja gewiss aus der Hilfe die Indexsuche. Jetzt bin ich auch dran so etwas in meinem Script zu verwenden. In einem Input kann man den Text eingeben und über ein adlib wird immer wieder geprüft ob sich etwas ändert. Falls sich etwas ändert sollte soll erneut geprüft werden, ob der Eintrag vorhanden ist (Die Section einer Ini).
    In meinem ersten Ansatz werden alle Wörter angezeigt, deren x-ter Buchstabe gleich sind (z.B. Eingabe: Stein; Liste: Stier, Schaden, ABe...). In meinem zweiten Ansatz wird je nach Länge der Eingabe das vorhandensein geprüft. Dabei entstehen noch Fehler...
    Vielleicht kennt ihr ja eine Möglichkeit :)
    Aquaplant

    Einmal editiert, zuletzt von Aquaplant (19. Januar 2010 um 22:31)

    • Offizieller Beitrag

    Eine Indexsuche würde ich so programmieren:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <EditConstants.au3>
    #include <File.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $sPath = StringRegExpReplace(@AutoItExe, '(.+\\).+', '$1') & 'Include\'
    $aFiles = _FileListToArray($sPath, '*.au3', 1)
    $hGui = GUICreate('Indexsearch', 400, 300)
    $hInput = GUICtrlCreateInput('', 10, 10, 380, 20)
    $hFound = GUICtrlCreateInput('', 10, 60, 380, 20, $ES_READONLY)
    GUICtrlSetBkColor(-1, 0xffaaaa)
    GUISetState()
    GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $nID, $sSearch, $iIndex
    $nID = BitAND($wParam, 0x0000FFFF)
    If $nID = $hInput Then
    $sSearch = GUICtrlRead($hInput)
    $iIndex = _ArraySearch($aFiles, $sSearch, 0, 0, 0, 1)
    If Not @error Then
    GUICtrlSetData($hFound, $aFiles[$iIndex])
    GUICtrlSetBkColor($hFound, 0xaaffaa)
    Else
    GUICtrlSetData($hFound, '')
    GUICtrlSetBkColor($hFound, 0xffaaaa)
    EndIf
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]
  • Sieht schonmal ganz toll aus, nur wills bei mir noch nicht richtig klappen:

    [autoit]

    $Sections = IniReadSectionNames(@ScriptDir & "\Sammlungen\S2.dat")
    For $a = 1 To $Sections[0]
    $Found = _ArraySearch($Sections[$a], $Suche)
    If @error Then
    MsgBox(0, "", @error)
    EndIf
    GUICtrlSetData($ListSuche, $Found)
    Next

    [/autoit]


    Angeblich ist das kein Array ...

  • Das ganze Script zu posten würde den Rahmen sprengen, was wichtig wäre ist das hier:

    Spoiler anzeigen
    [autoit]

    AdLibRegister("NeueSuche", 100)
    While 1$Listegewahlt = GUICtrlRead($ListSuche)Wend
    Func NeueSuche()
    $Suche = GUICtrlRead($InputSuche)
    If $Suche <> "Suche" And $SucheALT <> $Suche Then
    _GUICtrlListBox_ResetContent($ListSuche)
    $StringSuche = StringSplit($Suche, "")
    If Not @error Then
    If $Ger = 1 Then ;=== Erster Ansatz (klappt)
    $Sections = IniReadSectionNames(@ScriptDir & "\Sammlungen\S1.dat")
    For $i = 1 To $Sections[0]
    $stringsection = StringSplit($Sections[$i], "")
    If $StringSuche[0] > $stringsection[0] Then
    For $a = 1 TO $stringsection[0]
    If $StringSuche[$a] = $stringsection[$a] Then
    GUICtrlSetData($ListSuche, $Sections[$i])
    EndIf
    Next
    EndIf
    If $StringSuche[0] <= $stringsection[0] Then
    For $a = 1 TO $StringSuche[0]
    If $StringSuche[$a] = $stringsection[$a] Then
    GUICtrlSetData($ListSuche, $Sections[$i])
    EndIf
    Next
    EndIf
    Next
    $SucheALT = $Suche
    EndIf
    If $ENG = 1 Then
    $Sections = IniReadSectionNames(@ScriptDir & "\Sammlungen\S2.dat")
    For $a = 1 To $Sections[0]
    $Found = _ArraySearch($Sections[$a], $Suche)
    If @error Then
    MsgBox(0, "", @error)
    EndIf
    GUICtrlSetData($ListSuche, $Found)
    Next
    EndIf
    $SucheALT = $Suche

    [/autoit]


    und ein Input + Liste
    In der S2.dat kann alles drin stehen, was in einer Ini auch immer drin steht, sie ist nur umbenannt. Zum Testen können ähnliche Wörter verwendet werden:

    Spoiler anzeigen

    [Stine]
    [Salz]
    [Stoen]
    [Stone]
    [Stein]
    [Stone Pine]


    In erster Linie ging es mir um das Problem, das $Sections angeblich kein Array sein soll ?( Das ist total unlogisch, weil in jedem Fall ein Array zurückgegeben wird

  • :cursing: Da schreib ich alles ausführlich und dann das hier als ich abschicken will:

    Spoiler anzeigen

    Fatal error: Invalid SQL: INSERT INTO wbb1_1_post_hash (postID, messageHash, time) VALUES (133203, 'aeac3af0e46127d9806768a94ae2f5c15860ef67', 1263901669)


    You get more information about the problem in our knowledge base: http://www.woltlab.com/help/?code=1062
    Information:

    error message: Invalid SQL: INSERT INTO wbb1_1_post_hash (postID, messageHash, time) VALUES (133203, 'aeac3af0e46127d9806768a94ae2f5c15860ef67', 1263901669)
    error code: 1062
    sql type: MySQLDatabase
    sql error: Duplicate entry 'aeac3af0e46127d9806768a94ae2f5c15860ef67' for key 1
    sql error number: 1062
    sql version:
    file: /var/www/vhosts/autoit.de/httpdocs/wcf/lib/system/database/MySQLDatabase.class.php (116)
    php version: 5.2.12
    wcf version: 1.0.11 pl 3 (Horizon)
    date: Tue, 19 Jan 2010 11:47:49 +0000
    request: /index.php?form=PostAdd&threadID=17133
    referer: http://www.autoit.de/index.php?form=PostAdd&threadID=17133
    Stacktrace:
    #0 /var/www/vhosts/autoit.de/httpdocs/lib/data/post/PostEditor.class.php(286): MySQLDatabase->sendQuery('INSERT INTO?wbb...')
    #1 /var/www/vhosts/autoit.de/httpdocs/lib/form/PostAddForm.class.php(93): PostEditor::create('17133', '', 'Das ganze Scrip...', '203767', 'Aquaplant', Array, Object(AttachmentsEditor), Object(PollEditor), NULL, 0)
    #2 /var/www/vhosts/autoit.de/httpdocs/lib/form/ThreadAddForm.class.php(125): PostAddForm->save()
    #3 /var/www/vhosts/autoit.de/httpdocs/wcf/lib/form/AbstractForm.class.php(88): ThreadAddForm->submit()
    #4 /var/www/vhosts/autoit.de/httpdocs/wcf/lib/form/CaptchaForm.class.php(78): AbstractForm->readData()
    #5 /var/www/vhosts/autoit.de/httpdocs/wcf/lib/form/MessageForm.class.php(181): CaptchaForm->readData()
    #6 /var/www/vhosts/autoit.de/httpdocs/lib/form/ThreadAddForm.class.php(288): MessageForm->readData()
    #7 /var/www/vhosts/autoit.de/httpdocs/lib/form/PostAddForm.class.php(159): ThreadAddForm->readData()
    #8 /var/www/vhosts/autoit.de/httpdocs/wcf/lib/page/AbstractPage.class.php(74): PostAddForm->readData()
    #9 /var/www/vhosts/autoit.de/httpdocs/wcf/lib/form/MessageForm.class.php(221): AbstractPage->show()
    #10 /var/www/vhosts/autoit.de/httpdocs/lib/form/ThreadAddForm.class.php(349): MessageForm->show()
    #11 /var/www/vhosts/autoit.de/httpdocs/lib/form/PostAddForm.class.php(249): ThreadAddForm->show()
    #12 /var/www/vhosts/autoit.de/httpdocs/wcf/lib/page/AbstractPage.class.php(36): PostAddForm->show()
    #13 /var/www/vhosts/autoit.de/httpdocs/wcf/lib/util/RequestHandler.class.php(63): AbstractPage->__construct()
    #14 /var/www/vhosts/autoit.de/httpdocs/wcf/lib/util/RequestHandler.class.php(94): RequestHandler->__construct('PostAdd', Array, 'form')
    #15 /var/www/vhosts/autoit.de/httpdocs/index.php(9): RequestHandler::handle(Array)
    #16 {main}


    In der Kurzfassung: In der S2.dat sind wie in einer normalen Ini Sektionen, die Datei ist nur umbenannt.
    Was mich nur wundert ist, das angeblich $sections kein Array ist, obwohl in jedem Fall ein Array ausgegeben wird.
    EDIT: Hey, ist ja doch noch angekommen :)

    Einmal editiert, zuletzt von Aquaplant (19. Januar 2010 um 12:59)

  • Ok habs, die Lösung ist mir heute während des Matheunterrichtes eingefallen :D

    Spoiler anzeigen
    [autoit]

    $Sections = IniReadSectionNames(@ScriptDir & "\Sammlungen\S2.dat")
    For $i = 1 To $Sections[0]
    $Passt = StringInStr($Sections[$i], $Suche)
    If Not @error And $Passt <> 0 Then
    GUICtrlSetData($ListSuche, $Sections[$i])
    EndIf
    Next

    [/autoit]


    Leichter gehts auch nich :D :rolleyes: