Case Input ?!

  • Hallo @ all.
    Nach längerer Zeit mal wieder ein Projekt und ein Post von mir.
    Für ein kleines Aufgabenverwltungs-Script möchte ich abfragen ob ein Input Feld ausgeählt ist.
    So ungefähr:

    [autoit]

    ;Gui...
    Case $Input1
    If _isPressed(enter als hexadezimalzahl) then _1()

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

    Case $Input2
    ;.............

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

    Func _1()
    Sleep (10)
    EndFunc

    [/autoit]


    Das Problem:
    Mit isPressed Funktioniert nicht da das eine schleife erfordern würde und dadurch die anderen Felder nicht mehr abgefragt werden könnten. (oder?)
    Hotkey hat bei mir auch nicht funktioniert.

    Danke im Vorraus

    mfg Ubuntu

    Edit: Ich hab nochmal getestet und mir ist aufgefallen das man das auswählen eines Input Feldes gar nicht mit Case abfragen kann :S aber wie dann :?:

  • hmm... mit der zweiten Schleife wäre das in der tat vielleicht nicht optimal...
    vielleicht hilft dir der Ansatz (Pseudocode)

    [autoit]

    Adlibregister("Click")
    Func Click()
    $msg=guigetmsg()
    select
    case _ispressed(...)
    ;...
    case $msg=$Input
    ;...
    ....
    endfunc

    [/autoit]


    PS: du musst ja via _ispressed nur solange warten bis die Taste wieder losgelassen wird oder? wenn ja probier diesen Ansatz:

    [autoit]

    While _ispressed(...)
    sleep(10)
    wend
    select
    case ...

    [/autoit]

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Das inputfeld sended $SS_NOTIFY erst, wenn es verändert und abgeschickt wurde.

    Ob es den Focus hat kannst du mit

    [autoit]

    If ControlGetHandle("","",ControlGetFocus("")) = GUICtrlGetHandle($Input) Then

    [/autoit]


    abfragen.
    Wo dein Problem mit _IsPressed liegt versteh ich auch nicht.

    [autoit]

    If ControlGetHandle("", "", ControlGetFocus("") = GUICtrlGetHandle($Input) Then
    If _IsPressed(01) Then
    ; hier das zeug was es machen soll
    Do
    Sleep(10)
    Until Not _IsPressed(01)
    EndIf
    EndIf

    [/autoit]
  • Danke Ihr drei.
    Das hat mein Problem (hoffentlich) gelöst. Ich werds gleich mal einbauen und gucken wie es funktioniert.

    Ich hab mich jetzt fu Seubo's Lösung entschieden.
    Zur Frage wo mein Problem lag:
    Es lag bei:

    [autoit]


    If ControlGetHandle("", "", ControlGetFocus("") = GUICtrlGetHandle($Input) Then

    [/autoit]


    Nochmals Danke für die schnellen antworten und bis dann.

    mfg Ubuntu

  • Funktioniert ^^

    Verlangsamt den Code aber extrem :!: :(

    Falls es noch andere schnellere Sachen gibt erzählt es mir bitte. Aber hauptsache ist ja ermal das es klappt ;)

    mfg Ubuntu

    Ps: Und es ist nur ein Dreizeiler nähmlich:

    [autoit]

    If ControlGetHandle("",$name1[1],ControlGetFocus("")) = GUICtrlGetHandle($Input1) Then
    If _IsPressed("0D") Then _1()
    EndIf

    [/autoit]

    Ps2: Jetzt geändert in:

    [autoit]

    If ControlGetHandle("",$name1[1],ControlGetFocus("")) = $inp1 Then
    If _IsPressed("0D") Then _1()
    EndIf

    [/autoit]


    Aber nur ein bisschen schneller. :S

  • Probier mal testweise so:

    Spoiler anzeigen
    [autoit]

    $hInput = GUICtrlGetHandle($Input1) ; Am besten außerhalb der Schleife

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

    Switch ControlGetHandle("", "", ControlGetFocus(""))
    Case $hInput
    If _IsPressed("0D") Then
    _1()
    Do
    Sleep(10)
    Until Not _IsPressed("0D")
    EndIf
    EndSwitch

    [/autoit]

    Ich schreib das ganze Do - Until Zeug ja nich aus Spaß an der Freude, sondern um damit unnötig viele Funktionsaufrufe zu verhindern.
    (_Ispressed blockt ja keine Tasten)

    Außerdem:
    Switch > Select > Mehrzeiliges If > Einzeiliges If

  • Ok danke, ich werds mal versuchen.

    Zur Information: Mein Script braucht jetzt seine Zeit um gestartet zu werden und hackt teilweise bei den Eingaben.

    Eine Frage: Was heisst - Switch > Select ? Switch langsamer als Select ?

    Ich Poste gleich mal wies Funktioniert hat.
    Danke schon mal.

    mfg Ubuntu

    Edit: Irgendwie geht jetzt gar nichts mehr. Ich hab leider nicht mehr so viel Zeit deshalb setz ich mich heute Abend warscheinlich nochmal ran.

    Edit2: Funktioniert nach neustart von Scite doch *komisch*
    Leider nur unmerklich schneller. hm. Naja der Script ist vorrausichtlich bald Fertig, sodass wir das im scripte unterforum weiterdiskutieren können.
    Für Vorschläge anregungen bin ich aber weiterhin ganz Ohr.
    Vor allem denke ich, dass das ganze doch auch mit Hotkeyset zu machen sein könnte was gleube ich nochmal schneller geht :huh:

    Danke für die umfangreiche Hilfe

    mfg Ubuntu

    Edit 2180235: Mir ist noch aufgefallen das die Funktionen und das gesamte Script so:

    Spoiler anzeigen


    Viel flüssiger läuft als vorher mit:

    Spoiler anzeigen
    [autoit]

    If ControlGetHandle("",$name1[1],ControlGetFocus("")) = GUICtrlGetHandle($Input1) Then
    If _IsPressed("0D") Then _1()
    EndIf

    [/autoit]

    (zumindest nach einigen korrekturen am restlichen Source)
    Danke dafür ich denke das ist schon eine recht gute Lösung :thumbup:

    3 Mal editiert, zuletzt von Ubuntu (3. Februar 2010 um 13:36)

  • Was das einzeilige ist langsamer als das mehrzeilige :!: Ich dachte das sei andersherum.

    Danke für die schnelle Antwort Schnitzel.

    mfg Ubuntu

  • Was das einzeilige ist langsamer als das mehrzeilige

    jup. man glaubts kaum aber es ist so.
    genauso wie auf kurze variablennamen schneller für den zugriff sin als lange.

    also $i hat schnellere zugriffe als $dasistmeinezaehlervariablefuerdieforschleife

  • Mehrzeiliges If > Einzeiliges If


    Wo hast du das gelesen?
    Versuch es doch mal:

    Spoiler anzeigen
    [autoit]

    Global $iN = 100000
    Global $Temp, $iTimer

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

    $iTimer = TimerInit()
    For $i=1 To $iN
    If mod($i, 2) = 0 Then
    $Temp = $i
    EndIf
    Next
    $iTimer = TimerDiff($iTimer)
    ConsoleWrite("Mehrzeilig:" & @TAB & round($iTimer/$iN,5) & " ms" & @CRLF)

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

    $iTimer = TimerInit()
    For $i=1 To $iN
    If mod($i, 2) = 0 Then $Temp = $i
    Next
    $iTimer = TimerDiff($iTimer)
    ConsoleWrite("Einzeilig:" & @TAB & round($iTimer/$iN,5) & " ms" & @CRLF)

    [/autoit]

    Bei Fallunterscheidungen per Else-If ist das durchaus richtig und logisch - aber bei einer einfachen If-Abfrage ist das egal ob die Abfrage einzeilig oder mehrzeilig ist.
    Mit der Pauschalisierung "mehrzeilig>einzeilig" kann ich also nicht mitgehen.
    Mag sein das du das richtige meinst - aber dann schreib vielleicht eher If-Else>If-Then-If-Then.oder sowas.
    Neulinge nehmen das schnell für bare Münze und verzichten daher vielleicht auf übersichtlichere einzeilige If-Then wo es gar nicht nötig ist.

    Einmal editiert, zuletzt von AspirinJunkie (3. Februar 2010 um 13:51)

  • Kann es sein das es da um Verzweigungen (also mit Else) ging?
    Das wär noch logisch.
    Ansonsten könnte es daran liegen das Timerdiff nur über eine einzige Ausführung ging?
    Da spielen so viele zufällige Faktoren rein das das Messergebnis stark verfälscht wird.
    In dem Fall dürfte wohl sogar schon die Ungenauigkeit von TimerInit-Timerdiff selbst darüber liegen:

    Spoiler anzeigen
    [autoit]

    Global $iN = 100000
    Global $Temp = 0

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

    For $i = 1 To $iN
    $Temp += TimerDiff(TimerInit())
    Next

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

    ConsoleWrite("Timerfehler:" & @TAB & Round($Temp / $iN, 5) & " ms" & @CRLF)

    [/autoit]


    Daher lieber über sehr viele Ausführungen mitteln - das macht das Ergebnis sicherer.

  • Mich würde interessieren in welchen bereichen sich diese unterschiede abspielen (zehntelsekunden, milisekunden).
    Das heisst ab welcher programmgröße man das ganze überhaupt merkt. (speziell mit dem Zugriff auf variablen)

    Ich finde sowieso mann sollte mal einen "Wie mache ich meinen Code schneller ?" Thread machen

    gespannt wartend auf die Antworten: Ubuntu

  • Ich weiß auch nicht mehr genau wie ich es getstet habe. Ist auch schon eine ewigkeit her.
    Der Timerfehler ist aber schon krass o.o


    @Ubuntu damals hat sich das so im bereich von allerhöchstens einer millisekunde abgespielt. wenn ich mich recht erinnere hatte ich 0,6 ms für ein mehrzeiliges If (ohne else/elseif), und ~1,3 für das gleiche mit switch/select.
    Bei mehrzeilen war If/else dann mit 1,7 oder so vertreten, und switch/select ist bei 1,3 geblieben glaub ich.

    Weiß es aber nich mehr soo genau.