_MultiInput (InputBox mit einer variablen Anzahl an Eingabe-Feldern) V3.0

  • Hier eine kleine, einfache Funktion die eine "InputBox" mit einer Variablen Anzahl an Eingabe-Feldern erzeugt.
    -------
    Jedem Eingabe-Feld ist ein Text zugeordnet, dessen Stil festgelegt werden kann (siehe Funktionsbeschreibung).
    Die Stile der Eingabe-Felder können ebenfalls beliebig verändert werden.

    Die Ergebnis wird entweder als String geliefert, wobei die Eingaben darin mit dem Standard-Trennzeichen getrennt werden, oder als Array.

    Spoiler anzeigen
    [autoit]

    Global $aTexts[5] = ["**Verzeichnis**", "Benutzer", "Passwort", "", "__Information__"]
    Global $aInputSt[5] = [-1, -1, 32] ; $ES_PASSWORD = 32

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

    Global $sValues = _MultiInput($aTexts, "Test", $aInputSt)
    If Not @error Then MsgBox(0, "", $sValues)

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

    ; #FUNCTION# ===================================================================
    ; Name ..........: _MultiInput
    ; Description ...: InputBox with multiple inputs
    ; AutoIt Version : V3.3.0.0
    ; Syntax ........: _MultiInput(ByRef $aText[, $sTitle = ""[, $vInputStyle = -1[, $iInputWidth = 200[, $sButtonR = "OK"[, $sButtonL = "Cancel"[, $iReturnMode = 0]]]]]])
    ; Parameter(s): .: $aText - Array with the text for the input-controls.
    ; * Text-style:
    ; | **Text** = bold
    ; | ""Text"" = italic
    ; | __Text__ = underline
    ; | --Text-- = strike
    ; $sTitle - Optional: (Default = "") : Window-title
    ; $vInputStyle - Optional: (Default = -1) : Style for the input-controls.
    ; | single var for a global style, or
    ; | array for different styles
    ; * lool at the "GUI Control Styles"
    ; $iInputWidth - Optional: (Default = 200) : Width of the inputs
    ; $sButtonR - Optional: (Default = "OK") : Text of the right button
    ; $sButtonL - Optional: (Default = "Cancel") : Text of the left button
    ; $iReturnMode - Optional: (Default = 0) :
    ; | 0 Returns a single string, values seperated with the GUIDataSeparatorChar
    ; | 1 Returns an array with all values
    ; Return Value ..: Success - string or array, depending on $iReturnMode
    ; Failure - empty string
    ; @ERROR - 1 if cancel is pressed
    ; | 2 UBound($aT) <> UBound($aInputFormat)
    ; | 3 $aText not an array
    ; Author(s) .....: Thorsten Willert
    ; Date ..........: Sun Nov 08 12:25:22 CET 2009
    ; Version .......: 3.0
    ; Example .......:
    ;
    ;Global $aTexts[5] = ["**Verzeichnis**", "Benutzer", "Passwort", "", "__Information__"]
    ;Global $aInputSt[5] = [-1, -1, 32] ; $ES_PASSWORD = 32

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

    ; Global $sValues = _MultiInput($aTexts, "Test", $aInputSt)
    ; If Not @error Then MsgBox(0, "", $sValues)
    ; ==============================================================================
    Func _MultiInput(ByRef $aText, $sTitle = "", $vInputStyle = -1, $iInputWidth = 200, $sButtonR = "OK", $sButtonL = "Cancel", $iReturnMode = 0)
    Local $oldOpt = Opt('GUIOnEventMode', 0)

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

    ; Default parameters
    If $iInputWidth < 100 Then $iInputWidth = 100
    If $iInputWidth = Default Then $iInputWidth = 200
    If $vInputStyle = Default Then $vInputStyle = -1
    If $sButtonR = Default Then $sButtonR = "OK"
    If $sButtonL = Default Then $sButtonL = "Cancel"

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

    ; Parameter check (arrays only)
    If Not IsArray($aText) Then
    SetError(3)
    Return ""
    EndIf
    If IsArray($vInputStyle) And UBound($vInputStyle) <> UBound($aText) Then
    SetError(2)
    Return ""
    EndIf

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

    Local $iS = 6 ; char width
    Local $iT = UBound($aText)
    Local $input[$iT], $aTextStyle[$iT], $aTextWidth[$iT]
    Local $iOfs = 0, $iLen = 0
    Local $sSC = Opt("GUIDataSeparatorChar")
    Local $sRet = ""
    Local $InputStyle
    If Not IsArray($vInputStyle) Then $InputStyle = $vInputStyle

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

    ; text width and styles
    For $i = 0 To $iT - 1
    $iLen = StringLen($aText[$i])
    If $iLen > $iOfs Then $iOfs = $iLen ; max text width
    If $iOfs < 10 Then $iOfs = 10
    $aTextWidth[$i] = 400
    $aTextStyle[$i] = 0
    Select
    ; bold
    Case StringRegExp($aText[$i], '^\*\*.*?\*\*$')
    $aTextWidth[$i] = 600
    $aText[$i] = StringMid($aText[$i], 3, $iLen - 4)
    ; italic
    Case StringRegExp($aText[$i], '^"".*?""$')
    $aTextStyle[$i] = 2
    $aText[$i] = StringMid($aText[$i], 3, $iLen - 4)
    ; underline
    Case StringRegExp($aText[$i], '^__.*?__$')
    $aTextStyle[$i] = 4
    $aText[$i] = StringMid($aText[$i], 3, $iLen - 4)
    ; strike
    Case StringRegExp($aText[$i], '^--.*?--$')
    $aTextStyle[$i] = 8
    $aText[$i] = StringMid($aText[$i], 3, $iLen - 4)
    EndSelect
    Next

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

    ; GUI
    Local $hWin = GUICreate($sTitle, $iOfs * $iS + $iInputWidth + 40, $iT * 25 + 55)
    For $i = 0 To $iT - 1
    If IsArray($vInputStyle) Then $InputStyle = $vInputStyle[$i]
    Select
    Case $aText[$i] <> ""
    GUICtrlCreateLabel($aText[$i] & ":", 16, $i * 25 + 15, $iOfs * $iS)
    GUICtrlSetFont(-1, 8.5, $aTextWidth[$i], $aTextStyle[$i])
    $input[$i] = GUICtrlCreateInput("", $iOfs * $iS + 20, $i * 25 + 10, $iInputWidth, -1, $InputStyle)
    Case Else
    GUICtrlCreateLabel("", 16, 1)
    EndSelect
    Next
    Local $ok = GUICtrlCreateButton($sButtonR, 16, $i * 25 + 20, 75)
    GUICtrlSetState(-1, 512) ; $GUI_DEFBUTTON = 512
    Local $cancel = GUICtrlCreateButton($sButtonL, $iOfs * $iS + $iInputWidth - 55, $i * 25 + 20, 75)
    GUISetState(@SW_SHOW)
    ; /GUI

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

    While True
    Switch GUIGetMsg()
    Case -3, $cancel ; $GUI_EVENT_CLOSE = -3
    GUIDelete($hWin)
    Opt('GUIOnEventMode', $oldOpt)
    SetError(1)
    Return ""
    Case $ok
    For $i = 0 To $iT - 2
    $sRet &= GUICtrlRead($input[$i]) & $sSC
    Next
    $sRet &= GUICtrlRead($input[$i])
    GUIDelete($hWin)
    Opt('GUIOnEventMode', $oldOpt)
    If $iReturnMode = 0 Then
    Return $sRet
    Else
    Return StringSplit($sRet, $sSC, 2)
    EndIf
    EndSwitch
    WEnd
    EndFunc ;==>_MultiInput

    [/autoit]

    Stilgar

    9 Mal editiert, zuletzt von Stilgar (8. November 2009 um 12:29)

  • Danke für den Hinweis!
    Ist eingefügt.
    Ich denke an solche Sachen nie, da ich in AutoIt eh alle GUIs zu meiden versuche :D
    Man weis ja nie ob die nach dem nächsten AutoIt-Update noch funktionieren ...

  • finde auch das du es super hinbekommen hast

    würde es wie bei inputbox noch mit dem feld für eingabeumwandlung einbauen kann also dass man es in * anzeigen lassen kann

    gruss Simon

  • Ich würde Zeile 54 so abändern:

    [autoit]

    Local $ok = GUICtrlCreateButton($sButton1, 16, $i * 25 + 20, 75)
    GUICtrlSetState(-1, $GUI_DEFBUTTON)

    [/autoit]


    Dann ist nämlich der OK-Button der Standardbutton, und man kann mit Enter bestätigen.

    Magnus

  • Version 2.0:

    Alle Vorschläge mal übernommen.

    Den Parameter "$vInputStyle" eingebaut:
    - eine einfache Variable setzt den Stil für alle Inputs
    - per Array läßt sich für jeden Input ein anderer Stil zuweisen (GUI Control Styles)
    Beispiel siehe oben.

  • bei mir funkts nicht??!

    Da kommt ein Fenster mit

    Verzeichnis:
    Name:
    Passwort:
    Information:

    egal ob man was eingibt oder nicht kommt dann das was man eingeeben aht mit | dazwischen??!?
    wie geht das programm?

  • Hallo,

    das funktioniert genau so wie Du es beschrieben hast.

    Das Ganze ist eine Funktion um schnell ein Fenster mit mehreren Eingabefeldern zu erzeugen und diese Eingaben werden zurückgegeben.

    Sämtliche Eingaben werden duch den | getrennt in einem String zurückgegeben.
    Bzw. mit dem Zeichen das Du mit Opt("GUIDataSeparatorChar") festgelegt hast.

    Dieses Ergebnis kannst Du z.B. mit StringSplit zerlegen.

    Wenn Du nichts eingegeben hast, bekommst Du logischerweise z.B. |||| zurück.

    Falls Du eine "Leerzeile" ohne Label erzeugt hast, kommt an dieser Stelle eine 0 zurück.

    Was hast Du erwartet?

  • ich hab gar keine ahnung^^

    was muss ich machen damit das funktioniert?
    und muss man für jedes programm wieder so dateien ändern?

  • Zitat

    ich hab gar keine ahnung

    Und wieso behauptest du dann, dass das Programm nicht funktioniert?

    Zitat

    was muss ich machen damit das funktioniert?

    Nichts, denn es funktioniert einwandfrei! Lies noch einmal Stilgars ausführliche Beschreibung...

    Zitat

    und muss man für jedes programm wieder so dateien ändern?

    Mir ist nicht so ganz klar was du meinst, aber eins ist ziemlich sicher, für JEDES neu zu erstellende Programm muss man irgendwann mal eine Datei ändern. Irgendwo muss der Programmcode ja stehen, und das ist heutzutage meistens eine Datei. Diese Datei beinhaltet gewissermassen die Sammlung aller Anweisungen, was der Computer nun machen soll....

  • Nee er meinte doch, dass irgendwas in der GUIDataSeparatorChar stehen müsste damit das klappt oder?

    • Offizieller Beitrag

    Stilgars Funktion benutzt im Rückgabestring den Standard Seperator.
    Diesen kannst du mit Opt("GUIDataSeparatorChar") festlegen.

    [autoit]

    Opt("GUIDataSeparatorChar","|") ;"|" is the default

    [/autoit]


    Diesen Wert mußt du aber nicht neu setzen, ausser du willst einen anderen Seperator wie z.B. "," haben.
    Die Funktion selbst hat Stilgar doch gut erklärt.
    Wenn du Fragen hast ist es absolut Kontraproduktiv, Aussagen wie

    Zitat

    ich hab gar keine ahnung^^

    was muss ich machen damit das funktioniert?
    und muss man für jedes programm wieder so dateien ändern?


    zu treffen. Damit kann niemand, irgendwas anfangen.
    Also beschreib mal genau was nicht klappt, wo und überhaupt.

  • Huch was denn hier los? ... :D

    Update V3.0
    - Ergebnisse können auch optional als Array zurückgegeben werden
    - Parameterüberprüfung etwas erweitert
    - es werden keine Include-Dateien mehr benötigt
    - kleinere Optimierungen

  • Kann Frau sicherlich mal gebrauchen ;)

    Ist gut geworden und gefällt mir.

    LG, Lina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo Stilgar und alle anderen! :)

    Zunächst möchte ich mich für diese Funktion bedanken.
    Für meine Zwecke benötigte ich eine etwas erweiterte Funktionalität, deshalb habe ich die Funktion etwas erweitert.
    Meine Änderungen möchte ich euch gerne zurückgeben.

    Zunächst habe ich einen klitzekleinen Fehler beseitigt. $sButtonL und $sButtonR waren vertauscht. Dies habe ich korrigiert.

    Erweiterungen:

    • Es ist nun möglich den Eingabefeldern der Maske Standardwerte zu übergeben.
    • Man kann die Hwnd einer Parent Maske angeben.


    Vielleicht kann das ja jemand so gebrauchen.
    Viele Grüße
    M3d1c5

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ===================================================================
    ; Name ..........: _MultiInput
    ; Description ...: InputBox with multiple inputs
    ; AutoIt Version : V3.3.0.0
    ; Syntax ........: _MultiInput(ByRef $aText[, $aDefaultText=""[, $sTitle = ""[, $vInputStyle = -1[, $iInputWidth = 200[, $sButtonL = "OK"[, $sButtonR = "Cancel"[, $iReturnMode = 0[, $parent]]]]]]])
    ; Parameter(s): .: $aText - Array with the text for the input-controls.
    ; * Text-style:
    ; | **Text** = bold
    ; | ""Text"" = italic
    ; | __Text__ = underline
    ; | --Text-- = strike
    ; $aDefaultText - Optional: (Default = "") : Array with the default text for the input-controls. The controls will be prefilled.
    ; $sTitle - Optional: (Default = "") : Window-title
    ; $vInputStyle - Optional: (Default = -1) : Style for the input-controls.
    ; | single var for a global style, or
    ; | array for different styles
    ; * lool at the "GUI Control Styles"
    ; $iInputWidth - Optional: (Default = 200) : Width of the inputs
    ; $sButtonL - Optional: (Default = "OK") : Text of the left button
    ; $sButtonR - Optional: (Default = "Cancel") : Text of the right button
    ; $iReturnMode - Optional: (Default = 0) :
    ; | 0 Returns a single string, values seperated with the GUIDataSeparatorChar
    ; | 1 Returns an array with all values
    ; $parent - Optional: (Default = -1) : The window handle to use as the parent for this dialog.
    ; Return Value ..: Success - string or array, depending on $iReturnMode
    ; Failure - empty string
    ; @ERROR - 1 if cancel is pressed
    ; | 2 UBound($aT) <> UBound($aInputFormat)
    ; | 3 $aText not an array
    ; | 4 $aDefaultText not an array
    ; | 5 UBound($aText) <> UBound($aDefaultText)
    ; Author(s) .....: Thorsten Willert and M3d1c5
    ; Date ..........: Sun Jul 08 20:24:00 CET 2012
    ; Version .......: 3.1
    ; Example .......:
    ;
    ;Global $aTexts[5] = ["**Verzeichnis**", "Benutzer", "Passwort", "", "__Information__"]
    ;Global $aInputSt[5] = [-1, -1, 32] ; $ES_PASSWORD = 32

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

    ; Global $sValues = _MultiInput($aTexts, "", "Test", $aInputSt)
    ; If Not @error Then MsgBox(0, "", $sValues)
    ; ==============================================================================
    Func _MultiInput(ByRef $aText, $aDefaultText = "", $sTitle = "", $vInputStyle = -1, $iInputWidth = 200, $sButtonL = "OK", $sButtonR = "Cancel", $iReturnMode = 0, $parent = -1)
    Local $oldOpt = Opt('GUIOnEventMode')

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

    ; Default parameters
    If $iInputWidth < 100 Then $iInputWidth = 100
    If $iInputWidth = Default Then $iInputWidth = 200
    If $vInputStyle = Default Then $vInputStyle = -1
    If $sButtonL = Default Then $sButtonL = "OK"
    If $sButtonR = Default Then $sButtonR = "Cancel"

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

    ; Parameter check (arrays only)
    If Not IsArray($aText) Then
    SetError(3)
    Return ""
    EndIf
    If Not IsArray($aDefaultText) And $aDefaultText <> "" Then
    SetError(4)
    Return ""
    EndIf
    If IsArray($vInputStyle) And UBound($vInputStyle) <> UBound($aText) Then
    SetError(2)
    Return ""
    EndIf
    If IsArray($aDefaultText) And UBound($aText) <> UBound($aDefaultText) Then
    SetError(5)
    Return ""
    EndIf

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

    Local $iS = 6 ; char width
    Local $iT = UBound($aText)
    Local $input[$iT], $aTextStyle[$iT], $aTextWidth[$iT]
    Local $iOfs = 0, $iLen = 0
    Local $sSC = Opt("GUIDataSeparatorChar")
    Local $sRet = ""
    Local $InputStyle
    If Not IsArray($vInputStyle) Then $InputStyle = $vInputStyle

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

    ; text width and styles
    For $i = 0 To $iT - 1
    $iLen = StringLen($aText[$i])
    If $iLen > $iOfs Then $iOfs = $iLen ; max text width
    If $iOfs < 10 Then $iOfs = 10
    $aTextWidth[$i] = 400
    $aTextStyle[$i] = 0
    Select
    ; bold
    Case StringRegExp($aText[$i], '^\*\*.*?\*\*$')
    $aTextWidth[$i] = 600
    $aText[$i] = StringMid($aText[$i], 3, $iLen - 4)
    ; italic
    Case StringRegExp($aText[$i], '^"".*?""$')
    $aTextStyle[$i] = 2
    $aText[$i] = StringMid($aText[$i], 3, $iLen - 4)
    ; underline
    Case StringRegExp($aText[$i], '^__.*?__$')
    $aTextStyle[$i] = 4
    $aText[$i] = StringMid($aText[$i], 3, $iLen - 4)
    ; strike
    Case StringRegExp($aText[$i], '^--.*?--$')
    $aTextStyle[$i] = 8
    $aText[$i] = StringMid($aText[$i], 3, $iLen - 4)
    EndSelect
    Next

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

    ; GUI
    If $parent <> -1 Then GUISetState(@SW_DISABLE, $parent)
    Local $hWin = GUICreate($sTitle, $iOfs * $iS + $iInputWidth + 40, $iT * 25 + 55, -1, -1, -1, -1, $parent)
    For $i = 0 To $iT - 1
    If IsArray($vInputStyle) Then $InputStyle = $vInputStyle[$i]
    Select
    Case $aText[$i] <> ""
    GUICtrlCreateLabel($aText[$i] & ":", 16, $i * 25 + 15, $iOfs * $iS)
    GUICtrlSetFont(-1, 8.5, $aTextWidth[$i], $aTextStyle[$i])
    $input[$i] = GUICtrlCreateInput("", $iOfs * $iS + 20, $i * 25 + 10, $iInputWidth, -1, $InputStyle)
    If IsArray($aDefaultText) Then
    GUICtrlSetData($input[$i], $aDefaultText[$i])
    EndIf
    Case Else
    GUICtrlCreateLabel("", 16, 1)
    EndSelect
    Next
    Local $ok = GUICtrlCreateButton($sButtonL, 16, $i * 25 + 20, 75)
    GUICtrlSetState(-1, 512) ; $GUI_DEFBUTTON = 512
    Local $cancel = GUICtrlCreateButton($sButtonR, $iOfs * $iS + $iInputWidth - 55, $i * 25 + 20, 75)
    GUISetState(@SW_SHOW)
    ; /GUI

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

    While True
    Switch GUIGetMsg()
    Case -3, $cancel ; $GUI_EVENT_CLOSE = -3
    If $parent <> -1 Then GUISetState(@SW_ENABLE, $parent)
    GUIDelete($hWin)
    Opt('GUIOnEventMode', $oldOpt)
    SetError(1)
    Return ""
    Case $ok
    For $i = 0 To $iT - 2
    $sRet &= GUICtrlRead($input[$i]) & $sSC
    Next
    $sRet &= GUICtrlRead($input[$i])
    If $parent <> -1 Then GUISetState(@SW_ENABLE, $parent)
    GUIDelete($hWin)
    Opt('GUIOnEventMode', $oldOpt)
    If $iReturnMode = 0 Then
    Return $sRet
    Else
    Return StringSplit($sRet, $sSC, 2)
    EndIf
    EndSwitch
    WEnd
    EndFunc ;==>_MultiInput

    [/autoit]