• Moin,
    hab ne interessante Funktion in der Hilfe gefunden. Der erste Versuch sieht schon recht vielversprechend aus, nur das mit dem Mausmenu wird wohl nichts (zum Glück ist das keine Pflicht). Aller Voraussicht nach werde ich auch teilnehmen.

  • McPoldy, nich aufgeben! Ich glaube das du genug Ahnung hast um das doch noch rauszubekommen ;)

    Du hast doch auch noch Zeit! Also wirf die Flinte nicht ins Korn!!!


    Walle

    Flensburg ist wie Payback - wenn man 18 Punkte hat bekommt man ein Fahrrad.

  • Also wirf die Flinte nicht ins Korn!!!

    Das sagst Du einem Sportschützen ;)

    Ich habe weder DLL-Call, noch eine andere Funktion dafür genutzt ;) Es gibt noch andere Wege :)

    Ich habe da zwar grade was gefunden, nur anfangen kann ich nix damit, mal sehen, vielleicht finde ich ja doch noch einen dreh :)

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)

  • ich hab jetzt auch einen anderen weg gefunden!
    hab mich am anfang zusehr auf die user32.dll fixiert...

    am meisten hab ich damit gekämpft, das rechtemaus-kontextmenü loszuwerden -
    letztendlich ist die lösung einfacher, als ich dachte ;)

  • Nun zu meinem stümperhaften Versuch.
    Da es hier anscheinend alle ohne die dll gemacht zu haben scheinen, habe ich darauf auch verzichtet. Dadurch ist jetzt jedoch ist die Funktionalität des Edits eingeschränkt (und ziemlich groß ist die Datei auch noch :( ), ich bin also mal gespannt, wie die Profis die Aufgabe gelöst haben.
    Da ich ja angekündigt hatte, dass ich es versuche, zeige ich auch mein "Ergenis".

    Edit: Da ich heute Abend und morgen nicht die Möglichkeit haben werde, online zu kommen gibt es das Passwort schon jetzt, vor mir will wohl eh keiner was abgucken...
    Pw: Td6)djE2CYk%sj

  • soooo

    bin grade aus Paris rein und freu mich, dass also am Ende doch recht viele mitgemacht haben. PWs könnt ihr von mir aus schon jetzt oder morgen früh on stellen. Die Auflösung kommt bis Mittwoch.


    Walle

    Flensburg ist wie Payback - wenn man 18 Punkte hat bekommt man ein Fahrrad.

  • Auswertung

    Zunächst einmal möchte ich mich wieder bei allen bedanken, die am Wettbewerb teilgenommen haben. Diesmal waren es immerhin 6 Leute, die sich dieser kniffligen Aufgabe stellten.
    Die wärend des Wettbewerbs gegeben Hinweise bezüglich Caret und Sonderzeichen sowie DLL wurden weitgehend berücksichtigt und auch die Skripte funktionieren im Großen und Ganzen alle.
    Gut ist auch das sich alle Teilnehmer an die Regeln gehalten haben und die Skripte entsprechend den Vorgaben abgegeben wurden (endlich mal mit Profis arbeiten^^)

    Jetzt aber der eigentlich wichtige Teil, die Auswertung der Einzelnen Arbeiten:

    progandy:

    • Skriptgröße: 627Byte - auf 21 Zeilen
    • Zusätzliche Datein: /
    • Bugs: /


    autoit.de/wcf/attachment/2717/

    Das Kontextmenu, wurde leider nicht deaktiviert und behinderte somit immer etwas die Sicht, sonst einwandfrei.

    Spoiler anzeigen
    [autoit]

    $g=GUICreate("")
    $e=GUICtrlCreateEdit("",0,0)
    $p=GUICtrlCreateLabel("",9,200,200,20)
    GUISetState()
    Do
    If GUIGetMsg()=-3 Then Exit
    $r=GUIGetCursorInfo()
    If $r<>0 And $r[3]And $r[4]=$e Then
    $x=BitAND(GUICtrlSendMsg($e,215,0,BitOR(BitShift($r[1],-16),BitAND($r[0],0xFFFF))),0xFFFF)
    $z=StringRegExpReplace(GUICtrlRead($e),"[][.-;:,·¿?!¡„“»«,’/\(){}]|\s"," ")
    If StringMid($z,$x,1)=" "Then ContinueLoop
    $a=StringInStr(StringLeft($z,$x),' ',1,-1)+1
    $b=StringInStr(StringTrimLeft($z,$x),' ')
    $c=($b>0)*($x-$a+$b)-($b=0)
    $s=StringMid($z,$a,$c)
    For $i=1 To StringLen($s)
    $r=StringMid($s,$i,1)&$r
    Next
    GUICtrlSetData($p,$r)
    EndIf
    Until 0

    [/autoit]

    McPoldy:

    • 971 Byte - auf 28 Zeilen
    • zusätzliche Datein: user32.dll - 567KB
    • Bugs: Einige Sonderzeichen werden mit zum Wort gezählt beim Reverse.


    autoit.de/wcf/attachment/2719/

    Das Kontextmenu überlagerte manchmal das Reversemenu.

    Spoiler anzeigen
    [autoit]

    $w = 800
    $h = 600
    $gui = GUICreate(@ScriptName, $w, $h, -1, -1)
    $E = GUICtrlCreateEdit("", 0, 0, $w, $h, BitOR(4096, 1048576, 2097152))
    $d = GUICtrlCreateDummy()
    $C = GUICtrlCreateContextMenu($d)
    $a = GUICtrlCreateMenuItem("Disabled", $C)
    $l = DllOpen("user32.dll")
    GUISetState()
    $is = False
    Do
    Local $a_R = DllCall($l, "int", "GetAsyncKeyState", "int", '0x02')
    If Not @error And BitAND($a_R[0], 0x8000) = 0x8000 Then
    $m = MouseGetPos()
    MouseClick("left", $m[0], $m[1], 2, 0)
    Send("^c")
    MouseClick("left", $m[0], $m[1], 1, 0)
    $is = False
    $t1 = ClipGet()
    $t2 = ''
    For $x = 0 To StringLen($t1)
    $t2 &= StringMid($t1, StringLen($t1) - $x, 1)
    Next
    GUICtrlSetData($a,StringRegExpReplace(StringStripWS($t2, 3), "[!?.,]", ""))
    DllCall($l, "int", "TrackPopupMenuEx", "hwnd", GUICtrlGetHandle($C), "int", 0, "int", $m[0], "int",$m[1], "hwnd", $gui, "ptr", 0)
    EndIf
    Until GUIGetMsg() = -3
    DllClose($l)

    [/autoit]

    goliath:

    • 1,07 KByte - auf ca. 44 Zeilen
    • zusätzliche Datein:/
    • Bugs: /

    autoit.de/wcf/attachment/2720/

    Großes WOW! Er hatte eine ganz ander Herangehesweise. Bei goliath konnte man ohne GUI in jedem beliebigen Windows fenster jeden beliebigen Text umdrehen lassen.

    Spoiler anzeigen
    [autoit]

    #include<GuiEdit.au3>
    #include<GuiConstantsEx.au3>

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

    Opt("GuiOnEventMode",1)

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

    GuiCreate("",500,500)
    GUISetOnEvent($GUI_EVENT_SECONDARYDOWN,"_click")
    Guisetonevent($GUI_EVENT_CLOSE,"_exit")
    $edit=GUICtrlCreatelabel("",0,0,500,500)
    $cmenu=GUICtrlCreateContextMenu($edit)
    $mitem = GUICtrlCreateMenuItem(" ",$cmenu)
    $edit=GUICtrlCreateEdit("",0,0,500,500,$ES_MULTILINE)
    Guisetstate()

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

    While 1
    WEnd

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

    Func _click()
    $info=GUIGetCursorInfo()
    if $edit=$info[4] Then
    $aPos = _GUICtrlEdit_CharFromPos($Edit,$info[0],$info[1])
    $c=StringSplit(GUICtrlRead($Edit),"")
    $i=$aPos[0]
    while $c[$i]<>" " and $i<>0
    $i-=1
    WEnd
    $wort=""
    While $i+1<=UBound($c)-1
    $i+=1
    if $c[$i]=" " or $c[$i]="." or $c[$i]="," or $c[$i]=":" or $c[$i]=";" Then exitloop
    $wort=$c[$i]&$wort
    WEnd
    $bpos=_GUICtrlEdit_PosFromChar($edit,$aPos[0])
    if $bpos[0]>$info[0]-19 and $bpos[0]<$info[0]+19 and $bpos[1]>$info[1]-19 and $bPos[1]<$info[1]+19 then
    GUICtrlSetData($mitem,$wort)
    Else
    GUICtrlSetData($mitem,"")
    EndIf
    EndIf
    EndFunc

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

    Func _exit()
    Exit
    endfunc

    [/autoit]

    eukalyptus:

    • 498 Byte - auf 26 Zeilen
    • zusätzliche Datein:/
    • Bugs: /

    autoit.de/wcf/attachment/2721/

    Das Edit-Kontextmenu wurde wunderschön entfernt ;)

    Spoiler anzeigen
    [autoit]

    GUICreate("")
    GUICtrlCreateEdit("",0,0)
    GUISetState()
    Do
    $M=GUIGetMsg(1)
    If $M[0]=-9 Then
    GUISetState(65)
    Do
    Until GUIGetMsg()=-10
    GUISetState(64)
    $S=BitAND(GUICtrlSendMsg(-1,0xD7,0,BitOR(BitAND(($M[4])*0x10000,0xFFFF0000),BitAND($M[3],0xFFFF))),0xFFFF)
    $T=StringSplit(GUICtrlRead(-1),"")
    $j=0
    For $i In $T
    $j+=1
    If (StringIsAlNum($i)=0 And $j<=$S)Or $j=1 Then
    $V=""
    ContinueLoop
    ElseIf StringIsAlNum($i)=0 Then
    ExitLoop
    EndIf
    $V=$i&$V
    Next
    ToolTip($V)
    EndIf
    Until $M[0]=-3

    [/autoit]

    BugFix:

    • 1,05 KByte - auf 48 Zeilen
    • zusätzliche Datein:/
    • Bugs: /

    autoit.de/wcf/attachment/2722/

    Spoiler anzeigen
    [autoit]

    Opt("GUIOnEventMode",1)
    Global $g=GUICreate('')
    GUISetOnEvent(-3, 'off')
    GUISetOnEvent(-9, 'down')
    GUISetOnEvent(-10, 'up')
    $e=GUICtrlCreateEdit("",9,9)
    GUISetState()
    While 1
    Sleep(20)
    WEnd
    Func off()
    Exit
    EndFunc
    Func down()
    GUISetState(@SW_LOCK)
    GUICtrlSetState($e, 128)
    EndFunc
    Func up()
    GUICtrlSetState($e, 64)
    GUISetState(@SW_UNLOCK)
    $p=MouseGetPos()
    MouseClick('left',$p[0],$p[1],1,1)
    Rev_Word()
    EndFunc
    Func Rev_Word()
    $t=ControlCommand($g,'',$e,"GetLine",ControlCommand($g,'',$e,"GetCurrentLine",""))
    $s=ControlCommand($g,'',$e,"GetCurrentCol","")
    $a=StringSplit($t,' ')
    If Not IsArray($a) Then Return
    $d=ObjCreate('Scripting.Dictionary')
    For $n=1 To UBound($a)-1
    $q=StringInStr($t,$a[$n])+1
    For $j=$q To $q+StringLen($a[$n])-2
    $d.Add($j,$a[$n])
    Next
    Next
    If $d.Exists($s) Then
    $ch=$d.Item($s)
    $w=StringRegExpReplace($d.Item($s),'[\W_]+','')
    Else
    Return
    EndIf
    $o=''
    For $n=StringLen($w) To 1 Step -1
    $o&=StringMid($w,$n,1)
    Next
    WinSetTitle('','','Reverse von: '&$w&' = '&$o)
    EndFunc

    [/autoit]

    Oscar:

    • 619 Byte - auf 26 Zeilen
    • zusätzliche Datein:/
    • Bugs:
    • Fast hätte das Skript nicht gewertet werden können, da es nicht lief^^ ControlClick($z,'',$e,'primary',2,$p[0],$p[1]) muss ControlClick($z,'',$e,'left',2,$p[0],$p[1]) heißen. Dank dem pee, dass er diesen Fehler behoben hat und ich es dadurch testen konnte^^
    • Sonderzeichen wurden beim Reverse mitgezählt
    • Wenn man was geschrieben hatte und dann den reverse anzeigen gelassen hat konnte man später nichts mehr im Text bearbeiten.

    Auch hier wurde das Kontextmenu einwandfrei entfernt.

    autoit.de/wcf/attachment/2723/

    Spoiler anzeigen
    [autoit]

    Opt('GUIOnEventMode',1)
    Opt('MouseCoordMode',2)
    $z=GUICreate('',300,99)
    GUISetOnEvent(-3,'Q')
    $e=GUICtrlCreateEdit('',0,0,300,99,2097156)
    GUISetState()
    $y=GUICreate('',285,99,0,0,-2147483648,72,$z)
    WinSetTrans($y,'',1)
    GUISetOnEvent(-9,'A')
    GUISetState()
    While 1
    Sleep(9)
    WEnd
    Func Q()
    Exit
    EndFunc
    Func A()
    Local $p=MouseGetPos(),$b,$a
    ControlClick($z,'',$e,'left',2,$p[0],$p[1])
    $a=StringRegExpReplace(ControlCommand($z,'',$e,'GetSelected',''),'[ \x27\.:",!?]','')
    For $i=StringLen($a) To 1 Step -1
    $b&=StringMid($a,$i,1)
    Next
    ControlClick($z,'',$e,'left',1,$p[0],$p[1])
    ToolTip($b)
    EndFunc

    [/autoit]

    ---------------------------------------------

    Gewinner im Juli ist:
    eukalyptus
    Natürlich trotzdem nochmal vielen Dank und Anerkennung an alle anderen Teilnehmer!
    Walle

    Flensburg ist wie Payback - wenn man 18 Punkte hat bekommt man ein Fahrrad.

    2 Mal editiert, zuletzt von Waluev (30. Juli 2008 um 14:51)

    • Offizieller Beitrag

    Hi!

    Danke auch von mir an alle Teilnehmer und an Waluev für's Auswerten und Organisieren. Ich bin ja immer ein Fan von superkurzem Code, daher besonderes Lob an progandy, auch wenn es noch minial kürzer gehen müsste:

    [autoit]

    $g=GUICreate("")

    [/autoit]


    ->

    [autoit]

    GUICReate("")

    [/autoit]

    ;).

    Bis zur nächsten Ausgabe,
    peethebee

    • Offizieller Beitrag

    Erstmal: Herzlichen Glückwunsch an eukalyptus! :thumbup:

    Waluev: Zu Punkt 1 bei meinem Script. Laut aktueller engl. Hilfedatei ist 'primary' bei ControlClick() durchaus als Maustaste erlaubt und wenn man mein Script mit AutoIt3.exe scriptname.au3 startet, dann funktioniert auch 'primary'. Lediglich der Aufruf aus Scite mittels AutoIt3Wrapper.exe gibt einen Fehler aus, warum auch immer...
    Wollte ich nur anmerken, weil ich zu dem Zeitpunkt noch Notepadd++ mit dem obigen Aufruf verwendete und somit bei mir gar keine Fehlermeldung kam. Mittlerweile benutze ich aber auch Scite.