Erweiterter Koda-Formdesigner?

  • Hallo,

    bin auf der Suche nach etwas ähnlichem wie dem Koda Formdesigner nur mit mehr Funktionen, womit vll. auch Gerade und Kurven in einer GUI erstellt werden können. Gibs irgendwas in der Richtung?

    3 Mal editiert, zuletzt von Scritch (28. Juni 2011 um 08:40)

  • Zitat

    womit vll. auch Gerade und Kurven in einer GUI erstellt werden können.


    Was meinst du damit? Eine Art Funktionsdarstellung à la f(x)=sin(x)? Wenn ja, dann geht das nur mit GDI+, was aber für Anfänger eher nicht so einfach ist.
    Außerdem würde ich an deiner Stelle nicht mit Koda o.Ä. arbeiten. Da lernst du nämlich nichts. ;)
    Falls du dich entschließen solltes, das mit GDI+ zu machen, dann kann ich dir Ubuntus GDI+ Tutorial wärmstens empfehlen.

  • Hallo Name22,
    nein, keine Funktionsdarstellung. Das war nur ein Bsp. mit den Kurven etc.
    Um genau zu sein, wollte ich mir einen Grundriss in GDI+ erstellen. Und das halt am besten mit so einem Tool wie Koda.
    Die Sachen die ich bisher brauche an GUI, kann ich auch so. Koda habe ich dann doch eher aus Bequemlichkeit angefangen zu nutzen.

  • Hatte ich auch schon überlegt, aber ich möchte Später Objekte in der GUI hinzufügen, verschieben etc. ohne in den Quellcode zu müssen.

    Edit: Aber eine Möglichkeit wäre ja vll. auch - und die wäre wohl einfacher zu realisieren - dass ich meinetwegen vorgefertigte Bilder z. B. für Möbel, als Bild speichere und dann später einfach in die GUI ziehen kann, oder?

  • Das hier müsste deinen Vorstellungen entsprechen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Misc.au3>

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

    ;- Author: name22 (http://www.autoit.de)

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

    $hWnd = GUICreate("Drag/Drop Controls", 400, 400)
    $cDummy_Start = GUICtrlCreateDummy()
    $cButton = GUICtrlCreateButton("Button", 50, 50, 60, 25)
    $cLabel = GUICtrlCreateLabel("Label", 100, 200)
    $cEdit = GUICtrlCreateEdit("Edit", 200, 50, 180, 100)
    $cDummy_End = GUICtrlCreateDummy()
    GUISetState()

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

    $vUser32Dll = DllOpen("user32.dll")

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

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    For $i = $cDummy_Start + 1 To $cDummy_End - 1
    $aPos = ControlGetPos($hWnd, "", $i)
    IniWrite("ControlPos.ini", "Controls", $i, $aPos[0] & ":" & $aPos[1])
    Next
    DllClose($vUser32Dll)
    Exit
    Case $GUI_EVENT_PRIMARYDOWN
    $aMousePos = GUIGetCursorInfo($hWnd)
    If $aMousePos[4] Then
    $iControl = $aMousePos[4]
    $aPos = ControlGetPos($hWnd, "", $iControl)
    $iDist_X = $aMousePos[0] - $aPos[0]
    $iDist_Y = $aMousePos[1] - $aPos[1]
    While _IsPressed("01", $vUser32Dll)
    $aMousePos = GUIGetCursorInfo($hWnd)
    ControlMove($hWnd, "", $iControl, $aMousePos[0] - $iDist_X, $aMousePos[1] - $iDist_Y)
    Sleep(10)
    WEnd
    EndIf
    EndSwitch
    WEnd

    [/autoit]
  • So, muss das hier doch nochmal ins Leben zurückrufen. Wie gesagt, funktioniert derzeit fast so, wie ich es haben möchte, nur habe ich ein paar für mich größere Probleme dass es zu 100% läuft, wie es soll.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <array.au3>
    #include <Misc.au3>

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

    $section = IniReadSection (@ScriptDir & "\ControlPos.ini", "Controls" )
    $hWnd = GUICreate("Drag/Drop Controls", 1301, 844)
    $cDummy_Start = GUICtrlCreateDummy()
    $cButton = GUICtrlCreateButton("Button",$section[1][1] , $section[2][1], 60, 25);Was zwischen dummystart und dummy end steht, kann wie in einem array verarbeitet werden.
    $cLabel = GUICtrlCreateLabel("Label",$section[3][1], $section[4][1])
    $cEdit = GUICtrlCreateEdit("Edit",$section[5][1] ,$section[6][1], 180, 100)
    ;~ $tisch = GUICtrlCreatePic (@ScriptDir & "\Tisch.jpg", $section[7][1], $section[8][1], 0, 0)
    $cDummy_End = GUICtrlCreateDummy()
    $Objekte = GUICtrlCreateGroup("Objekte verwalten", 1128, 16, 153, 281)
    $List1 = GUICtrlCreateList("", 1144, 40, 121, 201)
    GUICtrlSetData($List1, "Tisch|PC|Telefon|Bodendose|LAN-Buchse")
    $Button1 = GUICtrlCreateButton("Hinzufügen", 1144, 256, 123, 25, $WS_GROUP)
    GUICtrlSetData($Button1, "Hinzufügen")
    GUICtrlSetOnEvent($Button1, "Button1")

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

    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState()
    $vUser32Dll = DllOpen("user32.dll")
    writeini()
    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    writeini()
    DllClose($vUser32Dll)
    Exit
    Case $GUI_EVENT_PRIMARYDOWN
    $aMousePos = GUIGetCursorInfo($hWnd)
    If $aMousePos[4] Then
    $iControl = $aMousePos[4]
    $aPos = ControlGetPos($hWnd, "", $iControl)
    $iDist_X = $aMousePos[0] - $aPos[0];Wenn man verschiebt, wird dort gegriffen, wo man klickt
    $iDist_Y = $aMousePos[1] - $aPos[1]
    While _IsPressed("01", $vUser32Dll)
    $aMousePos = GUIGetCursorInfo($hWnd)
    ControlMove($hWnd, "", $iControl, $aMousePos[0] - $iDist_X, $aMousePos[1] - $iDist_Y)
    Sleep(10)
    WEnd
    EndIf
    Case $Button1
    $ausgewaehlt = GUICtrlRead($List1)
    if $ausgewaehlt = "Tisch" Then
    $tisch = GUICtrlCreatePic (@ScriptDir & "\Tisch.jpg", $section[7][1], $section[8][1], 0, 0)
    EndIf
    EndSwitch
    WEnd

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

    func writeini()
    For $i = $cDummy_Start + 1 To $cDummy_End - 1
    $aPos = ControlGetPos($hWnd, "", $i)
    IniWrite("ControlPos.ini", "Controls", "x" & $i, $aPos[0])
    IniWrite("ControlPos.ini", "Controls", "y" & $i, $aPos[1])
    Next
    endfunc

    [/autoit]

    Objekte die von vornerein drinnen sind, die ich verändere werden beim schliessen so gespeichert und tauschen auch wieder da auf, wo sie sollen. soweit, sogut!
    Nun möchte ich aber ein neues Objekt hinzufügen. Funktioniert ebenfals. Ich weiss aber nicht, wie ich das denn speichern kann.
    Außerdem finde ich es nicht schön, wie ich z. B. das hier gelöst habe:

    [autoit]

    $cButton = GUICtrlCreateButton("Button",$section[1][1] , $section[2][1], 60, 25)

    [/autoit]


    Derzzeit muss man die Zuordnung der Position im Array händisch machen, was sich später schwierig gestaltet, wenn noch mehr nachträglich hinzugefügte Objekte hinzukommen. Stehe momentan völlig auf dem Schlauch... Ich brauche nichtmal ne Lösung, sondern nur einen Denkanstoß!

  • Nachher soll es so sein, dass die einzigen Controls im Script die rechts an der Seite sind. Tische, Bodendosen etc. sollen später alle nachträglich in der GUI platziert werden. Es soll halt ein Grundriss werden, wo sich öfter was ändert. Daher möchte ich das nicht IM Skript schon anlegen. Also die Objekte die nachher im Grundriss sein sollen.

  • Du vergisst, dass der Schlüssel in dieser Ini nur die ControlID des jeweiligen Controls darstellt. Du musst die Werte der Schlüssel mit StringSplit bearbeiten um den X und Y Wert zu bekommen.
    Du könntest es ja z.B. so machen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Misc.au3>

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

    ;- Author: name22 (http://www.autoit.de)

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

    $hWnd = GUICreate("Drag/Drop Controls", 400, 400)
    $cDummy_Start = GUICtrlCreateDummy()
    $cButton = GUICtrlCreateButton("Button", 50, 50, 60, 25)
    $cLabel = GUICtrlCreateLabel("Label", 100, 200)
    $cEdit = GUICtrlCreateEdit("Edit", 200, 50, 180, 100)
    $cDummy_End = GUICtrlCreateDummy()
    Switch FileExists(@ScriptDir & "\ControlPos.ini")
    Case True
    $aSection = IniReadSection(@ScriptDir & "\ControlPos.ini", "Controls")
    If @error Then ContinueCase
    For $i = 1 To $aSection[0][0]
    $aPos = StringSplit($aSection[$i][1], ":", 2)
    GUICtrlSetPos($aSection[$i][0], $aPos[0], $aPos[1])
    Next
    EndSwitch
    GUISetState()

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

    $vUser32Dll = DllOpen("user32.dll")

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

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    For $i = $cDummy_Start + 1 To $cDummy_End - 1
    $aPos = ControlGetPos($hWnd, "", $i)
    IniWrite("ControlPos.ini", "Controls", $i, $aPos[0] & ":" & $aPos[1])
    Next
    DllClose($vUser32Dll)
    Exit
    Case $GUI_EVENT_PRIMARYDOWN
    $aMousePos = GUIGetCursorInfo($hWnd)
    If $aMousePos[4] Then
    $iControl = $aMousePos[4]
    $aPos = ControlGetPos($hWnd, "", $iControl)
    $iDist_X = $aMousePos[0] - $aPos[0]
    $iDist_Y = $aMousePos[1] - $aPos[1]
    While _IsPressed("01", $vUser32Dll)
    $aMousePos = GUIGetCursorInfo($hWnd)
    ControlMove($hWnd, "", $iControl, $aMousePos[0] - $iDist_X, $aMousePos[1] - $iDist_Y)
    Sleep(10)
    WEnd
    EndIf
    EndSwitch
    WEnd

    [/autoit]
  • Hallo,
    magst du mir erklären, was du mit

    [autoit]

    Switch FileExists(@ScriptDir & "\ControlPos.ini")
    Case True
    $aSection = IniReadSection(@ScriptDir & "\ControlPos.ini", "Controls")
    If @error Then ContinueCase
    For $i = 1 To $aSection[0][0]
    $aPos = StringSplit($aSection[$i][1], ":", 2)
    GUICtrlSetPos($aSection[$i][0], $aPos[0], $aPos[1])
    Next
    EndSwitch

    [/autoit]

    genau machst? Du splittest den String, die Koordinate, ja, aber wofür genau?

  • Jaha, das habe ich ja auch schon gemacht, funktionierte bei mir ja auch. Hatte es nur anders gelöst

    [autoit]

    For $i = $cDummy_Start + 1 To $cDummy_End - 1
    $aPos = ControlGetPos($hWnd, "", $i)
    IniWrite("ControlPos.ini", "Controls", "x" & $i, $aPos[0])
    IniWrite("ControlPos.ini", "Controls", "y" & $i, $aPos[1])
    Next

    [/autoit]


    So schreibe ich x und y Koordinate in der .ini untereinander und kann sie dann auch mit

    [autoit]

    $section = IniReadSection (@ScriptDir & "\ControlPos.ini", "Controls" )

    [/autoit]


    wie auslesen und schliesslich meinen Controlls die Koordinaten aus dem Array zuordnen

    [autoit]

    $cLabel = GUICtrlCreateLabel("Label",$section[3][1], $section[4][1])

    [/autoit]

    ABER: Die Testcontrols die ich und du da jetzt drinnen haben, sollen später nicht da sein. Stelle es dir so vor, dass der leere Grundriss in der GUI angezeigt wird, also quasie nur die Mauern. Nun möchte ich einen Tisch hinzufügen, klicke rechts auf "Tisch" und dann hinzufügen. Funktioniert auch soweit. Allerdings kann ich das neue Objekt, bzw. das neue Control nicht speichern! Das ist der Knosus Knaxus!
    Ich möchte quasie das ganze Haus mit Controls einrichten und diese dann auch speichern! btw: meine ini sieht so aus:
    [Controls]
    x4=257
    y4=164
    x5=742
    y5=168
    x6=384
    y6=104
    x7=627
    y7=220

  • Das liegt daran, dass die Controls die nach dem zweiten Dummycontrol erzeugt werden eine höhere ControlID als dieses haben, und somit nicht mehr gespeichert werden (die For Schleife zählt ja nur bis zur ControlID des zweiten Dummys ;)). Du kannst die Dummys auch weglassen, ich habe die nur eingebaut, damit mann einfach beeinflussen kann ab wann und bis wohin die Positionen der Controls gespeichert werden.

  • Ich müsste irgendwie rausfinden, wieviele Controls es gibt... so funktionierts nicht :D

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <array.au3>
    #include <Misc.au3>

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

    $section = IniReadSection (@ScriptDir & "\ControlPos.ini", "Controls" )
    $hWnd = GUICreate("Drag/Drop Controls", 1301, 844)
    $Objekte = GUICtrlCreateGroup("Objekte verwalten", 1128, 16, 153, 281)
    $List1 = GUICtrlCreateList("", 1144, 40, 121, 201)
    GUICtrlSetData($List1, "Tisch|PC|Telefon|Bodendose|LAN-Buchse")
    $Button1 = GUICtrlCreateButton("Hinzufügen", 1144, 256, 123, 25, $WS_GROUP)
    GUICtrlSetData($Button1, "Hinzufügen")
    GUICtrlSetOnEvent($Button1, "Button1")

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

    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState()
    $vUser32Dll = DllOpen("user32.dll")
    ;~ writeini()
    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    For $i = 1 to 5
    $aPos = ControlGetPos($hWnd, "", $i)
    IniWrite("ControlPos.ini", "Controls", "x" & $i, $aPos[0])
    IniWrite("ControlPos.ini", "Controls", "y" & $i, $aPos[1])
    Next
    DllClose($vUser32Dll)
    Exit
    Case $GUI_EVENT_PRIMARYDOWN
    $aMousePos = GUIGetCursorInfo($hWnd)
    If $aMousePos[4] Then
    $iControl = $aMousePos[4]
    $aPos = ControlGetPos($hWnd, "", $iControl)
    $iDist_X = $aMousePos[0] - $aPos[0];Wenn man verschiebt, wird dort gegriffen, wo man klickt
    $iDist_Y = $aMousePos[1] - $aPos[1]
    While _IsPressed("01", $vUser32Dll)
    $aMousePos = GUIGetCursorInfo($hWnd)
    ControlMove($hWnd, "", $iControl, $aMousePos[0] - $iDist_X, $aMousePos[1] - $iDist_Y)
    Sleep(10)
    WEnd
    EndIf
    Case $Button1
    $ausgewaehlt = GUICtrlRead($List1)
    if $ausgewaehlt = "Tisch" Then
    $tisch = GUICtrlCreatePic (@ScriptDir & "\Tisch.jpg", $section[7][1], $section[8][1], 0, 0)
    EndIf
    EndSwitch
    WEnd

    [/autoit]