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
Indexsuche
-
- [ gelöst ]
-
Aquaplant -
19. Januar 2010 um 11:47 -
Geschlossen -
Erledigt
-
-
- Offizieller Beitrag
Eine Indexsuche würde ich so programmieren:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [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_CLOSEFunc _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
[/autoit]
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 -
Sieht schonmal ganz toll aus, nur wills bei mir noch nicht richtig klappen:
[autoit]$Sections = IniReadSectionNames(@ScriptDir & "\Sammlungen\S2.dat")
[/autoit]
For $a = 1 To $Sections[0]
$Found = _ArraySearch($Sections[$a], $Suche)
If @error Then
MsgBox(0, "", @error)
EndIf
GUICtrlSetData($ListSuche, $Found)
Next
Angeblich ist das kein Array ... -
- Offizieller Beitrag
Wie soll das jemand nachvollziehen können?
Poste bitte Dein ganzes Script und die "S2.dat" oder eine entsprechende Beispieldatei, wenn da private Dinge drin stehen.
Wenn wir raten sollen, ist weder uns noch Dir geholfen... -
Das ganze Script zu posten würde den Rahmen sprengen, was wichtig wäre ist das hier:
Spoiler anzeigen
[autoit]AdLibRegister("NeueSuche", 100)
[/autoit]
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
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 -
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
-
Ok habs, die Lösung ist mir heute während des Matheunterrichtes eingefallen

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