Probleme mit GUISetAccelerators()

  • Hallo zusammen,

    ich habe in meinem Programm die Entertaste zum Bestätigen einer Funktion im Einsatz, allerdings soll er dies natürlich nicht in Editboxen ausführen, weil man so nicht darin schreiben kann.

    Wie stelle ich es an, dass das Programm beim schreiben in Editboxen die Entertaste vorübergehend "deaktiviert" und erst nachdem man wieder aus der Editbox raus ist wieder aktiviert?

    Hier der Code:

    [autoit]

    Global $aAccelKeys[1][2] = [["{ENTER}", $frmRefreshButton]]
    GUISetAccelerators($aAccelKeys)

    [/autoit]

    Vielen Dank vorab und LG,
    der Robert

  • Aus der AutoIt Hilfe zu GuiCtrlCreateEdit: Defines the style of the control. See [url='../appendix/GUIStyles.htm#Edit']GUI Control Styles Appendix[/url]. default ( -1) : $ES_WANTRETURN, $WS_VSCROLL, $WS_HSCROLL, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL forced styles : $ES_MULTILINE, $WS_TABSTOP only if not $ES_READONLY.
    Der Standardstyle beinhaltet alle diese Komponenten. Wenn man einen Teil davon nicht braucht kann man manuell eigene Styles beim erstellen des GuiCtrlEdit angeben. In deinem Fall müsstest du jeden Style außer $ES_WANTRETURN benutzen damit die EditBox gleich bleibt aber kein Return mehr akzeptiert.

  • Okay, da reden wir gerade aneinander vorbei :)

    Ich möchte ja, dass ich in der Editbox Enter verwenden kann, nur außerhalb dieser Editbox soll Enter halt wie gewünscht $frmRefreshButton auslösen.

    • Offizieller Beitrag

    Ist ganz einfach, hier mal eine mögliche Lösung:

  • Hiho Raupi,

    danke erstmal für deine Antwort. Leider komme ich damit irgendwie nicht weiter...

    So wird die Editbox erstellt, und gefüllt wird sie mit Daten aus einer Datei die ausgelesen wird:

    [autoit]

    $Log_edtBot = GUICtrlCreateEdit("", 421, 360, 340, 170, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN, $ws_hscroll, $ws_vscroll), $WS_EX_CLIENTEDGE) ;untere Detailansicht

    [/autoit]

    Das Hauptfenster heißt

    [autoit]

    $frmMain

    [/autoit]


    Würde es so funktionieren? Leider tut es das nicht :(

    [autoit]

    If ControlGetFocus($frmMain) <> $Log_edtBot Then ;$Log_edtBot ist die untere von zwei Editboxen
    ...
    EndIf

    [/autoit]

    2 Mal editiert, zuletzt von DasIch (29. Mai 2015 um 14:35)

  • Eigentlich müsste das funktionieren (wenn es an die richtige Stelle gepackt wird). Du musst an die Stelle wo $frmRefreshButton abgefragt wird und dort eine Abfrage zum Fokus einbauen, sodass das Event (oder wie auch immer du das gemacht hast) nur ausgelöst wird wenn der Fokus stimmt.

    Wenn das nicht läuft müssten wir einen Blick in den Code werfen.

    (PS: Sry, wegen dem ersten Post, aus "dass das Programm beim schreiben in Editboxen die Entertaste vorübergehend "deaktiviert"" hab ich geschlossen das die Entertaste im Edit nicht funktionieren soll^^)

  • Heyho Mars, auch dir danke für die Hilfe :P

    Ich habe den Code jetzt mal zurechtgeschnitten, weil ich nicht alle 1500 Zeilen hier reinkopieren mag :P Aber die Funktionen, um die es geht, habe ich trotzdem im Groben beibehalten.

    schau es dir mal bitte an, ob irgendetwas nicht passt.

    Zur Erklärung wie es gedacht war:
    Dadurch, dass ich einige Textfelder habe, nach deren Begriffen in Dateien, Berechtigungen usw. gesucht werden können, war es sehr unangenehm, immer den Button anklicken zu müssen. Also habe ich mir einen Workaround einfallen lassen, wie man die Suche auch mit Enter starten kann.

    Hierzu setze ich mit GUISetAccelerators() einen entsprechenden Hotkey, der einen anderen, versteckten Button auslöst, der wiederum eine Funktion startet. In dieser Funktion wird geschaut, aus welchem Textfeld die Eingaben kamen und entsprechend wird die jeweilige Funktion ausgeführt.

    Allerdings ist das Problem, dass ich, wenn ich in der besagten Editbox den Text bearbeiten möchte und Enter drücke, immer die zuletzt ausgeführte Suche ausgeführt wird, was natürlich nicht Sinn der Sache ist. Ich möchte in der Editbox sobald sie aktiv ist auch mit Enter arbeiten können und den Hotkey während dieser Bearbeitung deaktivieren können.

    Ich hoffe ihr versteht das Problem nun besser und könnt mir helfen :P

    LG und Danke,
    der Robert

    P.S.: Hier noch der Sourcecode:


    Spoiler anzeigen

    Einmal editiert, zuletzt von DasIch (29. Mai 2015 um 15:56)

    • Offizieller Beitrag

    Was hält dich davon ab mal die Hilfe zu ControlGetFocus zu lesen?
    Die Rückgabe ist nicht ein ControlId wie $Log_edtBot sondern ein String mit z.B. "EDIT1", "BUTTON1" usw und danach solltest du abfragen.

    AutoIt
    if ControlGetFocus($frmMain) <> "EDIT1" Then

    Warum ich das in meinem Bespiel wohl benutzt habe? X/

  • Oh, na klar. Wusste ich doch! :P Not... :whistling:

    Okay, damit kann ich zumindest verhindern, dass die Funktion erneut ausgeführt wird. Allerdings kann ich immer noch keine Entertaste für den Zeilenumbruch in der Editbox verwenden :(

  • Ich rate von versteckten Buttons ab. Ein einfacher Trick wäre die nutzung von _IsPressed.
    Nachteil: Muss im Main Loop auftauchen -> verbraucht etwas Rechenzeit
    Vorteil: Absolut Ctrl-Unabhängig, da einfach nur gecheckt wird ob eine Taste gedrückt wurde.

    lg
    M

  • Das hat mir sehr geholfen Mars :D Daran sieht man, dass du schon länger hier bist und die Wege kennst die man gehen kann und sie dir nicht noch mühevoll herleiten musst :P

    Gibt es eine Möglichkeit nach dem Enter Drücken, den Fokus aus dem Inputfeld zu lösen, sodass man das Popup mit Enter wieder schließen kann?

  • Das erste was mir eingefallen ist ist ein Workaround mit einem Local Static Timer.
    Die Funktion kann also nur 0.5s (natürlich beliebig veränderbar) nachdem sie zuletzt beendet wurde wieder aufgerufen werden. Ist glaube ich keine besonderst elegante Lösung, so bleibt aber der Fokus auf dem Inputfeld erhalten und trotzdem kann das Popup mit Return beendet werden.

    • Offizieller Beitrag

    _IsPressed genau wie HotKeySet ist aber eine beschissen Lösung. Die Entertaste ist Global umbelegt und nicht nur auf die GUI bezogen.
    Angenommen du hast das Prog am laufen und du willst was im Browser schreiben, dann hast du gelitten. Bei Enter wird auch im Browser die Funktion ausgeführt.

  • Also würdest du GUISetAccelerators() nutzen, Raupi? Wenn ja, erklär mir doch bitte, wie ich die Zeilenumbrüche mit Enter in der Editbox verwirklichen kann :(

  • Es kann so einfach sein:

    AutoIt
    If ControlGetFocus($frmMain) = 'Edit1' Then
    _GUICtrlEdit_InsertText($Log_edtBot, @CRLF)
    Else
    _TestFunc()
    EndIf

    Danke euch! :D