INI-File, Combo-Box, Liste zur Auswahl und Ergänzung

  • Hallo

    Sorry wegen der Überschrift, mir ist nix treffenderes eingefallen

    Bin wieder mal an meine Grenzen gestossen:
    In einer INI-Datei stehen Namen,Vornamen und Mail-Adressen - z.B. so:

    Code
    [NameA]
    vorname1=madresse1a
    [NameB]
    vorname1=madresse1b
    vorname2=madresse2b
    vorname3=madresse3b
    [NameC]
    vorname1=madresse1c
    vorname2=madresse2c

    In einer GUI gibts 3 Eingabefelder - Name, Vorname, Mail-Adresse

    Das Programm fragt jetzt den Namen ab -
    holt sich mit "IniReadSection" "Name" die dazugehörigen Daten -
    wenn nur ein Vorname vorhanden ist die Sache eindeutig
    und es werden mit GUICtrlSetData die andern beiden Felder ausgefüllt. (hab ich grade noch geschafft ;) )

    Gibt's aber zu einem Namen mehrere Vornamen, würde ich die Vorhandenen gerne zur Auswahl angeboten bekommen (Combo-Box?).
    Es müsste aber auch die Möglichkeit geben (falls Vorname noch nicht vorhanden) auch einen Weiteren einzugeben.

    An Letzterem bin ich allerdings gescheitert - ich kann zwar in die Combo-Box schreiben, aber die Eingabe nicht abschließen, weder mit ENTER noch durch klicken ins E-Mail-Feld.
    Und wie ich die Vornamen aus den Array in die Combo-Box kriege, hab ich (zum Glück) noch gar nicht probiert.

    Anscheinend kann man in einer Combo-Box keine Einträge machen? Gibts da was anderes?
    Lässt sich meine Vorstellung überhaupt umsetzen?
    Wie würdet Ihr das lösen?

    Bitte um Hilfe
    SG, entsel

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • .Na klar ;)

    Nein im Ernst - die ersten drei Fragen sind ja fast mit "ja" oder "nein" zu beantworten.
    Und auf "Wie würdet Ihr das lösen?" hätte ich mir Antworten erhofft, ähnlich wie ich oben meine Versuche beschrieben hab:

    Zitat

    ...holt sich mit "IniReadSection" "Name" die dazugehörigen Daten...
    ...werden mit GUICtrlSetData die andern beiden Felder ausgefüllt...

    Und was meinen Code betrifft - den erspar ich Euch lieber - sind seitenweise Versuche, um irgendwelche (Teil-)Lösungen zu probieren ...

    SG, entsel

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Hallo Entsel,

    schau dir mal meinen Muni-URL-Manager (Link in Signatur) an, da kannst du sehen wie Comboboxen befüllt werden und man auch neue Einträge hinzufügen kann,

    mfg autoBert

  • Hallo Bert

    Ich sag schon mal danke!
    Mal sehen, ob ich mit "_GUICtrlComboBox_InsertString" und "_GUICtrlComboBox_SetCurSel" meine Vorstellungen verwirklichen kann. Ich will ja ohne Hinzufügen-Button auskommen.
    (komm aber wahrscheinlich erst am WE dazu)

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

  • Leider ist mir meine Wunschlösung nicht gelungen.
    Ich hab jetzt mal den betreffenden Code isoliert (3 Varianten):

    Lösung 1 mit Input-Box - funktioniert genauso, wie ich's mir vorstelle, aber leider nicht in allen Fällen:

    Fall 1 - Name nur einmal in INI
    (z.B. "Messi" eingeben)
    Fall 2 - Name noch nicht in INI
    (z.B. "Müller" und "Gerd", danach noch das "ü" in der Mailadresse zu "ue" editieren)
    Fall 3 - Name einmal in INI, aber mit neuem Vornamen
    (z.B. "Messi" und Vornamen überschreiben

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.8.0
    Author: entsel

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Global $Inifile, $Name, $Vorname, $Mailadresse
    $Inifile = @ScriptDir & "\MAIL.INI"

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

    ; Erzeugung einer Test-INI - von AutoBert entlehnt:

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

    If Not FileExists($Inifile) Then
    $sData = "Sepp=sepp.maier@mail.com" & @LF
    $sData &= "Hermann=hermann.maier@mail.com" & @LF
    $sData &= "Isidor=isidor.maier@mail.com" & @LF
    IniWriteSection($Inifile, "Maier", $sData)
    $sData = "Lionel=lionel.messi@mail.com" & @LF
    IniWriteSection($Inifile, "Messi", $sData)
    $sData = "Thomas=thomas.huber@mail.com" & @LF
    $sData &= "Alexander=alexander.huber@mail.com" & @LF
    IniWriteSection($Inifile, "Huber", $sData)
    EndIf

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

    ; GUI:

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

    #Region ### START Koda GUI section ###
    $Form1 = GUICreate("MailAdresse", 485, 153, 192, 114)
    $InpName = GUICtrlCreateInput("Name", 25, 30, 201, 21)
    $LabName = GUICtrlCreateLabel("Name", 25, 15, 32, 15)
    $InpVorname = GUICtrlCreateInput("Vorname", 265, 30, 201, 21)
    $LabVorname = GUICtrlCreateLabel("Vorname", 265, 15, 46, 15)
    $InpMail = GUICtrlCreateInput("Mailadresse", 25, 80, 441, 21)
    $LabMail = GUICtrlCreateLabel("Mailadresse", 25, 65, 23, 15)
    $ButOK = GUICtrlCreateButton("OK", 350, 120, 116, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ; MAIN:

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $InpName ;----------------------------------------------Eingabe Name
    $Name = GUICtrlRead($InpName)
    Local $arrayNamen = IniReadSection($Inifile, $Name)
    If @error Then
    GUICtrlSetState($InpVorname, $GUI_FOCUS)
    Else
    If UBound($arrayNamen) = 2 Then
    $Vorname = $arrayNamen[1][0]
    $Mailadresse = $arrayNamen[1][1]
    GUICtrlSetData($InpVorname, $Vorname)
    GUICtrlSetData($InpMail, $Mailadresse)
    GUICtrlSetState($InpVorname, $GUI_FOCUS)
    Else
    GUICtrlSetState($InpVorname, $GUI_FOCUS)
    EndIf
    EndIf

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

    Case $InpVorname ;--------------------------------------------Eingabe Vorname
    $Vorname = GUICtrlRead($InpVorname)
    $Mailadresse = IniRead($Inifile, $Name, $Vorname, "")
    If $Mailadresse = "" Then $Mailadresse = $Vorname & "." & $Name & "@mail.com"
    GUICtrlSetData($InpMail, $Mailadresse)
    IniWrite($Inifile, $Name, $Vorname, $Mailadresse)
    GUICtrlSetState($ButOK, $GUI_FOCUS)

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

    Case $InpMail ;---------------------------------------------------Eingabe Mail
    $Mailadresse = GUICtrlRead($InpMail)
    IniWrite($Inifile, $Name, $Vorname, $Mailadresse)

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

    Case $ButOK ;-----------------------------------------------------------------OK
    MsgBox(0, "Die Mailadresse ist:", $Mailadresse)
    Exit

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

    EndSwitch
    WEnd

    [/autoit]

    Was fehlt ist Fall 4 - es gibt bereits mehrere (Zu-)Namen in der INI, die Vornamen sollen zur Auswahl angeboten werden und einer wird ausgewählt. (z.B. die Namen Maier oder Huber)
    und Fall 5 - es gibt bereits mehrere (Zu-)Namen in der INI, aber es soll ein weiterer Vorname hinzugefügt werden.

    Lösung 2 über _ArrayDisplay -> CopySelected (Notlösung):

    Würde funktionieren, aber:
    - man muss eine Auswahl treffen (auch für Fall 5),
    - wenn man das Fenster ohne Auswahl schließt, wird das Programm beendet (könnte man noch abfangen ...),
    - 2 Klicks mehr (kopieren und Fenster schließen),
    - und elegant ist die Lösung ja auch nicht.

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.8.0
    Author: entsel

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <array.au3>

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

    Global $Inifile, $Name, $Vorname, $Mailadresse
    $Inifile = @ScriptDir & "\MAIL.INI"

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

    ; Erzeugung der MAIL.INI - von AutoBert entlehnt:

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

    If Not FileExists($Inifile) Then
    $sData = "Sepp=sepp.maier@mail.com" & @LF
    $sData &= "Hermann=hermann.maier@mail.com" & @LF
    $sData &= "Isidor=isidor.maier@mail.com" & @LF
    IniWriteSection($Inifile, "Maier", $sData)
    $sData = "Lionel=lionel.messi@mail.com" & @LF
    IniWriteSection($Inifile, "Messi", $sData)
    $sData = "Thomas=thomas.huber@mail.com" & @LF
    $sData &= "Alexander=alexander.huber@mail.com" & @LF
    IniWriteSection($Inifile, "Huber", $sData)
    EndIf

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

    ; GUI:

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

    #Region ### START Koda GUI section ###
    $Form1 = GUICreate("MailAdresse", 485, 153, 192, 114)
    $InpName = GUICtrlCreateInput("Name", 25, 30, 201, 21)
    $LabName = GUICtrlCreateLabel("Name", 25, 15, 32, 15)
    $InpVorname = GUICtrlCreateInput("Vorname", 265, 30, 201, 21)
    $LabVorname = GUICtrlCreateLabel("Vorname", 265, 15, 46, 15)
    $InpMail = GUICtrlCreateInput("Mailadresse", 25, 80, 441, 21)
    $LabMail = GUICtrlCreateLabel("Mailadresse", 25, 65, 70, 15)
    $ButOK = GUICtrlCreateButton("OK", 350, 120, 116, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ; MAIN:

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $InpName ;-------------------------------------Eingabe Name
    $Name = GUICtrlRead($InpName)
    Local $arrayNamen = IniReadSection($Inifile, $Name)
    If @error Then
    GUICtrlSetState($InpVorname, $GUI_FOCUS)
    Else
    If UBound($arrayNamen) = 2 Then
    $Vorname = $arrayNamen[1][0]
    $Mailadresse = $arrayNamen[1][1]
    GUICtrlSetData($InpVorname, $Vorname)
    GUICtrlSetData($InpMail, $Mailadresse)
    GUICtrlSetState($InpVorname, $GUI_FOCUS)
    Else
    _ArrayDisplay($arrayNamen)
    $Clip = ClipGet()
    $arrayVornamen = StringSplit($Clip, "|")
    $Vorname = $arrayVornamen[2]
    GUICtrlSetData($InpVorname, $Vorname)
    GUICtrlSetState($InpVorname, $GUI_FOCUS)
    $Mailadresse = $arrayVornamen[3]
    GUICtrlSetData($InpMail, $Mailadresse)

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

    EndIf
    EndIf

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

    Case $InpVorname ;--------------------------------------------Eingabe Vorname
    $Vorname = GUICtrlRead($InpVorname)
    $Mailadresse = IniRead($Inifile, $Name, $Vorname, "")
    If $Mailadresse = "" Then $Mailadresse = $Vorname & "." & $Name & "@mail.com"
    GUICtrlSetData($InpMail, $Mailadresse)
    IniWrite($Inifile, $Name, $Vorname, $Mailadresse)
    GUICtrlSetState($ButOK, $GUI_FOCUS)

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

    Case $InpMail ;---------------------------------------------------Eingabe Mail
    $Mailadresse = GUICtrlRead($InpMail)
    IniWrite($Inifile, $Name, $Vorname, $Mailadresse)

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

    Case $ButOK ;-----------------------------------------------------------------OK
    MsgBox(0, "Die Mailadresse ist:", $Mailadresse)
    Exit

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

    EndSwitch
    WEnd

    [/autoit]

    Lösung 3 mit Combo-Box (würde ich favorisieren):
    Nur für Fall 1 und 4 geeignet.
    Wäre ideal - allerdings kann ich neue Vornamen zwar eintragen, krieg sie aber nicht übernommen - nicht mit ENTER (und auch nicht mit irgendwelchen Mausklicks). Wenn man dort schreiben kann, sollte es wohl auch eine Möglichkeit geben, die Eingabe zu übernehmen?! Meine Frage wäre, wie?
    Ein weiteres Problem hab ich mit dem Mauszeiger - ist er bei der Namenseingabe auf dem GUI, so bleibt er sichtbar,
    anderfalls versteckt er sich "unterhalb" des GUI. ?(

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.8.0
    Author: entsel

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <array.au3>
    #include <GuiComboBox.au3>

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

    Global $Inifile, $Name, $Vorname, $Mailadresse
    $Inifile = @ScriptDir & "\MAIL.INI"

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

    ; Erzeugung der MAIL.INI - von AutoBert entlehnt:

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

    If Not FileExists($Inifile) Then
    $sData = "Sepp=sepp.maier@mail.com" & @LF
    $sData &= "Hermann=hermann.maier@mail.com" & @LF
    $sData &= "Isidor=isidor.maier@mail.com" & @LF
    IniWriteSection($Inifile, "Maier", $sData)
    $sData = "Lionel=lionel.messi@mail.com" & @LF
    IniWriteSection($Inifile, "Messi", $sData)
    $sData = "Thomas=thomas.huber@mail.com" & @LF
    $sData &= "Alexander=alexander.huber@mail.com" & @LF
    IniWriteSection($Inifile, "Huber", $sData)
    EndIf

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

    ; GUI:

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

    #Region ### START Koda GUI section ###
    $Form1 = GUICreate("MailAdresse", 485, 153, 192, 114)
    $InpName = GUICtrlCreateInput("Name", 25, 30, 201, 21)
    $LabName = GUICtrlCreateLabel("Name", 25, 15, 32, 15)
    $InpVorname = GUICtrlCreateCombo("Vorname", 265, 30, 201, 21)
    $LabVorname = GUICtrlCreateLabel("Vorname", 265, 15, 46, 15)
    $InpMail = GUICtrlCreateInput("Mailadresse", 25, 80, 441, 21)
    $LabMail = GUICtrlCreateLabel("Mailadresse", 25, 65, 23, 15)
    $ButOK = GUICtrlCreateButton("OK", 350, 120, 116, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ; MAIN:

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $InpName ;-------------------------------------Eingabe Name
    $Name = GUICtrlRead($InpName)
    Local $arrayNamen = IniReadSection($Inifile, $Name)
    If @error Then
    GUICtrlSetState($InpVorname, $GUI_FOCUS)
    Else
    If UBound($arrayNamen) = 2 Then
    $Vorname = $arrayNamen[1][0]
    $Mailadresse = $arrayNamen[1][1]
    _GUICtrlComboBox_AddString($InpVorname, $Vorname)
    _GUICtrlComboBox_SetCurSel($InpVorname, 1)
    GUICtrlSetData($InpMail, $Mailadresse)
    GUICtrlSetState($InpVorname, $GUI_FOCUS)
    Else
    _GUICtrlComboBox_ResetContent($InpVorname)
    For $i = 1 To UBound($arrayNamen) - 1
    _GUICtrlComboBox_AddString($InpVorname, $arrayNamen[$i][0])
    Next
    _GUICtrlComboBox_ShowDropDown($InpVorname, True)
    GUICtrlSetState($InpVorname, $GUI_FOCUS)
    GUICtrlSetState($Form1, $GUI_FOCUS)
    EndIf
    EndIf

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

    Case $InpVorname ;--------------------------------------------Eingabe Vorname
    $Vorname = GUICtrlRead($InpVorname)
    $Mailadresse = IniRead($Inifile, $Name, $Vorname, "")
    If $Mailadresse = "" Then $Mailadresse = $Vorname & "." & $Name & "@mail.com"
    GUICtrlSetData($InpMail, $Mailadresse)
    IniWrite($Inifile, $Name, $Vorname, $Mailadresse)
    GUICtrlSetState($InpMail, $GUI_FOCUS)

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

    Case $InpMail ;---------------------------------------------------Eingabe Mail
    $Mailadresse = GUICtrlRead($InpMail)
    IniWrite($Inifile, $Name, $Vorname, $Mailadresse)

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

    Case $ButOK ;-----------------------------------------------------------------OK
    MsgBox(0, "Die Mailadresse ist:", $Mailadresse)
    Exit

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

    EndSwitch
    WEnd

    [/autoit]

    Eine Lösung 4 ist mir auch noch grad eingefallen - eine Kombination aus Input- und Combo-Box (vielleicht, falls es mit der 3er nix wird)

    Schöne Grüße,
    entsel
    AutoLisp(eln) geht ganz gut, aber AutoIt nur mit Dictionary. 
    Das Problem - man sollte wissen, welche Vokabel man sucht.

    Einmal editiert, zuletzt von entsel (14. April 2012 um 19:46)