Zufällige Daten aus ini wiedergeben.

  • Guten Abend.

    Hab da ma ne frage.

    Wie kann ich bspws. zufällige daten aus einer ini in einer gui wiedergeben?

    z.B

    2 ini dateien.

    Ini1 = Normal modus
    Ini2 = Hardcore Modus

    In der Gui wird man gefragt ob modus 1 oder 2 gewählt werden soll.

    Wällt man einen dieser modies so erscheint in der Gui z.B sie sind nun im .... Modus.
    Klicken sie auf generieren um einen zufälligen text auszugeben.

    Klickt man diesen Button so wird eine zeile aus der ini ausgegeben.

    nehmen wir mal an
    Ini1:

    test1
    test2
    test3 usw...

    Ich glaube ihr versteht mich.

    Könnte mir jemand ein Beispiel nennen oder so? Also ich wüsste jetzt nicht wie ich das machen soll.....

    Thx im voraus!

    Einmal editiert, zuletzt von slash (26. September 2010 um 20:02)

  • Hier ein Beispiel (geht bestimmt auch anders):

    Skript
    [autoit]

    #include <File.au3>

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

    $ini = @ScriptDir & "\liste.ini"

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

    $iLines = _FileCountLines($ini)
    $iNumber = Random(1, $iLines)

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

    MsgBox(0, "Zufällig ausgesuchte Zeile", FileReadLine($ini, $iNumber))

    [/autoit]
    Textdatei (.ini)
    Code
    Zeile1
    Zeile2
    Zeile3
    Zeile4

    Das ganze nochmal als Archiv im Anhang!

    MfG,
    BurakSZ

  • Ich hät's jetzt eher so gemacht ...

    &quot;ungetestet&quot;
    [autoit]

    $ini = ""
    $section = ""
    $aSection = IniReadSection($ini, $section)
    $random = Random(0, $aSection[0][0], 1)

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

    MsgBox(64, "", $aSection[$random][0] & "=" & $aSection[$random][1])

    [/autoit]

    In einer .ini gibt's ja eigentlich auch Sektionsnamen. Nach der _FileCoutLines - FileReadLine Methode würde irgendwann unweigerlich dieser Name anstelle eines Wertes in der Ausgabe erscheinen.

  • Ich hoffe ich habe dich richtig verstanden :

    [autoit]

    $1 = IniRead(@ScriptDir & '\MeineIni.ini', "Config", "1", "NichtGefunden")
    $2 = IniRead(@ScriptDir & '\MeineIni.ini', "Config", "2", "NichtGefunden")
    $3 = $1
    $5 = $2
    $Eingabe = InputBox("Zahl eingeben", "1 oder 2", "", "")

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

    If $Eingabe = 1 Then
    MsgBox(0, "Moduswahl", $3)
    EndIf

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

    If $Eingabe = 2 Then
    MsgBox(0, "Moduswahl", $5)
    EndIf

    [/autoit]

    Die Ini : MeineIni.ini

    Code
    [Config]
    1=Normaler Modus Gewählt
    2=Hardcore Modus Gewählt

    Gibt man nun 1 ein wird angezeigt : Normaler Modus Gewählt
    Gibt man nun 2 ein wird angezeigt : Hardcore Modus Gewählt


    Hat was gedauert bis ich das hatte ^^
    Bin ja net so der pro ^^

    MfG

    Goldy

    Meine Projekte :

    Taschenrechner [X]
    JamLegend Auto-Player [Canceld]
    Launcher [X]
    Multi-Game-Quest-Viewer [Canceld]


    [autoit]

    If $goffy or not $brain Then $DeleteInetCable

    [/autoit]
    • Offizieller Beitrag

    Ich würde keine INI verwenden, sondern eine Textdatei mit Tags verwenden.

    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    #include <Array.au3>

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

    $sFileRead = _
    "<normal>" & @CRLF & _
    "test_n_x" & @CRLF & _
    "test_n_y" & @CRLF & _
    "test_n_a" & @CRLF & _
    "test_n_b" & @CRLF & _
    "</normal>" & @CRLF & _
    @CRLF & _
    "<hard>" & @CRLF & _
    "test_h_x" & @CRLF & _
    "test_h_y" & @CRLF & _
    "test_h_a" & @CRLF & _
    "test_h_b" & @CRLF & _
    "</hard>" & @CRLF

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

    $aRet = _StringBetween($sFileRead, '<normal>' & @CRLF, @CRLF & '</normal>')
    $aNormal = StringSplit($aRet[0], @CRLF, 3)
    ;~ _ArrayDisplay($aNormal)

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

    $aRet = _StringBetween($sFileRead, '<hard>' & @CRLF, @CRLF & '</hard>')
    $aHard = StringSplit($aRet[0], @CRLF, 3)
    ;~ _ArrayDisplay($aHard)

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

    ; zufällige Ausgabe Normal
    ConsoleWrite($aNormal[Random(0,UBound($aNormal)-1,1)] & @CRLF)

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

    ; zufällige Ausgabe Hard
    ConsoleWrite($aHard[Random(0,UBound($aHard)-1,1)] & @CRLF)

    [/autoit]
  • Bin zwar nicht BugFix aber ich versuch's mal. Hoffe die Kommentare sind einigermassen verständlich.

    Spoiler anzeigen
    [autoit]


    #include <String.au3>
    #include <Array.au3>

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

    ;~ $sFileRead ist der String, in den du den Inhalt deiner Datei mit FIleRead() einliest.
    $sFileRead = _
    ;~ Die folgenden Zeilen stehen normalerweise in deiner .txt
    "<normal>" & @CRLF & _ ;hier beginnt die Sektion NORMAL
    "test_n_x" & @CRLF & _ ;dann folgen die einzelnen Werte
    "test_n_y" & @CRLF & _
    "test_n_a" & @CRLF & _
    "test_n_b" & @CRLF & _
    "</normal>" & @CRLF & _ ;hier endet die Sektion NORMAL
    @CRLF & _
    "<hard>" & @CRLF & _
    "test_h_x" & @CRLF & _
    "test_h_y" & @CRLF & _
    "test_h_a" & @CRLF & _
    "test_h_b" & @CRLF & _
    "</hard>" & @CRLF

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

    ;~ hier wird aus $sFileRead alles zwischen den Zeilen <normal> und </normal> extrahiert.
    $aRet = _StringBetween($sFileRead, '<normal>' & @CRLF, @CRLF & '</normal>')
    ;~ und dann an den Zeilenumbrüchen gesplittet
    $aNormal = StringSplit($aRet[0], @CRLF, 3)
    ;~ $aNormal enthält dann alle Zeilen aus der Sektion <normal>
    ;~ _ArrayDisplay($aNormal)

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

    ;~ hier wird aus $sFileRead alles zwischen den Zeilen <hard> und </hard> extrahiert.
    $aRet = _StringBetween($sFileRead, '<hard>' & @CRLF, @CRLF & '</hard>')
    ;~ und dann wieder an den Zeilenumbrüchen gesplittet
    $aHard = StringSplit($aRet[0], @CRLF, 3)
    ;~ $aNHard enthält dann alle Zeilen aus der Sektion <hard>
    ;~ _ArrayDisplay($aHard)

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

    ; zufällige Ausgabe Normal
    ConsoleWrite($aNormal[Random(0,UBound($aNormal)-1,1)] & @CRLF)

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

    ; zufällige Ausgabe Hard
    ConsoleWrite($aHard[Random(0,UBound($aHard)-1,1)] & @CRLF)

    [/autoit]
    • Offizieller Beitrag

    Du schreibst die Daten in eine normale Textdatei, könnte dann so aussehen:

    Spoiler anzeigen

    Mit

    [autoit]

    $sFileRead = FileRead('DATEI')

    [/autoit]

    kannst du den Inhalt in die Variable einlesen und wie oben gezeigt verarbeiten.

    Und so kannst du Werte in die Tag-Bereiche schreiben (ungetestet, aber sollte funktionieren.)

    Spoiler anzeigen
    [autoit]

    #include '<File.au3>'

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

    ; z.B. neuen Wert in Tag "normal" eintragen, direkt vor den End-Tag
    _WriteBetweenTag('DATEI', 'normal', 'Das ist der neue Wert.')

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

    Func _WriteBetweenTag($sFilePath, $sTag, $sText)
    Local $iLines = _FileCountLines($sFilePath)
    For $i = $iLines To 1 Step -1
    If FileReadLine($sFilePath, $i) = "</" & $sTag & ">" Then ExitLoop
    Next
    If $i = 1 Then Return SetError(1,0,0)
    Return _FileWriteToLine($sFilePath, $i, $sText & @CRLF)
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Mhm ok und könntest du das code beispiel mal mit einer txt machen?


    Hääh? :wacko: ?(
    Schreib ich in Hyroglyphen?
    In dem ersten Spoiler IST die Textdatei. Brauchst du nur kopieren, in einem Editor deiner Wahl einfügen und als Datei mit beliebigem Namen abspeichern. Und diesen Dateipfad verwendest du dann dort, wo ich "DATEI" eingesetzt habe.

  • Mhm wenn ich diesen Code nehme

    Spoiler anzeigen
    [autoit]


    #include <String.au3>
    #include <Array.au3>

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

    ;~ $sFileRead ist der String, in den du den Inhalt deiner Datei mit FIleRead() einliest.
    $sFileRead = FileRead('data')
    ;~ Die folgenden Zeilen stehen normalerweise in deiner .txt
    "<normal>" & @CRLF & _ ;hier beginnt die Sektion NORMAL
    "test_n_x" & @CRLF & _ ;dann folgen die einzelnen Werte
    "test_n_y" & @CRLF & _
    "test_n_a" & @CRLF & _
    "test_n_b" & @CRLF & _
    "</normal>" & @CRLF & _ ;hier endet die Sektion NORMAL
    @CRLF & _
    "<hard>" & @CRLF & _
    "test_h_x" & @CRLF & _
    "test_h_y" & @CRLF & _
    "test_h_a" & @CRLF & _
    "test_h_b" & @CRLF & _
    "</hard>" & @CRLF

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

    ;~ hier wird aus $sFileRead alles zwischen den Zeilen <normal> und </normal> extrahiert.
    $aRet = _StringBetween($sFileRead, '<normal>' & @CRLF, @CRLF & '</normal>')
    ;~ und dann an den Zeilenumbrüchen gesplittet
    $aNormal = StringSplit($aRet[0], @CRLF, 3)
    ;~ $aNormal enthält dann alle Zeilen aus der Sektion <normal>
    ;~ _ArrayDisplay($aNormal)

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

    ;~ hier wird aus $sFileRead alles zwischen den Zeilen <hard> und </hard> extrahiert.
    $aRet = _StringBetween($sFileRead, '<hard>' & @CRLF, @CRLF & '</hard>')
    ;~ und dann wieder an den Zeilenumbrüchen gesplittet
    $aHard = StringSplit($aRet[0], @CRLF, 3)
    ;~ $aNHard enthält dann alle Zeilen aus der Sektion <hard>
    ;~ _ArrayDisplay($aHard)

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

    ; zufällige Ausgabe Normal
    ConsoleWrite($aNormal[Random(0,UBound($aNormal)-1,1)] & @CRLF)

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

    ; zufällige Ausgabe Hard
    ConsoleWrite($aHard[Random(0,UBound($aHard)-1,1)] & @CRLF)

    [/autoit]

    Kommt dieser Error

    [autoit]

    C:\Users\Patrick\Desktop\AutoIT Project\ExoPlay\Test2.au3(7,11) : ERROR: syntax error
    "<normal>"
    ~~~~~~~~~~^
    C:\Users\Patrick\Desktop\AutoIT Project\ExoPlay\Test2.au3 - 1 error(s), 0 warning(s)

    [/autoit]
  • ... muss natürlich aus dem Skript raus. Das holst du dir doch aus der .txt

    • Offizieller Beitrag

    Ich hab dir doch extra die pure Textdatei gepostet.


    Du solltest schon die Antworten lesen.

  • OkayDanke.

    Ich hab da aber nochein problem.

    habe deine write funktion bischen abgeändert.

    [autoit]

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

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 538, 239, 355, 216)
    $Edit1 = GUICtrlCreateEdit("", 16, 8, 505, 193)
    $BtnNormal = GUICtrlCreateButton("Speichern Normal", 80, 208, 137, 25)
    $BtnHardcore = GUICtrlCreateButton("Speichern Hardcore", 320, 208, 137, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $nMsg = $BtnNormal
    If $BtnNormal Then
    _WriteBetweenTagNormal('data.txt', 'normal', $Edit1)
    EndIf
    Case $nMsg = $BtnHardcore
    If $BtnHardcore Then
    _WriteBetweenTagHardcore('data.txt', 'hardcore', $Edit1)
    EndIf
    EndSwitch
    WEnd

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

    Func _WriteBetweenTagNormal($sFilePath, $sTag, $sText)
    Local $iLines = _FileCountLines($sFilePath)
    For $i = $iLines To 1 Step -1
    If FileReadLine($sFilePath, $i) = "</" & $sTag & ">" Then ExitLoop
    Next
    If $i = 1 Then Return SetError(1,0,0)
    Return _FileWriteToLine($sFilePath, $i, $sText & @CRLF)
    EndFunc

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

    Func _WriteBetweenTagHardcore($sFilePath, $sTag, $sText)
    Local $iLines = _FileCountLines($sFilePath)
    For $i = $iLines To 1 Step -1
    If FileReadLine($sFilePath, $i) = "</" & $sTag & ">" Then ExitLoop
    Next
    If $i = 1 Then Return SetError(1,0,0)
    Return _FileWriteToLine($sFilePath, $i, $sText & @CRLF)
    EndFunc

    [/autoit]

    jedoch wenn ich das mache das schreibt er hammer lange zeilen nach unten nur ne 3 lol.
    Was is der fehler?

    • Offizieller Beitrag

    Kann es sein, dass du den Sinn einer Funktion nicht verstehst? Warum hast du da 2 draus gemacht.
    So erfolgt der Aufruf, einmal für 'normal' und einmal für 'hard'. Natürlich muss der übergebene Tag mit dem Tag in der Datei übereinstimmen.

    Aber ein Fehler war in der Func - man braucht keinen @CRLF anhängen, das macht die Func schon selbst.

    [autoit]

    _WriteBetweenTag(@ScriptDir & '\test.txt', 'normal', 'Das ist der neue Wert.')
    _WriteBetweenTag(@ScriptDir & '\test.txt', 'hard', 'Das ist der neue Wert.')

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

    Func _WriteBetweenTag($sFilePath, $sTag, $sText)
    Local $iLines = _FileCountLines($sFilePath)
    For $i = $iLines To 1 Step -1
    If FileReadLine($sFilePath, $i) = "</" & $sTag & ">" Then ExitLoop
    Next
    If $i = 1 Then Return SetError(1,0,0)
    Return _FileWriteToLine($sFilePath, $i, $sText)
    EndFunc

    [/autoit]