Was mach ich falsch?

  • Hallo,
    Ich versuche mich eben an einer Konsolenoberfläche. Der Faulheit halber möchte ich, dass mit der "Pfeiltaste nach oben" der letzte eingegebene Befehl erneut in der Inputzeile erscheint. Dies soll im Folgeschritt auf die letzten "X" Befehle durch Blättern mit den Pfeiltasten möglich sein. Doch bei der einfache Variante komm ich nun schon seit Stunden nicht weiter. Entweder übersehe ich etwas, hab einen großen Denkfehler oder muss mich nun endlich mit dem deklarieren von Variablen auseinandersetzen. Ich freue mich über jede Hilfe.

    Script stark gekürzt

    Spoiler anzeigen
    [autoit]

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>

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

    $Form1 = GUICreate ("",600,400,200,200)
    $Input1 = GUICtrlCreateInput ("",5,5,60,21)
    GUISetState (@SW_SHOW)

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

    $dll = DllOpen("user32.dll")
    $Befehle = ""

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

    While 1
    $nMsg = GUIGetMsg ()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    DllClose($dll)
    Exit
    EndSwitch

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

    If _IsPressed ("0D", $dll) Then
    $Befehle = GUICtrlRead ($Input1)
    GUICtrlSetData ($Input1, "")
    EndIf
    If _IsPressed ("26", $dll) Then
    GUICtrlSetData ($Input1, $Befehle)
    Sleep (200)
    EndIf
    WEnd

    [/autoit]

    MFG Salkin

    3 Mal editiert, zuletzt von Salkin (21. September 2013 um 16:52)

  • Das Problem liegt daran, dass du garnicht so schnell die Entertaste wieder loslassen kannst und dadurch die Variabel $Befehl durch dein setzen auf nichts mit GUICtrlSetData auch wieder geleert wird.

    Hier eine Möglichkeit wie du es machen kannst:

    Spoiler anzeigen
    [autoit]

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>

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

    $Form1 = GUICreate ("",600,400,200,200)
    $Input1 = GUICtrlCreateInput ("",5,5,60,21)
    GUISetState (@SW_SHOW)

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

    $dll = DllOpen("user32.dll")
    $Befehle = ""
    $press = 0

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

    While 1
    $nMsg = GUIGetMsg ()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    DllClose($dll)
    Exit
    EndSwitch

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

    If _IsPressed ("0D", $dll) And $press == 0 Then
    $press = 1
    $Befehle = GUICtrlRead ($Input1)
    GUICtrlSetData ($Input1, "")
    ElseIf Not _IsPressed ("0D", $dll) Then
    $press = 0
    EndIf
    If _IsPressed ("26", $dll) Then
    GUICtrlSetData ($Input1, $Befehle)
    Sleep (200)
    EndIf
    WEnd

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Das ging ja fix.
    Aus demselben Grund habe ich bei der "Pfeil nach oben" Taste Sleep (200) eingebaut. :pinch:

    Dankeschön

    Salkin

  • Bitte, bitte, bitte! Man kann es nicht oft genug predigen, nehmt gefälligst bessere Topicnamen!
    Keiner kann wissen um welches Thema es geht, wenn du "Was mach ich falsch?" nimmst!
    "_isPressed - Abfrage eventuell falsch?" Wäre da viel besser, weil du angibst um welches Thema es sich handelt,
    und was der Fehler sein könnte.

    // Außerdem, wenn ein Thema gelöst wurde dann setz den Präfix auch auf gelöst!

  • OK, ok, ok! ist ja alles richtig was Sie sagen. Ich werde mich in Zukunft bei beim Formulieren meiner wirren Gedanken direkt an Sie wenden.

    Ich hätte das Thema gerne noch 2-3 Tage offen gelassen um vielleicht noch ein paar Tipps zum Scripten allgemein oder elegantere Lösungen zu bekommen.

    Ich werde mir nun diese Lösung verwenden.

    [autoit]

    If _IsPressed ("0D", $dll) And GUICtrlRead ($Input1) <> "" Then

    [/autoit]


    Spoiler anzeigen


    Salkinhttp://translation.autoit.de/onlinehilfe/keywords.htm

    2 Mal editiert, zuletzt von Salkin (17. September 2013 um 23:01)

  • Moin!

    Vieleicht habe ich ja was falsch verstanden, aber wieso nimmst du keine ComboBox?
    Hier wird automatisch eine History erstellt, durch die man mit Curser auf/ab browsen kann.
    Dann gibt es noch Befehle wie _GUICtrlComboBox_AutoComplete, die das Ganze noch komfortabler machen.
    Bei Programmende kann man dann die Liste mit Hilfe von _GUICtrlComboBoxEx_GetListArray in eine INI-Datei schreiben, um diese beim nächsten Programmstart wieder in die ComboBox zu laden.

    Aber wie gesagt: vieleicht hab ich dein Anliegen missverstanden und du bist auf etwas ganz Anderes aus...


    Sanfte Grüße :D

  • Danke für die Antwort


    Nein du hast mich richtig verstanden. Ich werde gleich mal
    ComboBox'en testen. Ich benötige keine Anzeige die mir alle alten Befehle in
    einer Liste anzeigt, sondern nur das Pfeil hoch/runter switching welches in
    chronologischer Reihenfolge direkt in einem Eingabefeld alte Befehle anzeigt.

    Ob dieses eine Combobox ist, ist egal. Aber wenn es das einfacher macht wird es gekauft.

    Nach dem Programmende muss kein Log oder Sonstiges erstellt werden. unnötig


    Wer wissen will warum und was es werden soll.

    Spoiler anzeigen


    Ich möchte die Konsole als Anzeige und Befehlseingabe für ein andere func's
    benutzen.

    Die Befehle sollen größtenteils Telnet über TCP sprechen. Mein altes Terminal (Original
    von der Deutschen Bundespost "graue Post") läuft nur auf win 3.11 .
    Da ich keine Lust habe mich mit der IT über Lizenzen von Emulatoren usw. zu
    streiten (auch bei Lizenz freien Tools muss ich einen Nachweis vom Entwickler
    bringen ^^). schreib ich mir selbst eine Alternative. Es handelt sich bei der
    Gegenstelle der TCP/Telnet Kommunikation um eine über 20 Jahre alte TK-Anlage (noch
    einige weitere im Einsatz). Diese TK ist eine Koproduktion von Siemens und der Post. Mein Ziel ist es,
    dass Anmelden von Strecken, Anlegen von Benutzern und Telefonbucheinträge für
    Up0 Teilnehmer zu vereinfachen und auf meinen Laptops möglich zu machen.


    Die Konsole ist eine schöne Übung um mal endlich was Sinnvolles
    zu Skripten und man kann sie ja auch als Oberfläche für andere Anwendungen
    nutzen.

    Ach und NEIN mit Hyperterminal funzt es nicht.


    MFG
    Salkin

  • eine über 20 Jahre alte TK-Anlage (noch
    einige weitere im Einsatz).

    Ein bekannter von mir hat auch noch so eine :D Ich soll diese aber in naher Zukunft abschalten, weil es insgesamt glaub ich 8 Kästen an der Wand sind und zwei neue assreichen würden ^^

    Grüße Yaerox

    Grüne Hölle

  • Hi,

    hab mir auch grad testhalber sowas zusammengebaut:

    Spoiler anzeigen
    [autoit]


    #include <Misc.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Global $hist, $cnt
    Global $hDLL = DllOpen("user32.dll")

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

    $Form1 = GUICreate("testing", 394, 331, 192, 114)
    $Input1 = GUICtrlCreateInput("", 8, 16, 377, 21)
    $Edit1 = GUICtrlCreateEdit("", 8, 48, 377, 273)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg

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

    Case $Input1
    writehistory()

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

    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch

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

    If _IsPressed("26", $hDLL) Then
    If $cnt = 0 Then
    $histt = GUICtrlRead($Edit1)
    $hists = StringSplit($histt, "†")
    $cnt = $hists[0]
    EndIf

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

    GUICtrlSetData($Input1, $hists[$cnt])

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

    While _IsPressed("26", $hDLL)
    Sleep(100)
    WEnd
    $cnt -= 1
    EndIf
    WEnd

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

    Func writehistory()
    $hist &= GUICtrlRead($Input1) & "†"
    GUICtrlSetData($Edit1, $hist)
    EndFunc ;==>writehistory

    [/autoit]


    Sieht ganz gut aus, denk ich, funktioniert und tut seinen Zweck - die Editbox is nur zur Kontrolle :D

    Gruß,
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Danke x0r,
    doch ich bin nach vielen Überlegungen und Versuchen dazu übergegangen, mit GUICtrlRichEdit_Create zu arbeiten (um mit unterschiedlichen Farben, je nach Quelle der Konsolenanzeige zu arbeiten). Nach dem ich
    nun den Bug, das sich nicht mehrere RichEdit GUIs nutzen lassen bei meiner AUI3 Version, durch einen anderen Beitrag gelöst habe ([ gelöst ] [RichEdit] Mehrere RichEdit erstellen nicht möglich) ist heute ein anderes funktionsirrelevantes aber störendes Problem aufgetreten.

    Wenn ich in einer RichEdit mit meinen Pfeiltasten, die ich für _IsPressed Befehle nutze arbeite,ertönt beim Erreichen der obersten bzw. untersten Zeile und dem Versuch darüber hinaus zu springen in der RichEdit ein Fehlersound (BING).

    Hat jemandem eine Lösung dieses nervige Bingen abzustellen?

    Hier mal eine Standard RichEdit GUI zum selber hören.


    Spoiler anzeigen
    [autoit]

    #include <GuiRichEdit.au3>

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

    #include <GUIConstantsEx.au3>

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

    #include <WindowsConstants.au3>

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

    Main()

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

    Func Main()

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

    Local $hGui, $hRichEdit, $iMsg

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

    $hGui = GUICreate("Example (" & StringTrimRight(@ScriptName, 4) & ")", 320, 350, -1, -1)

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

    $hRichEdit = _GUICtrlRichEdit_Create($hGui, "This is a test.", 10, 10, 300, 220, _

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

    BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))

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

    _GUICtrlRichEdit_AppendText($hRichEdit, @CR & "This is more text")

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

    GUISetState()

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

    While True

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

    $iMsg = GUIGetMsg()

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

    Select

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

    Case $iMsg = $GUI_EVENT_CLOSE

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

    _GUICtrlRichEdit_Destroy($hRichEdit) ; needed unless script crashes

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

    ;~ GUIDelete() ; is OK too

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

    Exit

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

    EndSelect

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

    WEnd

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

    EndFunc ;==>Main

    [/autoit]

    PS: Soll ich ein neues Thema hierfür aufmachen?
    Ich hoffe man kann mal wieder meine Wirren Texte nachvollziehen.

    MFG Salkin

    Einmal editiert, zuletzt von Salkin (20. September 2013 um 20:57)

  • Hi,

    kein Ding!

    Wieso willste den Sound weg haben, bau dir doch einfach ne Schleife, die beim obersten bzw untersten erreichen einfach wieder in der Gegenrichtung von vorn beginnt (hatte ich zum Teil schon umgesetzt).

    Dann hast du kein nervendes Bingen und musst von ganz oben nicht wieder nach ganz unten springen :thumbup:

    Gruß,
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Ich glaube da muss ich was klarstellen. Die RichEdit ist ein
    Eingabefeld was immer fokussiert sein soll und nur eine Zeile hat. Die _IsPressed Schleife mit Pfeil nach Oben/Unten
    steuert einen Zähler der wiederum mit einer Array verknüpft ist. Der Wert der
    Array ersetzt wiederum in Der RichEdit (einzeiliges Eingabefeld) den alten Befehl.

    Da _IsPressed der Pfeiltasten
    immer auch durch den Fokus im RichEdit versucht nach oben zu springen, entsteht
    der Fehlersound. Da das Eingabefeld einzeilig ist hilft mir leider die von dir genannte
    Möglichkeit nicht weiter oder hab ich was falsch interpretiert. Aber trotzdem
    ein danke für deine Hilfe zu dieser späten Stunde.

    MF Salkin

  • ach das meinst du!

    du kannst "uparrow" doch einfach per "HotKeySet()" blockieren?

    oder du bastelst dir eine separate funktion dafür (vorsicht, noobhafte formatierung :D):

    [autoit]

    hotkeyset("{up}", "stop")

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

    func stop()
    send("")
    endfunc

    [/autoit]

    gruß,
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • THX die Lösung ist wunderbar. Ich hab schon gedacht im muss die #include <GuiRichEdit.au3> nach dem Error Sound durchsuchen

    So nun Thema endgültig fertig. Nochmal danke an alle.

    MFG Salkin