Textblöcke aus TXT-Datei Auslesen und an Cursorposition ausgeben

  • Hallo zusammen

    Hoffe mir kann jemand bei meinem kleinen Problem helfen.

    Ich habe in einer einfachten txt-Datei mehrere Textblöcke, die ich per Hotkey an der Cursorposition ausgeben will.
    Theoretisches Beispiel solcher Textblöcke:

    Zitat

    Hier steht ganz doll viel Text
    Und hier noch deutlich mehr
    Noch nen bissel mehr Text

    Und hier steht die letzte Zeile

    Habe mich dafür bereits mit Iniread versucht und eine entsprechende INI aus meiner Textdatei gemacht.
    Mein Quelltext zum einlesen und ausgeben sieht dann wie folgt aus:

    [autoit]

    HotKeySet("{F8}", "_txt1")
    Func _txt1()
    $var = IniReadSection(@ScriptDir & "\meine.ini", "2")
    If @error Then
    MsgBox(4096, "", "Es ist ein Fehler aufgetreten. Warscheinlich keine INI Datei vorhanden.")
    Else
    For $i = 1 To $var[0][0]
    Send($var[$i][1] & @CR)
    Next
    EndIf
    Send($var)
    EndFunc

    [/autoit]

    Hierbei sind für mich aber zwei Probleme entstanden:
    1. Mittels IniRead kann ich scheinbar keine Leerzeilen einlesen und später ausgeben.
    2. Wenn ich den Textblock ausgeben will, befindet sich der Cursor in der Regel in einem Textfeld innerhalb einer auf Java basierenden Anwendung. Diese scheint das Zeichenweise ausgeben per Send nicht zu vertragen.

    Gibt es irgendeine Möglichkeit, die Textblöcke beim Start des Script aus einer Textdatei zu lesen und beim Drücken des Hotkey an die Cursorposition zu "liefern" ?

    Das ganze ohne den Befehl Send
    Am liebsten ähnlich wie beim Einfügen mittels STRG+V - ohne jedoch die Windows-Zwischenablage selbst zu überschreiben.

  • Was ist denn mit "an die Cursorposition liefen" gemeint?

    Soll in ein Input geschrieben werden (Send), das Du mittels Maus fokussiert hast, oder eine Textausgabe an Mausposition (bsplw. Tooltip)?

    • Offizieller Beitrag

    Willst Du denn den Text komplett ausgeben?
    Ich vermute mal (Kristallkugel befragt :D ) nur zeilenweise:

    Spoiler anzeigen
    [autoit]


    $sFilename = @ScriptDir & '\dateiname.txt'
    $sFile = FileRead($sFilename) ; Datei einlesen
    $array = StringSplit($sFile, @CRLF, 3) ; am Zeilenende splitten = Array erstellen
    $index = 0
    HotKeySet('{F8}', '_SendText')
    HotKeySet('{ESC}', '_End')

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

    While Sleep(100)
    WEnd

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

    Func _SendText()
    Send($array[$index])
    $index += 1
    If $index = UBound($array) Then $index = 0
    EndFunc

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

    Func _End()
    Exit
    EndFunc

    [/autoit]
  • Was ist denn mit "an die Cursorposition liefen" gemeint?

    Soll in ein Input geschrieben werden (Send), das Du mittels Maus fokussiert hast, oder eine Textausgabe an Mausposition (bsplw. Tooltip)?

    Der Text soll an der Cursorposition, nicht der Mausposition, ausgegeben werden. Wie es grundsätzlich auch Send macht.
    Die Ausgabe soll passieren, ohne dass das Script selbst ein Fenster etc. fokussiert.
    Ich klicke also selbst in das entsprechende Feld. Hoffe das ist zu verstehen :S


  • Wenn du mit dem "Text komplett ausgeben" die ganze Datei meinst, dann nein.
    Soweit ich bei deinem Beispiel hinter steige, würde der nur einzelne Zeilen ausspucken.
    Ich habe in der Textdatei aber mehrere Textblöcke mit unterschiedlicher Zeilenmenge.
    Sinngemäß:

    Textblock 1

    Zeile 1
    Zeile2
    Zeile3
    Leerzeile
    Zeile 5

    Textblock 2
    Zeile 1
    Zeile2
    Leerzeile
    Zeile 4
    Zeile 5

    Wie mach ich ihm dann klar, wo ein Textblock endet ?

    Einmal editiert, zuletzt von SmilingStar (1. März 2011 um 18:17)


  • Wie können wir das wissen, wenn wir die Textdatei nicht haben? ;)

    Du musst halt in die Textdatei irgendeinen "Trenner" einbauen oder, falls der bereits vorhanden ist, diesen zum splitten benutzen.


    Mit Hilfe der Kristallkugel ? :D
    Die Textdatei gibts noch nicht fertig. Will da von mir oft genutzte Textblöcke drin speichern, deren Abstand oder Begrenzung kann ich deswegen frei wählen.
    Wenn ich die einzelnen Blöcke wie folgt mit [1][/1],[2][/2] etc. "Trennen" würde, wie mach ich dann das mit dem Splitten ?

    [1]
    Textblock 1
    Zeile 1
    Zeile2
    Zeile3
    Leerzeile
    Zeile 5
    [/1]

    [2]
    Textblock 2

    Zeile 1
    Zeile2
    Leerzeile
    Zeile 4
    Zeile 5
    [/2]

    • Offizieller Beitrag

    Dann so:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    $sFilename = @ScriptDir & '\test.txt'
    $sFile = FileRead($sFilename) ; Datei einlesen
    $array = StringRegExp($sFile, '(?s)\[\d+\](.+?)\[\/\d+\]', 3) ; Array erstellen
    ;~ _ArrayDisplay($array)
    $index = 0
    HotKeySet('{F8}', '_SendText')
    HotKeySet('{ESC}', '_End')

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

    While Sleep(100)
    WEnd

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

    Func _SendText()
    Send($array[$index])
    $index += 1
    If $index = UBound($array) Then $index = 0
    EndFunc

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

    Func _End()
    Exit
    EndFunc

    [/autoit]

  • Das sieht doch schon sehr schön aus. Dank dir schon mal.

    Um noch nen bissel Größenwahn rein zu bringen:
    Hab die Ausgabe je nach Hotkey auf die einzelnen "Zellen" des Array beschränkt.

    [autoit]

    Send($array[0])

    [/autoit]


    Besteht die Chance, den Inhalt der entsprechenden "Zelle" des Array komplett auszugeben und nicht wie bei Send üblich, als würde ich gerade jeden Buchstaben einzeln tippen ?
    Also ganz so als wenn ich einen Text in der Zwischenablage speichere und dann per STRG+V einfüge.

    Ich befürchte dafür müsst man sich seine eigene Zwischenablage basteln ?! :huh: