ControlID herausfinden - nicht mit au3Info.exe

  • Hallo,

    ich erstelle mit GUICtrlCreatePic ein Bild, also ein neues Control in meiner GUI. Wie ist es mir nun möglich die ID des Controls herauszufinden? Eine Möglichkeit kenne ich, die aber zu ungenau ist: Mousemove zu der Stelle wo das Control erstellt wurde und dann GUIGetCursorInfo. Aber das ist nicht das Optimum. Gibs da eine Funktion?

    3 Mal editiert, zuletzt von Scritch (4. Juli 2011 um 14:27)

  • Ja, aber ich erstelle ein Control nicht im Code sondern auf der GUI, und da weiß ich halt nicht, wie ich die ControlID herausfinden kann.

    [autoit]

    Case $Button1
    $ausgewaehlt = GUICtrlRead($List1)
    GUICtrlCreatePic (@ScriptDir & "\" & $ausgewaehlt & ".jpg", 1, 1, 0, 0)

    [/autoit]
  • Bitte was? Solange sich das Control nicht in einem externen Programm sondern innerhalb deines eigenen befindet brauchst du weder au3info noch sonstige Funktionen um an die Controlid zu kommen. Du speicherst diese einfach bei der control Erstellung in einer Variable wie oben bereits von Fresapore beschrieben. So wie ich deinen Codeschnippsel da interpretiere machst du das aber ohnehin falsch, ausser du verhinderst, dass der Button mehrfach gedrückt werden kann oder löschst zuvor das pic control wenn erneut gedrückt wird (was ohne id wohl schwer werden dürfte ^^). Normalerweise erstellt man zu Beginn alle controls und gui's ggf. auch mit Platzhaltern ohne Inhalt und ggf. auch unsichtbar und setzt später dann nur noch die Sichtbarkeit oder den Inhalt. Für createpic gibt es die Funktion guictrlsetimage() für alle anderen controls verwendet man normalerweise guictrlsetdata(). Die Sichtbarkeit, Klickbarkeit usw. regelt man mit guictrlsetstate().


    [autoit]


    guictrlsetimage()
    guictrlsetdata()
    guictrlsetstate()

    [/autoit]
  • Normalerweise mache ich es auch so, dass ich die Controls in Variablen speichere, hier ist es aber anders.
    Dummycontrols zum späteren befüllen möchte ich ehrlich gesagt nicht haben, da ich von vornerein nicht genau
    weiss, wieviele Controls ich später benötige und das ausserdem den Code unübersichtlicher macht! Hier mal mein kompletter Code (noch im Entwurf)

    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]

    dim $positionen[30][4] ;Eine Spalte später für Text - section | x cordinate | y cordinate | text für edits

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

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

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

    $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|LANBuchse")
    $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 100
    $aPos = ControlGetPos($hWnd, "", $i)
    if not @error Then
    IniWrite("ControlPos.ini", "Controls", "x" & $i, $aPos[0])
    IniWrite("ControlPos.ini", "Controls", "y" & $i, $aPos[1])
    EndIf
    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
    ;hier wird neue Position ins Array geschrieben
    EndIf
    Case $Button1
    $ausgewaehlt = GUICtrlRead($List1)
    GUICtrlCreatePic (@ScriptDir & "\" & $ausgewaehlt & ".jpg", 1, 1, 0, 0);<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<hier bin ich und möchte
    ;die ControlID von dem gerade erstellten Control haben!
    for $a = 0 to ubound($positionen) - 1
    $eintragisteinstring = StringIsAlpha ($positionen[$a][0])
    if $eintragisteinstring = 0 Then
    $positionen[$a][1] = $ausgewaehlt
    ExitLoop
    EndIf
    Next
    _ArrayDisplay($positionen)
    ;hier kann man ins array schreiben, was erstellt wurde, um das wiederum später in die ini zu schreiben
    EndSwitch
    WEnd

    [/autoit]

    Edit: Das sind keine Butons, sondern Images die ich erstelle :)

  • Ist das nicht der Hammer das AutoIT auch ControlID´s von Bildern in Variablen schreiben kann ;)

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

    Case $Button1
    $ausgewaehlt = GUICtrlRead($List1)
    $ID_DES_BILDES = GUICtrlCreatePic (@ScriptDir & "\" & $ausgewaehlt & ".jpg", 1, 1, 0, 0)
    msgbox(0,"ID-Nummer",$ID_DES_BILDES)

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

    Steht auch wunderbar hier:
    http://translation.autoit.de/onlinehilfe/fu…rlCreatePic.htm

    :)

    Gruß
    4Soldier93

  • Hier mal eine modifizierte Version mit separatem Array für die Controlid's der hinzugefügten Bilder-Items (Die Controlids werden ab array[1] gespeichert, dies muss bei Schleifen berücksichtigt werden wenn auf Klicks usw geprüft werden 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]

    dim $positionen[30][4] ;Eine Spalte später für Text - section | x cordinate | y cordinate | text für edits
    Global $aItems[1]=[0] ; Array für alle Item-ControlIDs die in der GUI platziert werden

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

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

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

    $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|LANBuchse")
    $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
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    For $i = 1 to 100
    $aPos = ControlGetPos($hWnd, "", $i)
    if not @error Then
    IniWrite("ControlPos.ini", "Controls", "x" & $i, $aPos[0])
    IniWrite("ControlPos.ini", "Controls", "y" & $i, $aPos[1])
    EndIf
    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
    ;hier wird neue Position ins Array geschrieben
    EndIf
    Case $Button1
    ; Hinweis: wenn die art des elements auch gespeichert werden muss ( $ausgewählt ??? )sollte ein 2d Array verwendet werden...
    ReDim $aItems[UBound($aItems)+1] ; macht array 1 Feld größer
    $aItems[0] += 1 ; Eintrag 0 des Arrays zeigt uns immer die Anzahl alle gespeicherten id's also items an
    $ausgewaehlt = GUICtrlRead($List1)
    $aItems[$aItems[0]]=GUICtrlCreatePic (@ScriptDir & "\" & $ausgewaehlt & ".jpg", 1, 1, 0, 0); speichert die controlid im neu erstellten Arrayfeld
    ;die ControlID von dem gerade erstellten Control haben!
    for $a = 0 to ubound($positionen) - 1
    $eintragisteinstring = StringIsAlpha ($positionen[$a][0])
    if $eintragisteinstring = 0 Then
    $positionen[$a][1] = $ausgewaehlt
    ExitLoop
    EndIf
    Next
    _ArrayDisplay($positionen)
    _ArrayDisplay($aItems,"Liste aller item Controlids")
    ;hier kann man ins array schreiben, was erstellt wurde, um das wiederum später in die ini zu schreiben
    EndSwitch

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

    if $aItems[0] > 0 Then
    for $i = 1 to $aItems[0]
    if $msg = $aItems[$i] Then
    ConsoleWrite("Du hast gerade item nr." & $i & "angeklickt." & @CRLF)
    exitloop
    endif
    #cs selbstverständlich könntest du hier dann auch wieder ein switch case einbauene um unterschiedlich
    auf die controls zu reagieren, ggf. wäre ein 2d array erforderlich wenn je nach Art des Items verschiedene aktionen erforderlich sind
    #ce
    Next
    EndIf
    WEnd

    [/autoit]


    EDIT: Code noch mit Auswertung von Klicks auf die Icons ergänzt, nun wird in die console geschrieben welches Bild angeklickt wurde.

    2 Mal editiert, zuletzt von misterspeed (27. Juni 2011 um 14:04)

  • Danke, hat mir sehr geholfen. Eigentlich echt easy! Oh mann :whistling:
    Habe es noch bischen an meine Bedürfnisse angepasst:

    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]

    dim $positionen[1][5] ;Eine Spalte später für Text - section | x cordinate | y cordinate | text für edits

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

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

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

    $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|LANBuchse")
    $Button1 = GUICtrlCreateButton("Hinzufügen", 1144, 256, 123, 25, $WS_GROUP)
    GUICtrlSetData($Button1, "Hinzufügen")

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

    ;~ GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState()
    $vUser32Dll = DllOpen("user32.dll")
    ;~ writeini()
    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _ArrayDisplay($positionen)
    For $i = 1 to 100
    $aPos = ControlGetPos($hWnd, "", $i)
    if not @error Then
    IniWrite("ControlPos.ini", "Controls", "x" & $i, $aPos[0])
    IniWrite("ControlPos.ini", "Controls", "y" & $i, $aPos[1])
    EndIf
    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)
    for $b = 1 to ubound($positionen) - 1
    $AktID = _ArraySearch($positionen, $aMousePos[4]);Schaut an welcher Position die aktuelle ID im Array steht
    if $AktID > 0 Then
    $positionen[$AktID][2] = $aMousePos[0]
    $positionen[$AktID][3] = $aMousePos[1]
    EndIf
    Next
    WEnd
    EndIf
    Case $Button1
    ReDim $positionen[UBound($positionen)+1][5]
    $ausgewaehlt = GUICtrlRead($List1)
    $positionen[ubound($positionen) - 1][0] = GUICtrlCreatePic (@ScriptDir & "\" & $ausgewaehlt & ".jpg", 1, 1, 0, 0)
    $positionen[ubound($positionen)- 1][1] = $ausgewaehlt
    EndSwitch
    WEnd

    [/autoit]
  • Vielleicht kannst du das dann ja auch unter Scripte posten wenn es mal fertig ist. Schaut nach einer Art Raumplaner aus, finde ich interessant.

    Erweiterungswüsche von meiner Seite wären noch:

    - Möglichkeit die Raumgröße in Meter anzugeben, ggf. auch Zwischenwände, Türen usw für komplette Wohnungen
    - Maßstab, Raster und Lineal
    - In der Größe änderbare items
    - Export / Druck Funktion

    Wie dem auch sei freut mich, dass ich dir helfen konnte.
    PS: Dein Array hat btw eine Spalte zuviel, Absicht oder versehen?

  • [autoit]


    Opt("GUIOnEventMode", 1)

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

    GUICreate("test", 250, 150)
    GUISetOnEvent(-3, "_SpecialEvents")
    $button1 = GUICtrlCreateButton("Button1", 50, 50)
    GUICtrlSetOnEvent(-1, "_SpecialEvents")
    $button2 = GUICtrlCreateButton("Button2", 100, 100)
    GUICtrlSetOnEvent(-1, "_SpecialEvents")
    $button3 = GUICtrlCreateButton("Button3", 150, 50)
    GUICtrlSetOnEvent(-1, "_SpecialEvents")

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

    GUISetState(@SW_SHOW)

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

    While Sleep(1000)
    WEnd

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

    Func _SpecialEvents()
    Switch @GUI_CtrlId
    Case -3
    Exit
    Case $button1
    MsgBox(262144 + 64, "gedrückt...", "ID = " & @GUI_CTRLID) ;i zur abfrage der @GUI_CTRLID
    Case $button2
    MsgBox(262144 + 64, "gedrückt...", "ID = " & @GUI_CTRLID) ;i zur abfrage der @GUI_CTRLID
    Case $button3
    MsgBox(262144 + 64, "gedrückt...", "ID = " & @GUI_CTRLID) ;i zur abfrage der @GUI_CTRLID
    EndSwitch
    EndFunc ;==>SpecialEvents

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

    ;i Bitteschön! ;)

    [/autoit]
  • Vielleicht kannst du das dann ja auch unter Scripte posten wenn es mal fertig ist. Schaut nach einer Art Raumplaner aus, finde ich interessant.

    Erweiterungswüsche von meiner Seite wären noch:

    - Möglichkeit die Raumgröße in Meter anzugeben, ggf. auch Zwischenwände, Türen usw für komplette Wohnungen
    - Maßstab, Raster und Lineal
    - In der Größe änderbare items
    - Export / Druck Funktion

    Wie dem auch sei freut mich, dass ich dir helfen konnte.
    PS: Dein Array hat btw eine Spalte zuviel, Absicht oder versehen?


    Mal schauen, ob ich es noch soweit fortführ, ob ich die Kompetenz dafür besitze ;) Wollte das ganze ja eig. in GDI+ machen, aber das wäre ein zu großes Stück Arbeit gewesen, da ich mit GDI+ nie was gemacht habe. Du hast Recht, das wird ein Raumplaner. Ursprünglich war es jetzt hierfür gedacht, dass ich Wände, Türen etc. Extern zeichne, einscanne und als Hintergrund hinterlege und dann das Inventar rein. Etwas banal, aber was besseres fällt mir derzeit nicht ein :( Hast du da sonst eine Idee?
    Ja, das ist Absicht. In die 5. Spalte kommt nachher Text von Labeln für die Beschriftung irgendwelcher Dinge ;)

  • Habe mit meinem Script mal etwas weitergemacht. Allerdings stehe ich wieder vor einem Problem, schaue stundenlang auf Script rum und finde den blöden Fehler nicht!
    Ich glaube die Natur meines Fehlers liegt in Zeile 109, wo ich das Array durchsuche.

    Spoiler anzeigen
    [autoit]

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

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

    Global $objektepfad = @ScriptDir & "\Objekte\"
    dim $aObjekte[5] = ["Tisch", "PC", "Telefon", "Bodendose", "LANBuchse"]
    dim $positionen[1][4] ;Eine Spalte später für Text - section | x cordinate | y cordinate | text für edits
    dim $positionenBackup[1][4];Idee: Änderungen werden direkt in $positionen geschrieben und auch in die .ini. Wenn man die Änderungen gespeichert werden sollen, passiert bei "ja" nichts. bei nein werden die daten aus $positionenbackup in die .ini geschrieben, somit hat man den alten stand wieder.
    global $positionenspeicher = @scriptdir & "\positionen.ini"

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

    $hWnd = GUICreate("Drag/Drop Controls", 1400, 900)

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

    ;~ $grundriss = GUICtrlCreatePic(@ScriptDir & "\Lunden.jpg", 10, 10, 1220, 880)
    ;~ GUICtrlSetState(-1, $GUI_DISABLE)

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

    $Objekte = GUICtrlCreateGroup("Objekte verwalten", 1230, 20, 150, 320)
    $List1 = GUICtrlCreateList("", 1240, 50, 130, 250)
    $label1 = GUICtrlCreateLabel("lala", 1, 880, 50, 20)
    $Button1 = GUICtrlCreateButton("Hinzufügen", 1240, 300, 130, 25, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("positionen", 1240, 500, 130, 25, $WS_GROUP)
    $Button3 = GUICtrlCreateButton("positionenbackup", 1240, 540, 130, 25, $WS_GROUP)
    GUICtrlSetData($Button1, "Hinzufügen")
    ;~ $lisview1 = GUICtrlCreateListView("ID|Name |X-Koord. |YKoord.|Text ", 1100, 500, 300, 400)

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

    for $c = 0 to ubound($aObjekte) - 1
    GUICtrlSetData($List1, $aObjekte[$c] & "|")
    Next

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

    for $d = 0 to ubound($aObjekte) - 1 ;Anhand der Objekte aus dem Array $aObjects werden die Werte aus den jeweiligen Sektionen gelesen
    $section = IniReadSection (@ScriptDir & "\positionen.ini", $aObjekte[$d]) ;Hier werden die Positionen aus der .ini gelesen und in $positionen gespeichert, wo später vll. noch Objekte hinzukommen
    for $e = 1 to ubound($section) - 1
    $coords = stringsplit($section[$e][1], ":")
    $xcoord = $coords[1]
    $ycoord = $coords[2]
    ReDim $positionen[UBound($positionen)+1][4]
    $positionen[ubound($positionen) - 1][0] = GUICtrlCreatePic ($objektepfad & $aObjekte[$d] & ".jpg", $xcoord, $ycoord, 0, 0)
    $positionen[ubound($positionen)- 1][1] = $aObjekte[$d]
    $positionen[ubound($positionen)- 1][2] = $xcoord
    $positionen[ubound($positionen)- 1][3] = $ycoord
    Next
    Next

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

    for $f = 0 to ubound($positionen) - 1 ;Erstellt das Backuparray. Da Änderungen gleich in die .ini geschrieben werden man sich aber dazu entscheidet die Änderungen nicht haben zu wollen
    $positionenbackup[$f][0] = $positionen[$f][0] ;kann der alte Stand wiederhergestellt werden, da sich dieses Array und die darin befindlichen Inhalte aus der .ini nicht geändert haben
    $positionenbackup[$f][1] = $positionen[$f][1]
    $positionenbackup[$f][2] = $positionen[$f][2]
    $positionenbackup[$f][3] = $positionen[$f][3]
    ;~ $positionenbackup[$f][4] = $positionen[$f][4]
    ReDim $positionenbackup[UBound($positionenbackup)+1][4]
    Next
    FileDelete($positionenspeicher);.ini wird später neu geschrieben jenachdem ob man änderungen speichern möchte, oder nicht

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

    GUISetState()
    $vUser32Dll = DllOpen("user32.dll")
    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    $msg = MsgBox(4, "Änderungen speichern", "Sollen die Änderungen gespeichert werden?")
    if $msg = 7 Then
    for $c = 0 to ubound($positionen) - 1
    IniWrite("positionen.ini", $positionenbackup[$c][1], $positionenbackup[$c][0], $positionenbackup[$c][2] & ":" & $positionenbackup[$c][3])
    Next
    else
    for $c = 0 to ubound($positionen) - 1
    IniWrite("positionen.ini", $positionen[$c][1], $positionen[$c][0], $positionen[$c][2] & ":" & $positionen[$c][3])
    Next
    EndIf
    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)
    if $aMousePos[0] < 1230 then;and not $aMousePos[4] = $grundriss Then ;damit man alles was rechts ist in der groupbox nicht verschieben kann
    ControlMove($hWnd, "", $iControl, $aMousePos[0] - $iDist_X, $aMousePos[1] - $iDist_Y)
    Sleep(10)
    for $b = 0 to ubound($positionen) - 1
    $controlPos = ControlGetPos($hWnd, "", $aMousePos[4])
    $AktID = _ArraySearch($positionen, $aMousePos[4], 0, ubound($positionen), 0, 0, 1, 0) ;Schaut an welcher Position die aktuelle ID (Worüber sich der Mauszeiger befindet) im Array steht
    if $AktID > -1 Then
    $positionen[$AktID][2] = $controlPos[0] ;Es wird nach der aktuellen ID gesucht.(worüber sich der Mauszeiger befindet). Dann werden die Koordinaten des Controls (nicht des Mauszeigers) gelesen und in das Array geschrieben
    $positionen[$AktID][3] = $controlPos[1]
    EndIf
    Next
    EndIf
    WEnd
    EndIf
    Case $Button1

    $ausgewaehlt = GUICtrlRead($List1)
    $positionen[ubound($positionen) - 1][0] = GUICtrlCreatePic ($objektepfad & $ausgewaehlt & ".jpg", 1, 1, 0, 0);ID des Controls was erstellt wurde wird in Array geschrieben
    $positionen[ubound($positionen)- 1][1] = $ausgewaehlt ;Name des Controls was erstellt wurde wird in Array geschrieben
    ReDim $positionen[UBound($positionen)+1][4]
    Case $GUI_EVENT_SECONDARYUP
    $aMousePos = GUIGetCursorInfo($hWnd)
    if $aMousePos[0] < 1230 Then;damit man alles was rechts ist in der groupbox nicht löschen kann
    $PosDelete = _ArraySearch($positionen, $aMousePos[4], 0, ubound($positionen), 0, 0, 1, 0)
    GUICtrlDelete($aMousePos[4])
    _ArrayDelete($positionen, $PosDelete)
    sleep(200)
    ;~ ReDim $positionen[UBound($positionen) - 1][4]
    EndIf
    Case $Button2
    _ArrayDisplay($positionen)
    case $Button3
    _ArrayDisplay($positionenBackup)
    EndSwitch
    WEnd

    [/autoit]


    Wenn ich mehrere Objekte auf der GUI habe, sie speichere, wieder aufrufe und dann ein Objekt (Control) lösche, soll das auch aus dem Array gelöscht werden. Es verschwindet aber oft ein Objekt, das gar nicht gelöscht werden sollte. Manchmal sogar 2 gleichzeitig (Wenn ich gespeichert und geschlossen habe). Bin mir sicher, dass ein Blick von euch Experten genügt :thumbup:

  • Hab jetzt keine Lust mir das genauer anzusehn, aber du hast schon unabhängig von der Control Löschung einige Fehler/Probleme.
    Das fängt schonmal mit deinen ungewönlichen Variablennamen für die Schleifenzähler an. Ich finde es sehr verwirrend, dass du hier Buchstaben von a-f verwendest. Das mag zwar vielleicht im Endeffekt trotzdem korrekt sein, aber es verwirrt ein wenig. Für Schleifenzähler nimmt man normal immer $i und bei verschachtelten Schleifen ist ein weiterer Variablenname notwendig. Da diese Variablen sowieso immer beim Beginn einer neuen for Schleife auf 0 gesetzt werden kann man diese auch gefahrlos mehrfach nutzen. Gut das ist kein Fehler, es verwirrt nur ein wenig.

    Nun zu deiner ini Geschichte. Da passt irgendwo was nicht, denn selbst wenn man keine Objekte löscht gehen Teils Objekte verloren wenn man mehrfach speichert und die Positionen ändert. Der Inhalt des Arrays ist auch seltsam, du hast da irgendwie immer noch eine Zusatzzeile ohne Beschreibung nur mit Koordinaten. Wo die herkommt und wozu die gut ist hab ich beim überfliegen jetzt nicht gesehen. Du prüfst btw auch nirgendwo ob alle Bilder vorhanden sind, oder eine ini besteht. Da du weder Bilder noch ini mitlieferst solltest du hier zumindestens bei der ini für eine fehlerfreie Erstellung sorgen wenn keine vorhanden ist. Auch wenn Bilder fehlen sollte eine Info da sein wo diese zufinden sein müssen gefolgt von einem exit.

    Da du bereits beim speichern der Positionen einen Fehler hast schau ich mir die Löschung erst garnicht mehr an. Wäre sinnfrei dort jetzt nach Fehlern zu suchen.

    Einmal editiert, zuletzt von misterspeed (4. Juli 2011 um 16:32)

  • Das größere Problem habe ich gelöst, dass Objekte plötzlich immer verschwunden sind. Das lag an dem ReDim in Zeile 41. Habe ich weiter nach unten gesetzt. Warum der Blindeintrag nur mit Koordinaten gemacht wird, weiss ich noch nicht, aber da komme ich auch noch hinter!