Labels - bessere Gestaltung und Suchfunktion

  • Hallo an alle,

    ich befinde mich derzeit in der Programmierung für ein kleines Hilfstool für mich und meine Arbeitskollegen.

    Es ist nix superneuerfundenes... für uns ist es nur eine Art "Wiki" - ein Nachschlagewerk.

    Im groben ist das ganze so aufgebaut, dass ich eine MainGUI erstelle, dort ein Tab drübergeballert hab mit meinen 10 TabItems und innerhalb der Tabs dann mein Inhalt reinkommt. Da ich derzeit keine Ahnung habe wie ich es anders lösen kann erstelle ich einfach Labels an den gewünschten Positionen, in die dann mein Text reinkommt.

    Da ich keine richtige Tabellenfunktion (wie bei HTML) gefunden habe artet das ganze extrem aus. Entweder erstelle ich ein Label welches dann mit ganz vielen Leerzeichen gefüllt wird (innerhalb/zwischen des Textes) damit alles am richtigen Platz steht (bessere Performance, aber sehr lange Zeilen daher schlechte Übersicht) oder ich erstelle einfach ganz viele Labels welches sich aber extrem auf die Performance auswirkt (die Arbeitsrechner sind sehr langsam). Mit den ganzen vielen Labels ist das ausserdem noch ein extrem hoher Arbeitsaufwand.

    Evtl habt ihr hier Tipps / Ideen wie ich das besser gestalten kann ausser mit Labels? (Bitte keine Editboxen - der Inhalt soll direkt auf der GUI liegen ohne Hintergrund wie es in einer Editbox der Fall wäre).

    Zum anderen hab ich mich dumm und dämlich gesucht, was das Thema Suchfunktion für Labels angeht. Da die GUI wirklich sehr groß ist (derzeit scroll ich teilweise bis zu 20.000 Pixel nach unten) und unterschiedliche Themen auffässt würde ich ein Suchfeld bevorzugen, wo ich ein Wort/Begriff eingebe und mit Klick auf den Button Suche er dort hin springt.

    Ich habe genau sowas bereits für die Editbox gefunden - aber ich brauchs ja für Labels. Gibts sowas? Hab ich zu hohe Anforderungen? Was habt Ihr für Ideen?

    Hier mal ein kleiner Auschnitt aus meinem Script damit man sieht, was das für Müll mit den Labels ist:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>

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

    global $mainGui = GUIcreate("Wiki", 1300, 950)

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

    $tab = GUICtrlCreateTab(-1,-1,1300,950)
    $tab2 = GUICtrlCreateTabItem("Kontakte")

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

    GUICtrlCreateLabel("Kontakte:", 20, 35, 150, 20)
    GUICtrlSetFont(-1, 12, 800, 0, "Verdana")
    GUICtrlCreateLabel("|", 335, 35, 150, 20)
    GUICtrlSetFont(-1, 12, 800, 0, "Verdana")
    GUICtrlCreateLabel("Telefon:", 350, 35, 150, 20)
    GUICtrlSetFont(-1, 12, 800, 0, "Verdana")
    GUICtrlCreateLabel("|", 535, 35, 150, 20)
    GUICtrlSetFont(-1, 12, 800, 0, "Verdana")
    GUICtrlCreateLabel("E-Mail:", 550, 35, 150, 20)
    GUICtrlSetFont(-1, 12, 800, 0, "Verdana")
    GUICtrlCreateLabel("|", 835, 35, 150, 20)
    GUICtrlSetFont(-1, 12, 800, 0, "Verdana")
    GUICtrlCreateLabel("Fax:", 850, 35, 150, 20)
    GUICtrlSetFont(-1, 12, 800, 0, "Verdana")
    GUICtrlCreateLabel("|", 1035, 35, 150, 20)
    GUICtrlSetFont(-1, 12, 800, 0, "Verdana")
    GUICtrlCreateLabel("Zusatz:", 1050, 35, 150, 20)
    GUICtrlSetFont(-1, 12, 800, 0, "Verdana")

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

    GUICtrlCreateLabel("______________________________________________________________________________________________________________________________", 20, 45, 1250, 20)
    GUICtrlSetFont(-1, 11, 800, 5, "Verdana")

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

    GUICtrlCreateLabel("DE Customer Support:", 20, 65, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("|", 335, 65, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("(049) 123456789", 350, 65, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("|", 535, 65, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("email@email.com", 550, 65, 200, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("|", 835, 65, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("", 850, 65, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("|", 1035, 65, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("", 1050, 65, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")

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

    GUICtrlCreateLabel("Blabla abteilung:", 20, 85, 200, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("|", 335, 85, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("(049) 1234556789", 350, 85, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("|", 535, 85, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("test@test.com", 550, 85, 280, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("|", 835, 85, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("(049)987654321", 850, 85, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("|", 1035, 85, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")
    GUICtrlCreateLabel("", 1050, 85, 150, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Verdana")

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

    While 1
    $msg = GUIgetmsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Hier mal ein Beispiel, was vielleicht für einen Anfänger einfacher ist ;)

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>

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

    _Main()

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

    Func _Main()
    Local $iI, $hListView
    GUICreate("ListView: Sucht ein Item", 400, 300)
    $hListView = GUICtrlCreateListView("", 2, 2, 394, 268)
    GUISetState()
    ; Fügt die Spalten hinzu
    _GUICtrlListView_AddColumn($hListView, "Items", 100)
    _GUICtrlListView_AddColumn($hListView, "NewItems", 100)
    ; Fügt die Items hinzu
    _GUICtrlListView_BeginUpdate($hListView)
    For $iI = 1 To 100
    _GUICtrlListView_AddItem($hListView, "Item " & $iI)
    _GUICtrlListView_AddSubItem($hListView, $iI- 1, "Test " & $iI, 1)
    Next
    _GUICtrlListView_EndUpdate($hListView)

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

    ; Setzt für Item 50 einen Parameterwert
    _GUICtrlListView_SetItemParam($hListView, 49, 1234)

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

    ; Suche nach Zielitem
    _GUICtrlListView_EnsureVisible($hListView, $iI)
    $input = InputBox("Suche", "zu suchendes Item angeben", "Item 11")
    $Found = 0
    For $k = 0 To _GUICtrlListView_GetColumnCount($hListView) ; für alle Spalten
    For $i = 0 To _GUICtrlListView_GetItemCount($hListView) ; für alle Zeilen
    If StringInStr(_GUICtrlListView_GetItemText($hListView, $i, $k), $input) <> 0 Then; Wenn der Itemtext gleich dem Suchwort ist
    _GUICtrlListView_SetItemSelected($hListView, $i, True, False) ; Wählt das gefundene Item aus
    _GUICtrlListView_EnsureVisible($hListView, $i) ; Scrollt bis zum gefundenen Item
    MsgBox(0, "Gefunden", "Text gefunden in Zeile " & $i)
    $Found = 1
    EndIf
    Next
    Next
    If $Found = 0 THen
    MsgBox(0, "Nicht gefunden", "Text wurde nicht gefunden")
    EndIf
    Exit
    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
    EndFunc ;==>_Main

    [/autoit]

    -- EDIT --
    war ein kleiner Fehler drin, hab ich mal editiert

  • HTMLayout wäre auch eine Alternative. Dann kannst du mit einer Untermenge von HTML und CSS deine Textte gestalten. Eine Suche ist sicherlich auch irgendwie möglich.

  • und wie fügt man einen 2. wert in die Tabelle (liste) ein?

  • HTMLayout wäre auch eine Alternative. Dann kannst du mit einer Untermenge von HTML und CSS deine Textte gestalten. Eine Suche ist sicherlich auch irgendwie möglich.

    Wenn ich das richtig sehe ist dies ein eigenes Programm, was mit AutoIt nichts zu tun hat, oder? Werd es mir mal anschauen. Danke für den Tipp.

    Jedoch möchte ich gern auch eine AutoIt alternative wissen, da ich mein Wissen dort ebenfalls erweitern möchte ;)

    Dsa Beispiel mit ListView habe ich auch schon überlegt. Jedoch hab ich derzeit doch grad auf Editboxen zurückgegriffen. woanders erhielt ich den Tipp mit den Styles, wo ich die Editboxen praktisch unsichtbar mache was dem Layout der Labels also gleichkommt.

    Würde sich für mich jedoch dann die Frage mit der Suche stellen. Ich weiß, dass man Suchen über die Editbox laufen lassen kann, jedoch halt auf das eine Editfeld beschränkt.

    Hätte jemand ein kleines Beispiel wie ein Suchfeld über mehrere Editboxen hinweg sucht?

    Vielen lieben Dank im voraus für Eure mithilfe!

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Wenn ich das richtig sehe ist dies ein eigenes Programm, was mit AutoIt nichts zu tun hat, oder? Werd es mir mal anschauen. Danke für den Tipp.


    Das ist eine DLL, die du mit AutoIt zusammen verwenden kannst. Eine Suche zu erstellen ist aber nicht ganz so einfach.

  • Also ich hab derzeit folgendes Skript für eine Suche innerhalb der Editfelder. diese Version gefällt mir sehr gut - und eigentlich müßte es nur auf alle Editfelder ausdehnt werden - dann wär mein Ziel schon erreicht ;)

    [autoit]

    #include <GUIConstants.au3>
    #include <GUIEdit.au3>

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

    $hWnd = GUICreate("Search Example", 300, 350)
    $cEdit_Text = _GUICtrlEdit_Create($hWnd, "", 5, 40, 290, 290, BitOR(0x0040, 0x0100, 0x0004, 0x00200000))
    $cInput_Searchstring = GUICtrlCreateInput("Suchwort", 5, 5, 235, 25)
    $cButton_Search = GUICtrlCreateButton("Suchen", 245, 5, 50, 25)
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    _GUICtrlEdit_Destroy($cEdit_Text)
    Exit
    Case $cButton_Search
    $aSearch = _SearchString(_GUICtrlEdit_GetText($cEdit_Text), GUICtrlRead($cInput_Searchstring))
    Switch @error
    Case 0
    _GUICtrlEdit_SetSel($cEdit_Text, $aSearch[0] - 1, $aSearch[1] - 1)
    ControlFocus($hWnd, "", $cEdit_Text)
    Case 1
    MsgBox(16, "Fehler", "String wurde nicht gefunden.")
    Case 2
    MsgBox(16, "Fehler", "Kein Suchwort eingegeben oder Textfeld leer.")
    EndSwitch
    EndSwitch
    WEnd

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

    Func _SearchString($sText_Search, $sSearchString)
    If StringReplace($sText_Search, " ", "") = "" Or StringReplace($sSearchString, " ", "") = "" Then Return SetError(2, 0, 0)

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

    $iStringInStr = StringInStr($sText_Search, $sSearchString)
    If Not $iStringInStr Then Return SetError(1, 0, 0)

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

    Local $aReturn[2] = [$iStringInStr, $iStringInStr + StringLen($sSearchString)]
    Return $aReturn
    EndFunc

    [/autoit]

    Jedoch wird in diesem Beispiel mit _GUICtrlEdit_Create gearbeitet während ich in meinen Skript das "normale" GUICtrlCreateEdit verwende (und davon halt fast hundert Stück)...

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Die Funktionen lassen sich auch mit GUICtrlCreateEdit verwenden. Zum Durchsuchen aller Edits musst du diese eben in einer Schleife nacheinander durchgehen ;)

  • Ok ich hab nun die Suchfunktion eingebaut. Funktioniert auch. Das ist für mein Anfängerwissen auch schon sehr viel ;)

    Könntest Du mir ein kleines Beispiel schreiben wo er mit einer Schleife sowas durchsucht? Ich würde mir das Beispiel dann entsprechend anpassen. Derzeit durchsucht er halt wie erwähnt nur explizit ein Editfeld, welches mit der Variable $cEdit_Text deklariert ist (siehe Bsp oben von dem Skript - Beitrag 8 ).

    Ein weiteres Beispiel ist, dass er nicht weitersucht, wenn der Begriff 2x oder mehr enthalten ist - sobald er den ersten Eintrag gefunden hat bleibt er dort.

    Und als letztes (oh Gott, mir ist das unangenehm soviel zu Fragen) - er scrollt dabei nicht. Wenn meine GUI 900 Pixel vertikal ist und der Inhalt durch Scrollfunktion aber an Position 5000 steht scrollt er nicht runter.... er markiert zwar den gefundenen Text, man muss aber selber runterscrollen wobei man schnell den gefunden Suchbegriff übersehen kann :(

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Sorry wenn ich hier nochmal nachhake,

    aber leider ist mein AutoIt-Wissen zu begrenzt als das ich das mit den Schleifen verstehe. An sich verstehe ich schon Schleifen - aber nur in bestimmten Situationen. Da aber viele Situationen anders sind versteh ich eben nicht alle und die meinige erst recht nicht. Eigentlich, wenn ich es richtig sehe, müßte hier eine Do - Until - Schleife ausreichen? Aber ich versteh nicht genau wie ich es umsetzen muss :(

    Warum es hakt liegt einfach daran: Im Skript aus Post 8 durchsucht er speziell ja das Editfeld, welches vorher mit der Variable $cEdit_Text deklariert ist. Nun versteh ich aber nicht, wie ich ne Schleife mache kann und er alle anderen Editfelder durchstöbert ohne diese Variable... *sehr verwirrt bin* :(

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Ich hätte die Edits in einem Array angelegt:

    [autoit]

    $aEdits[5]
    $aEdits[0] = GUICtrlCraeteEdit
    $aEdits[1] = GUICtrlCraeteEdit
    ...
    $aEdits[4] = GUICtrlCraeteEdit

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

    For $i = 0 To Ubound($aEdits)-1
    ; Suche in $aEdit[$i]
    Next

    [/autoit]
  • Hallo progandy,

    erstmal vielen Dank das Du Dir die Zeit nimmst hier überhaupt zu helfen ;)

    Das das evtl über Arrays gelöst werden kann hatte ich auch schon im Kopf - jedoch ist Array auch wieder eine Ecke die mir zu hoch ist.

    An sich sagt ja dein Beispiel schon fast alles aus... nur den "Suche in $aEdit[$i] " Teil hast natürlich ohne Beispiel belassen ;)

    Da ich mich sehr als unwissender an das obige Skript klammer stellt sich die Frage, wie ich die Suche mit dem obigen code verwirklichen kann....

    Liebe Grüße
    Mirko

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • [autoit]

    For $i = 0 To Ubound($aEdits)-1
    $aSearch = _SearchString(_GUICtrlEdit_GetText($aEdits[$i]), GUICtrlRead($cInput_Searchstring))
    Switch @error
    Case 0
    _GUICtrlEdit_SetSel($aEdits[$i] $aSearch[0] - 1, $aSearch[1] - 1)
    ControlFocus($hWnd, "",$aEdits[$i])
    ExitLoop
    Case 2
    MsgBox(16, "Fehler", "Kein Suchwort eingegeben oder Textfeld leer.")
    ExitLoop
    EndSwitch[
    Next
    If @error = 1 Then MsgBox(0, "", "Nichts gefunden"

    [/autoit]
  • Wunderbar... nach etwas rumfummeln mit dem Code funktioniert er nun soweit in meinem Script.

    Zum testen verwende ich derzeit dieses kleine hier:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GUIEdit.au3>

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

    $hWnd = GUICreate("Test-GUI", 1299, 930, 0, 19)
    $cInput_Searchstring = GUICtrlCreateInput("", 5, 5, 235, 25)
    $cButton_Search = GUICtrlCreateButton("Suchen", 245, 5, 50, 25)
    Global $aEdits[2]

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

    GUICtrlCreateGroup("1. Error while connecting to Datasource / SQL Connect", 30, 285, 1220, 520)
    GUICtrlSetFont(-1, 12, 800, 0, "Verdana")
    FileInstall("M:\Agents\CT Profis\751076\wikiportable\wiki pics\FSM1.JPG", @TempDir & "\FSM1.JPG", 1)
    GUICtrlCreatePic(@TempDir & "\FSM1.JPG", 250, 330, 784, 146)
    GUICtrlCreateEdit("Problem:", 100, 1000, 100, 20, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN), 0)
    GUICtrlSetFont(-1, 9, 800, 4, "Verdana")
    GUICtrlSetColor(-1, 0xff0000)
    $aEdits[0] = GUICtrlCreateEdit("Das Programm lässt sich nicht starten, da der " & @CRLF & "Client sich nicht zum Server (in der Firma) " & @CRLF & "verbinden kann. Bzw., wenn es eine Client/Server " & @CRLF & "Installation ist, laufen die Service nicht " & @CRLF & "korrekt. Dieser Fehler entsteht, wenn die interne " & @CRLF & "Kommunikation nicht funktioniert.", 100, 520, 300, 100, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN), 0)
    GUICtrlSetFont(-1, 9, 400, 0, "Verdana")
    GUICtrlCreateEdit("Lösung:", 550, 500, 100, 20, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN), 0)
    GUICtrlSetFont(-1, 9, 800, 4, "Verdana")
    GUICtrlSetColor(-1, 0x00E900)
    $aEdits[1] = GUICtrlCreateEdit("Kunde soll als erstes den Service WorldProDatabaseServer resetten." & @CRLF & "Ausführen -> services.msc alternativ Systemsteuerung -> Verwaltung -> Dienste" & @CRLF & "Ist der Server gestartet?" & @CRLF & "Überprüfe folgende Einstellungen in den ODBC-Datenquellen:" & @CRLF & "Systemsteuerung -> Verwaltung - ODBC-Datenquellen -> System DNS -> Network" & @CRLF & "Überprüfe die IP Adresse und füge ;UDP=OFF hinzu (Bsp: 127.0.0.1;UDP=OFF)" & @CRLF & "Stimmt der Port? Stimmt der Servername in dessen Einstellungen mit dem im Client" & @CRLF & " eingetragenen überein? (ODBC). Überprüfe ob in der Firewall der Port 2638 nicht geblockt wird." & @CRLF & "* In modernen Routern ist auch eine Firewallfunktion! *" & @CRLF & @CRLF & 'Gehe zum Ordner "FSM Software/Data" und lösche die LOG Datei (nicht die Datenbank!)' & @CRLF & 'Gehe zum Ordner "FSM Software/Ship/" und starte die "dbeng6.exe"' & @CRLF & 'Suche die "fdxworld.db" Datei, in "Options" füge "-f" hinzu und klicke OK' & @CRLF & 'Starte die "dbeng6.exe" erneut, entferne "-f" und bestätige wieder mit OK' & @CRLF & 'Bei Servern anstatt der dbeng6.exe die dbsrv6.exe nutzen!' & @CRLF & 'Danach sollte die Software wieder laufen, probiere nun die Datenbank erneut zu starten.', 550, 520, 650, 250, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN), 0)
    GUICtrlSetFont(-1, 9, 400, 0, "Verdana")

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

    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    _GUICtrlEdit_Destroy($aEdits)
    Exit
    Case $cButton_Search
    For $i = 0 To UBound($aEdits) - 1
    $aSearch = _SearchString(_GUICtrlEdit_GetText($aEdits[$i]), GUICtrlRead($cInput_Searchstring))
    Switch @error
    Case 0
    _GUICtrlEdit_SetSel($aEdits[$i], $aSearch[0] - 1, $aSearch[1] - 1)
    ControlFocus($hWnd, "", $aEdits[$i])
    ExitLoop
    Case 2
    MsgBox(16, "Fehler", "Kein Suchwort eingegeben oder Textfeld leer.")
    ExitLoop
    EndSwitch
    Next
    If @error = 1 Then MsgBox(16, "Fehler", "Suchbegriff wurde nicht gefunden.")
    EndSwitch
    WEnd

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

    Func _SearchString($sText_Search, $sSearchString)
    If StringReplace($sText_Search, " ", "") = "" Or StringReplace($sSearchString, " ", "") = "" Then Return SetError(2, 0, 0)

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

    $iStringInStr = StringInStr($sText_Search, $sSearchString)
    If Not $iStringInStr Then Return SetError(1, 0, 0)

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

    Local $aReturn[2] = [$iStringInStr, $iStringInStr + StringLen($sSearchString)]
    Return $aReturn
    EndFunc ;==>_SearchString

    [/autoit]

    ich arbeite mit fast dem identischen aufbau im liveskript. Jedoch springt er nicht bei einem weitere Klick auf den Search Button zum nächsten gefunden Objekt. Als Beispiel der Suchbegriff "und"... das wort ist mehrmals enthalten - aber egal wie oft ich den Button anklicke, er wählt immer das zuerst gefundene aus - und würde es ausserhalb der sichtbaren GUI liegen, würde er auch nicht runter/hochscrollen.

    Für ListView und Combo hab ich solche Funktionen gefunden aber leider nicht für Edit. Gibt es hier noch eine Möglichkeit?

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Du musst dir das Textfeld ($i) und das Ende des Suchworts merken. ($aSearch[1]) Beim nächsten Klick fängt die Suche an der gemerkten Position an. Dazu startest du die Schleife bei $i = $alterIndex und gibst bei StringInStr das Suchende als "start" an.

  • Öhm.. ja... Bahnhof :)

    Bei Dir sprudelt das immer so mit einer Selbstverständlichkeit raus - und bei mir kommt immer nur die Hälfte an ^^

    Ich denke, dass muß im folgenden Teil hier angepasst werden?

    [autoit]


    For $i = 0 To Ubound($aEdits)-1
    $aSearch = _SearchString(_GUICtrlEdit_GetText($aEdits[$i]), GUICtrlRead($cInput_Searchstring))
    Switch @error
    Case 0
    _GUICtrlEdit_SetSel($aEdits[$i], $aSearch[0] - 1, $aSearch[1] - 1)
    ControlFocus($hWnd, "",$aEdits[$i])
    ExitLoop
    ;HIER muss irgendwie Dein Hinweis rein?
    Case 2
    MsgBox(16, "Fehler", "Kein Suchwort eingegeben oder Textfeld leer.")
    ExitLoop
    EndSwitch[
    Next
    If @error = 1 Then MsgBox(0, "", "Nichts gefunden" )

    [/autoit]

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Ich möchte eben, dass du erst mal nachdenkst ;) Nun gut, einmal noch die Lösung:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GUIEdit.au3>

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

    Global $sLastSearch, $iLastEnd, $iLastEdit

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

    $hWnd = GUICreate("Test-GUI", 1299, 930, 0, 19)
    $cInput_Searchstring = GUICtrlCreateInput("", 5, 5, 235, 25)
    $cButton_Search = GUICtrlCreateButton("Suchen", 245, 5, 50, 25)
    Global $aEdits[2]

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

    GUICtrlCreateGroup("1. Error while connecting to Datasource / SQL Connect", 30, 285, 1220, 520)
    GUICtrlSetFont(-1, 12, 800, 0, "Verdana")
    FileInstall("M:\Agents\CT Profis\751076\wikiportable\wiki pics\FSM1.JPG", @TempDir & "\FSM1.JPG", 1)
    GUICtrlCreatePic(@TempDir & "\FSM1.JPG", 250, 330, 784, 146)
    GUICtrlCreateEdit("Problem:", 100, 1000, 100, 20, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN), 0)
    GUICtrlSetFont(-1, 9, 800, 4, "Verdana")
    GUICtrlSetColor(-1, 0xff0000)
    $aEdits[0] = GUICtrlCreateEdit("Das Programm lässt sich nicht starten, da der " & @CRLF & "Client sich nicht zum Server (in der Firma) " & @CRLF & "verbinden kann. Bzw., wenn es eine Client/Server " & @CRLF & "Installation ist, laufen die Service nicht " & @CRLF & "korrekt. Dieser Fehler entsteht, wenn die interne " & @CRLF & "Kommunikation nicht funktioniert.", 100, 520, 300, 100, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN), 0)
    GUICtrlSetFont(-1, 9, 400, 0, "Verdana")
    GUICtrlCreateEdit("Lösung:", 550, 500, 100, 20, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN), 0)
    GUICtrlSetFont(-1, 9, 800, 4, "Verdana")
    GUICtrlSetColor(-1, 0x00E900)
    $aEdits[1] = GUICtrlCreateEdit("Kunde soll als erstes den Service WorldProDatabaseServer resetten." & @CRLF & "Ausführen -> services.msc alternativ Systemsteuerung -> Verwaltung -> Dienste" & @CRLF & "Ist der Server gestartet?" & @CRLF & "Überprüfe folgende Einstellungen in den ODBC-Datenquellen:" & @CRLF & "Systemsteuerung -> Verwaltung - ODBC-Datenquellen -> System DNS -> Network" & @CRLF & "Überprüfe die IP Adresse und füge ;UDP=OFF hinzu (Bsp: 127.0.0.1;UDP=OFF)" & @CRLF & "Stimmt der Port? Stimmt der Servername in dessen Einstellungen mit dem im Client" & @CRLF & " eingetragenen überein? (ODBC). Überprüfe ob in der Firewall der Port 2638 nicht geblockt wird." & @CRLF & "* In modernen Routern ist auch eine Firewallfunktion! *" & @CRLF & @CRLF & 'Gehe zum Ordner "FSM Software/Data" und lösche die LOG Datei (nicht die Datenbank!)' & @CRLF & 'Gehe zum Ordner "FSM Software/Ship/" und starte die "dbeng6.exe"' & @CRLF & 'Suche die "fdxworld.db" Datei, in "Options" füge "-f" hinzu und klicke OK' & @CRLF & 'Starte die "dbeng6.exe" erneut, entferne "-f" und bestätige wieder mit OK' & @CRLF & 'Bei Servern anstatt der dbeng6.exe die dbsrv6.exe nutzen!' & @CRLF & 'Danach sollte die Software wieder laufen, probiere nun die Datenbank erneut zu starten.', 550, 520, 650, 250, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN), 0)
    GUICtrlSetFont(-1, 9, 400, 0, "Verdana")

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

    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    _GUICtrlEdit_Destroy($aEdits)
    Exit
    Case $cButton_Search
    $sSearchString = GUICtrlRead($cInput_Searchstring)
    If $sLastSearch <> $sSearchString Then
    $iLastEdit = 0
    $iLastEnd = 0
    EndIf
    $sLastSearch = $sSearchString
    SetError(1)
    For $i = $iLastEdit To UBound($aEdits) - 1
    $aSearch = _SearchString(_GUICtrlEdit_GetText($aEdits[$i]), $sSearchString, $iLastEnd+1)
    Switch @error
    Case 0
    _GUICtrlEdit_SetSel($aEdits[$i], $aSearch[0] - 1, $aSearch[1] - 1)
    ControlFocus($hWnd, "", $aEdits[$i])
    $iLastEdit = $i
    $iLastEnd = $aSearch[1]
    ExitLoop
    Case 2
    MsgBox(16, "Fehler", "Kein Suchwort eingegeben oder Textfeld leer.")
    ExitLoop
    EndSwitch
    Next
    If @error = 1 Then
    MsgBox(16, "Fehler", "Suchbegriff wurde nicht gefunden.")
    $iLastEdit = 0
    $iLastEnd = 0
    EndIf
    EndSwitch
    WEnd

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

    Func _SearchString($sText_Search, $sSearchString, $iStart = 0)
    If StringReplace($sText_Search, " ", "") = "" Or StringReplace($sSearchString, " ", "") = "" Then Return SetError(2, 0, 0)

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

    $iStringInStr = StringInStr($sText_Search, $sSearchString, 0, 1, $iStart)
    If Not $iStringInStr Then Return SetError(1, 0, 0)

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

    Local $aReturn[2] = [$iStringInStr, $iStringInStr + StringLen($sSearchString)]
    Return $aReturn
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Danke für Deine Mithilfe - auch ich mag gerne mitdenken, denn nur so lerne ich auch was. Jedoch hört bei mir irgendwann das Verständniss für den Code auf. Und bei Deinem Beispiel (was übrigens wunderbar funktioniert) versteh ich gerade mal die Hälfte. Natürlich kann man anhand der Befehlsnamen einiges erkennen und auch sicher das eine oder andere Nachschlagen, aber alleine hätte ich sowas nie schreiben können.

    Nun habe ich als letztes nur noch das Problem, dass er - wenn der gefundene String ausserhalb des sichtbereiches ist - nicht automatisch runter- oder hochscrollt.

    Es ist ja nicht so das ich mir keine Gedanken mache oder nicht Suche. Jedoch in der Hilfe konnte ich eine solche Funktion nur für Listen finden (_GUICtrlListView_EnsureVisible) - damit kann ich scrollen lassen bis der Beitrag entweder ganz oder teilweise sichtbar ist. Für Edit konnte ich selbige Funktion jedoch leider nicht finden und bei meinem Kentnissstand bin ich noch sehr auf die AutoIT-Hilfe angewiesen.

    Mein AutoIT Smartphone GUI >>hier<<

    Der Mensch ist das einzige Tier, dass arbeiten muss.

  • Hi,

    Folgende Funktion scrollt zur Markierung ;)

    [autoit]

    _GUICtrlEdit_Scroll($hEdit, $SB_SCROLLCARET)

    [/autoit]