Funktionen werden zu Objekten - Das OCFGV-Paradigma - Eigene Objekte in 2 Zeilen

  • Hi!

    Ich habe mir mal ein neues Sprach-Paradigma für AutoIt erdacht, also eine neue Art, Skripte zu verfassen. Man könnte ganz primitiv sagen, Funktionen werden zu Objekten, aber es gibt doch signifikante Unterschiede zum Arbeiten mit normalen AutoIt Funktionen. Also wie geht das ganze?

    Grundlage des Ganzen ist natürlich eine Funktion, meine UDF. Sie ist extrem kompakt und schmeißt doch den ganzen Sinn des BASIC-Paradigmas AutoIts über den Haufen. Die Idee dahinter ist, ein Modul als Objekt darzustellen. Nehmen wir als Beispiel mal eine 2D-Engine. Normalerweise würde man die so aufrufen:

    [autoit]

    $Handle = _Engine_Funktion(Par1, Par2, ..., ParN)
    _Engine_Funktion2($Handle, Par1)

    [/autoit]

    Nun ist das der UDF Standard, dem eigentlich jede AutoIt UDF folgt. Mit dem Object-CallBack-Functions-Global-Variables-Paradigm sieht das dann so aus (der Name lässt es vermuten):

    [autoit]

    $oEngine = _Engine_StartUp()
    $oEngine.Function1(Par1, Par2, ..., ParN)
    $oEngine.Function2(Par1)

    [/autoit]

    So - was bringt einem dieses Objekt-Gehabe nun? Erstens sieht es meiner Meinung nach sauberer und besser aus und zweitens muss der Nutzer keine Variablen mehr von Hand durchreichen, da alle Variablen global deklariert sind, welche für die Engine wichtig sind! Der Nutzer muss sich damit also schonmal nicht mehr befassen.

    Update: Ich hab das Ganze etwas umgeschrieben. Die Funktionen werden nun automatisch erkannt und in ein Objekt geschrieben. Dazu braucht es nur einen Funktionsaufruf, bei dem ihr keine Parameter übergeben müsst. Die Objekt-Funktionen werden jetzt mit __o_ als Präfix verfasst. Mehrere Objekte gleichzeitig sind jetzt möglich und es wird danach auch aufgeräumt ^^. Beispiel im Anhang. (dnke an BuFix für seinen Beitrag.

    Falls noch Fragen bestehen (ich glaube schon ^^) einfach schreiben.

    (Das ist optional! Es funktioniert mit der aktuellen Stable und muss nicht genutzt werden - wer darin "keinen Sinn" sieht, muss es nicht nutzen. Ich zitiere hier mal name22: "Ich denke das könnte sich noch als nützlich erweisen. Mir fällt kein expliziter Verwendungszweck ein, aber es ist auf jeden Fall ziemlich cool . :D ")

  • Das Deregistrieren ist mMn nicht wichtig, da das "objekt" keinen System-Namespace vereinnahmt. Wenn dich die paar KB im TempDir stören kannst du das auch wieder löschen (es wird ja nicht jedes Mal eine neue Datei erstellt, sondern immer die alte geleert + neu beschrieben).

  • Hallo minx,

    ich finde essehr toll und praktisch wie du das gemacht hast, wenn es dann bei mir funktionieren würde :/ Entweder bin ich zu doof oder es klappt bei mir halt nicht.
    Ich bekomme hier immer die rückmeldung, dass "[22,15] Dieser Name existiert bereits:"... und dann klappt nichts.
    Ich habe wie in deinem Beispiel alles ähnlich gemacht nur das ich statt GuiCTRLCreateGraphic GDI+ verwende.

    Ich hoffe dass du mein Problem beheben kannst...

    P.S.: Hier mein Skript:

    Spoiler anzeigen
    [autoit]

    #RequireAdmin
    #include <obj_v2.au3>
    #include <GDIPlus.au3>
    #include <GuiConstantsEx.au3>
    #include <WinAPI.au3>

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

    Local $oGraph, $abcdef = _MakeObj($oGraph)
    Global Const $Width = 500, $Height = 500
    Global $hGraphic, $hBitmap, $hBuffer

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

    $hGui = GUICreate("Meine Funktion als Objekt",$Width,$Height)
    GUISetState(@SW_SHOW)

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

    $oGraph.StartUp($hGui, $hGraphic, $hBitmap, $hBuffer)

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

    $oGraph.Clear_Buffer($hBuffer)
    $oGraph.Draw_Line($hBuffer,10,10,100,100)
    $oGraph.Draw_Buffer($hGraphic, $hBitmap)

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

    While Sleep(10)
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    $oGraph.Shutdown($hGraphic, $hBitmap, $hBuffer)
    Exit
    EndSwitch
    WEnd

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

    Func __o_StartUp($hG, $hGr, $hBi, $hBu)
    _GDIPlus_Startup()
    Global $hGr = _GDIPlus_GraphicsCreateFromHWND($hG)
    Global $hBi = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGr)
    Global $hBu = _GDIPlus_ImageGetGraphicsContext($hBi)
    EndFunc

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

    Func __o_Clear_Buffer($hBu)
    _GDIPlus_GraphicsClear($hBu,0xFFFFFFFF)
    EndFunc

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

    Func __o_Draw_Line($hBu,$x1,$y1,$x2,$y2)
    _GDIPlus_GraphicsDrawLine($hBu,$x1,$y1,$x2,$y2)
    EndFunc

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

    Func __o_Draw_Buffer($hGr,$hBi)
    _GDIPlus_GraphicsDrawImageRect($hGr,$hBi,0,0,$Width,$Height)
    EndFunc

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

    Func __o_Shutdown($hGr, $hBi, $hBu)
    _GDIPlus_GraphicsClear($hGr)
    _WinAPI_DeleteObject($hBu)
    _GDIPlus_BitmapDispose($hBi)
    _GDIPlus_GraphicsDispose($hGr)
    _GDIPlus_Shutdown()
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Du mußt innerhalb der Funktionen die Parameter erst auslesen mit _Parameters, die werden nicht direkt übernommen.

    Bsp.:

    [autoit]


    Func __o_Test($hWnd, $sText, $iIndex)
    Local $aParam = _($OBJECTVARIABLE.Test_Parameters)
    _GUICtrlListBox_InsertString($aParam[1], $aParam[2], $aParam[3])
    EndFunc

    [/autoit]
  • Wenn ich aber jetzt die Parameter abfrage bekomme ich einen Syntax Error?????

    Ich habe jetzt mal die StartUp-Funktion geändert...

    [autoit]

    Func __o_StartUp($hG, $hGr, $hBi, $hBu)
    $aParameters = _($oGraph.StartUp_Parameters)
    _GDIPlus_Startup()
    Global $aParameters[2] = _GDIPlus_GraphicsCreateFromHWND($aParameters[1])
    Global $aParameters[3] = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $aParameters[2])
    Global $aParameters[4] = _GDIPlus_ImageGetGraphicsContext($aParameters[3])
    EndFunc

    [/autoit]
  • Sorry das war mein Fehler ...
    Habs jetzt nochmal überarbeitet...

    ich kriege zwar keinen Syntax error mehr aber die meldung mit dem bereits existierenden Namen kommt immernoch...

    Spoiler anzeigen
    [autoit]

    #RequireAdmin
    #include <obj_v2.au3>
    #include <GDIPlus.au3>
    #include <GuiConstantsEx.au3>
    #include <WinAPI.au3>
    #include <Array.au3>

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

    Local $oGraph, $abcdef = _MakeObj($oGraph)
    Global Const $Width = 500, $Height = 500
    Global $hGraphic, $hBitmap, $hBuffer

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

    $hGui = GUICreate("Meine Funktion als Objekt",$Width,$Height)
    GUISetState(@SW_SHOW)

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

    $oGraph.StartUp($hGui)

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

    $oGraph.Clear_Buffer($hBuffer)
    $oGraph.Draw_Line($hBuffer,10,10,100,100)
    $oGraph.Draw_Buffer($hGraphic, $hBitmap)

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

    While Sleep(10)
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    $oGraph.Shutdown($hGraphic, $hBitmap, $hBuffer)
    Exit
    EndSwitch
    WEnd

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

    Func __o_StartUp($hG)
    Local $aParameters = _($oGraph.StartUp_Parameters)
    _GDIPlus_Startup()
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($aParameters[1])
    Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphic)
    Global $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    EndFunc

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

    Func __o_Clear_Buffer($hBu)
    Local $aParameters = _($oGraph.Clear_Buffer_Parameters)
    _GDIPlus_GraphicsClear($aParameters[1],0xFFFFFFFF)
    EndFunc

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

    Func __o_Draw_Line($hBu,$x1,$y1,$x2,$y2)
    Local $aParameters = _($oGraph.Draw_Line_Parameters)
    _GDIPlus_GraphicsDrawLine($aParameters[1],$aParameters[2],$aParameters[3],$aParameters[4],$aParameters[5])
    EndFunc

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

    Func __o_Draw_Buffer($hGr,$hBi)
    Local $aParameters = _($oGraph.Draw_Buffer_Parameters)
    _GDIPlus_GraphicsDrawImageRect($aParameters[1],$aParameters[2],0,0,$Width,$Height)
    EndFunc

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

    Func __o_Shutdown($hGr, $hBi, $hBu)
    Local $aParameters = _($oGraph.Shutdown_Parameters)
    _GDIPlus_GraphicsClear($aParameters[1])
    _WinAPI_DeleteObject($aParameters[3])
    _GDIPlus_BitmapDispose($aParameters[2])
    _GDIPlus_GraphicsDispose($aParameters[1])
    _GDIPlus_Shutdown()
    EndFunc

    [/autoit]
    • Offizieller Beitrag
    [autoit]

    Func __o_StartUp($hG)
    Local $aParameters = _($oGraph.StartUp_Parameters)
    _GDIPlus_Startup()
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($aParameters[1])
    Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphic)
    Global $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    EndFunc

    [/autoit]

    Na, die 3 Globalen Variablen hast du doch bereits am Skriptanfang deklariert! Hier dann nur den Wert zuweisen, ohne "Global". ;)

  • Cool danke :D Jetzt bekomme ich zwar keine Fehler und Errors mehr aber es kommt auch keine Gui :D

    Kann das vlt. an Windows 8 liegern ? :o

    Spoiler anzeigen
    [autoit]

    #RequireAdmin
    #include <obj_v2.au3>
    #include <GDIPlus.au3>
    #include <GuiConstantsEx.au3>
    #include <WinAPI.au3>
    ;#include <Array.au3>

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

    Local $oGraph, $abcdef = _MakeObj($oGraph)
    Global Const $Width = 500, $Height = 500
    Global $hGraphic, $hBitmap, $hBuffer

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

    $hGui = GUICreate("Meine Funktion als Objekt",$Width,$Height)
    GUISetState(@SW_SHOW)

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

    $oGraph.StartUp($hGui)

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

    $oGraph.Clear_Buffer()
    $oGraph.Draw_Line(10,10,100,100)
    $oGraph.Draw_Buffer()

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

    While Sleep(10)
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    $oGraph.Shutdown()
    Exit
    EndSwitch
    WEnd

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

    Func __o_StartUp($hG)
    Local $aParameters = _($oGraph.StartUp_Parameters)
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($aParameters[1])
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    EndFunc

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

    Func __o_Clear_Buffer()
    _GDIPlus_GraphicsClear($hBuffer,0xFFFFFFFF)
    EndFunc

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

    Func __o_Draw_Line($x1,$y1,$x2,$y2)
    Local $aParameters = _($oGraph.Draw_Line_Parameters)
    _GDIPlus_GraphicsDrawLine($hBuffer,$aParameters[1],$aParameters[2],$aParameters[3],$aParameters[4])
    EndFunc

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

    Func __o_Draw_Buffer()
    _GDIPlus_GraphicsDrawImageRect($hGraphic,$hBitmap,0,0,$Width,$Height)
    EndFunc

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

    Func __o_Shutdown()
    _GDIPlus_GraphicsClear($hGraphic)
    _WinAPI_DeleteObject($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    EndFunc

    [/autoit]
  • Ich weiß nicht woran es liegen kann aber dein Beispiel Funktioniert aber meins was nach dem Nachfragen heute eigentlich richtig sein sollte wird nicht dargestellt ... Kann es sein das deine UDF einen Bug hat? Oder Kann es an meinem PC liegen oder darand das noch irgendetwas falsch ist??? Ich wäre dir sehr verbunden wenn du mir helfen würdest;)

    Hier nochmal allesin einer Datei:

    Spoiler anzeigen
    [autoit]

    #RequireAdmin
    #include <Array.au3>
    #include <GDIPlus.au3>
    #include <GuiConstantsEx.au3>
    #include <WinAPI.au3>

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

    Local $oGraph, $abcdef = _MakeObj($oGraph)
    Global Const $Width = 500, $Height = 500
    Global $hGraphic, $hBitmap, $hBuffer

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

    $hGui = GUICreate("Meine Funktion als Objekt",$Width,$Height)
    GUISetState(@SW_SHOW)

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

    $oGraph.StartUp($hGui)

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

    While Sleep(10)
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    $oGraph.Shutdown()
    Exit
    EndSwitch

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

    $oGraph.Clear_Buffer()
    $oGraph.Draw_Line(10,10,100,100)
    $oGraph.Draw_Buffer()
    WEnd

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

    Func __o_StartUp($hG)
    Local $aParameters = _($oGraph.StartUp_Parameters)
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($aParameters[1])
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    EndFunc

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

    Func __o_Clear_Buffer()
    _GDIPlus_GraphicsClear($hBuffer,0xFFFFFFFF)
    EndFunc

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

    Func __o_Draw_Line($x1,$y1,$x2,$y2)
    Local $aParameters = _($oGraph.Draw_Line_Parameters)
    _GDIPlus_GraphicsDrawLine($hBuffer,$aParameters[1],$aParameters[2],$aParameters[3],$aParameters[4])
    EndFunc

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

    Func __o_Draw_Buffer()
    _GDIPlus_GraphicsDrawImageRect($hGraphic,$hBitmap,0,0,$Width,$Height)
    EndFunc

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

    Func __o_Shutdown()
    _GDIPlus_GraphicsClear($hGraphic)
    _WinAPI_DeleteObject($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _MakeObj
    ; Description ...: Creates & registers a system object fireing events wich start the functions given
    ; Syntax ........: _Object_CreateFromFunctions(Byref $obj, $Array)
    ; Parameters ....: $obj - A previously declared Variable to write the object to
    ; $Array - Array of function names and parameter counts
    ; Authors .......: minx, BugFix
    ; Remarks .......: [Heute, 01:08] Von name22: Mir fällt kein expliziter Verwendungszweck ein, aber es ist auf jeden Fall ziemlich cool.
    ; ===============================================================================================================================
    Func _MakeObj(ByRef $obj)
    Local $_=StringSplit("Func\s+__o_([\w_]+)\(([$\w_\s=,]+)?\)|$|(\$\w+)|"&Random(1000,9999,1)&'|<method name="|<property name="|_Parameters|<event name="|" dispid="|fireEvent("|Function|component>|<registration progid="|public>|<script language="VBScript">|</script>||',"|",2),$aFunc=StringRegExp(FileRead(@ScriptFullPath),$_[0],3),$Array[UBound($aFunc)][2],$n,$k=@TempDir&'\'&$_[3]&'.wsc'
    If Not IsDeclared("objContainer") Then Global $objContainer[1]=[$_[3]+OnAutoItExitRegister("_del_")]
    For $i = 0 To UBound($aFunc)-1
    If StringLeft($aFunc[$i], 1)=$_[1] Then ContinueLoop
    $Array[$n][0] = $aFunc[$i]
    If StringLeft($aFunc[$i+1],1)=$_[1] Then
    $Array[$n][1]=UBound(StringRegExp($aFunc[$i+1],$_[2],3))
    EndIf
    $n += 1
    Next
    ReDim $Array[UBound($Array)-1][2]
    For $i = 0 To UBound($Array)-1
    $_[16] &= $_[4]&$Array[$i][0]&'"/>'&@lf&$_[5]&$Array[$i][0]&$_[6]&'"/>'&@lf&$_[7]&$Array[$i][0]&$_[8]&$i&'"/>'&@lf
    $_[17] &= $_[10]&' '&$Array[$i][0]&'('&_f($Array[$i][1],",")&')'&@lf&$Array[$i][0]&$_[6]&'='&_f($Array[$i][1],'&"|"&',1)&@lf&$_[9]&$Array[$i][0]&'")'&@lf&'End '&$_[10]&@lf
    Next
    Global $oAU3Error = ObjEvent("AutoIt.Error","_er")
    BitOR(FileDelete($k),FileWrite($k, "<"&$_[11]&@lf&$_[12]&$_[3]&'"/>'&@lf&'<'&$_[13]&@lf&$_[16]&@lf&'</'&$_[13]&@lf&@lf&$_[14]&@lf& $_[17]&@lf&$_[15]&@lf&'</'&$_[11]),RunWait('regsvr32.exe /s "' & $k, @TempDir),Assign("obj",ObjCreate($_[3])),ObjEvent($obj, "__o_"))
    EndFunc
    Func _f($n, $s, $l = False)
    If $n Then
    $out = ""
    For $i=1 To $n
    $out&="v"&$i-1&$s
    Next
    Return StringTrimRight($out,StringLen($s))
    Else
    If $l Then Return '""'
    Return ''
    EndIf
    EndFunc
    Func _($str)
    Return StringSplit($str, "|")
    EndFunc
    Func _er()
    ConsoleWrite("!> An error occurred ("&$oAU3Error.description&")"&@LF)
    EndFunc
    Func _del_()
    For $i=0 To UBound($objContainer)-1
    ConsoleWrite("-> Delete Objects (Return: "&FileDelete(@TempDir&"\"&$objContainer[$i]&".wsc")&"). Did it even exist: "&FileExists(@TempDir&"\"&$objContainer[$i]&".wsc")&@LF)
    Next
    EndFunc

    [/autoit]