1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Scritch

Beiträge von Scritch

  • GUI in .pdf oder .jpg exportieren

    • Scritch
    • 6. Juli 2011 um 09:39

    Ist es mit Autoit möglich, eine GUI mit den vorhandenen Controls in eine PDF-Datei oder ein Bild z. B. Jetpeg zu exportieren?

  • Bild in Hintergrund/Vordergrund

    • Scritch
    • 6. Juli 2011 um 09:32

    Hilft mir leider nicht. Habe mal paar Screenshots hochgeladen. Auf dem ersten Bild sieht man wie es nach dem Ladevorgang des Grundrisses und der Objekte aussieht. Das Bild wird erst erstellt (siehe Code Zeile 101) und dann die Objekte (Zeile 111 und 114). Die Objekte kann man da aber noch nicht sehen. Nimmt man jetzt z. B. einen weiteren Tisch und wischt mit diesem über die Objekte, werden sie sichtbar. Den gleichen Effekt hat auch, wenn man das Fenster kurz minimiert und wieder aufruft. Dann sind die Objekte auch ÜBER dem Grundriss.

    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[9] = ["Tisch waagerecht", "Tisch senkrecht", "PC", "Telefon", "Bodendose", "LAN-Buchse", "Label", "GAA", "KAD"]
    dim $positionen[1][5]
    dim $positionenBackup[1][5] ;Hier wird beim Laden des Skriptes der Inhalt der .ini reingeschrieben und nicht verändert.
    global $positionenspeicher = @scriptdir & "\positionen.ini" ;Sollen Änderungen nicht gespeichert werden, wird der Inhalt aus dem Backuparray geschrieben.
    $hWnd = GUICreate("Drag/Drop Controls", 1400, 900)
    $Objekte = GUICtrlCreateGroup("Objekte verwalten", 1230, 116, 150, 320)
    $List1 = GUICtrlCreateList("", 1240, 146, 130, 240)
    $Button1 = GUICtrlCreateButton("Hinzufügen", 1240, 396, 130, 25, $WS_GROUP)
    $GSladen = GUICtrlCreateButton("Laden", 1248, 64, 115, 25, $WS_GROUP)
    $geschaeftstellen = GUICtrlCreateGroup("Geschäftsstelle auswählen", 1232, 5, 150, 100)
    $grundrissgroup = GUICtrlCreateGroup("Grundriss", 5, 5, 1220, 890)
    $listegeschaeftsstellen = GUICtrlCreateCombo("GS auswählen", 1248, 32, 113, 25)
    GUICtrlSetData($listegeschaeftsstellen, "Auswahl1|Auswahl2", "Drucker auswählen")
    guictrlsetstate($List1, $GUI_DISABLE)
    guictrlsetstate($Button1, $GUI_DISABLE)
    GUISetState(@SW_SHOW)

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

    for $c = 0 to ubound($aObjekte) - 1
    GUICtrlSetData($List1, $aObjekte[$c] & "|") ;Inhalt für Dropdownbox aus Array wird hierein geschrieben
    Next

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

    GUISetState()
    $vUser32Dll = DllOpen("user32.dll")
    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    $GSauswahl = GUICtrlRead($listegeschaeftsstellen)
    $msg = MsgBox(4, "Änderungen speichern", "Sollen die Änderungen gespeichert werden?")
    if $msg = 7 Then
    for $c = 0 to ubound($positionenbackup) - 1 ;Änderungen nicht speichern: Backuparray wird in .ini geschrieben
    IniWrite(@ScriptDir & "\" & $GSauswahl & ".ini", $positionenbackup[$c][1], $positionenbackup[$c][0], $positionenbackup[$c][2] & ":" & $positionenbackup[$c][3] & ":" & $positionenbackup[$c][4])
    Next
    else
    for $c = 0 to ubound($positionen) - 1 ;Änderungen speichern: Normales Array wird in .ini geschrieben
    IniWrite(@ScriptDir & "\" & $GSauswahl & ".ini", $positionen[$c][1], $positionen[$c][0], $positionen[$c][2] & ":" & $positionen[$c][3] & ":" & $positionen[$c][4])
    Next
    EndIf
    DllClose($vUser32Dll)
    Exit
    Case $GUI_EVENT_PRIMARYDOWN ;Wenn linke Maustaste gedrückt wird...
    $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 ;damit man alles was rechts ist in der groupbox nicht verschieben kann
    ControlMove($hWnd, "", $iControl, $aMousePos[0] - $iDist_X, $aMousePos[1] - $iDist_Y) ; Bewegt das Control zu der Position wo sich der Mauszeiger befindet
    Sleep(10)
    $controlPos = ControlGetPos($hWnd, "", $aMousePos[4]);<<<<<<<weitermachen
    for $b = 0 to ubound($positionen) - 1

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

    $AktID = _ArraySearch($positionen, $aMousePos[4], 0, 0, 0, 0, 1, 0) ;Schaut an welcher Position die aktuelle ID (Worüber sich der Mauszeiger befindet) im Array steht
    if not @error Then
    $positionen[$AktID][2] = $controlPos[0] ;Es wird nach der aktuellen ID gesucht.(worüber sich der Mauszeiger befindet).
    $positionen[$AktID][3] = $controlPos[1] ;Dann werden die Koordinaten des Controls (nicht des Mauszeigers) gelesen und in das Array geschrieben
    EndIf
    Next
    EndIf
    WEnd
    EndIf
    Case $Button1
    $ausgewaehlt = GUICtrlRead($List1)
    if $ausgewaehlt = "Label" Then
    $positionen[ubound($positionen) - 1][4] = InputBox("Beschriftung des Labels", "Bitte geben Sie den Inhalt des Labels ein:")
    $positionen[ubound($positionen) - 1][0] = GUICtrlCreateLabel($positionen[ubound($positionen) - 1][4], 1110, 20, 50, 15) ;Erstellt ein Label mit der vorherig ausgewählten Beschriftung
    GUICtrlSetBkColor(-1, 0xFFFFFF) ;Setzt Hintergrundfarbe des Labels auf weiß
    Else
    $positionen[ubound($positionen) - 1][0] = GUICtrlCreatePic($objektepfad & $ausgewaehlt & ".jpg", 1100, 20, 0, 0, $GUI_ONTOP) ;Bild wird erstellt, wenn nicht "Label" ausgewählt wurde. Die ID wird ins Array geschrieben
    EndIf
    $positionen[ubound($positionen) - 1][1] = $ausgewaehlt ;Name des Controls was erstellt wurde wird in Array geschrieben
    ReDim $positionen[UBound($positionen)+1][5] ;Neue Dimensionierung des Array, weil ein Eintrag hinzugekommen ist
    Case $GUI_EVENT_SECONDARYUP ;Wenn Rechtsklick
    $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, 0, 0, 0, 1, 0) ;Schaut an welcher Stelle im Array sich die ID befindet
    if not @error Then ;Wurde die ID gefunden, dann...
    GUICtrlDelete($aMousePos[4]) ;1...wird das Control mit der entsprechenden ID gelöscht
    _ArrayDelete($positionen, $PosDelete) ;2...wird der Eintrag aus Array gelöscht
    sleep(100)
    EndIf
    EndIf
    case $GSladen ;Wird der "Laden"-Button gedrück
    $GSauswahl = GUICtrlRead($listegeschaeftsstellen) ;Aktiviert Liste und Button, dass man diese benutzen kann (zuvor waren sie ausgegraut)
    guictrlsetstate($List1, $GUI_ENABLE)
    guictrlsetstate($Button1, $GUI_ENABLE)
    $grundriss = GUICtrlCreatePic(@ScriptDir & "\Grundrisse\" & $GSauswahl & ".jpg", 20, 25, 0, 0) ;Erstellt Bild des Grundrisses
    GUICtrlSetState(-1, $gui_disable) ;Und soll diesen eigentlich disablen, funktioniert aber noch nicht. Bild muss in Hintergrund!
    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 & "\" & $GSauswahl & ".ini", $aObjekte[$d]) ;Hier werden die Positionen aus der .ini gelesen und in $positionen
    for $e = 1 to ubound($section) - 1 ;gespeichert, wo später vll. noch Objekte hinzukommen
    $coords = stringsplit($section[$e][1], ":") ;Der Wert aus .ini wird in 3 Teile gesplittet:
    $xcoord = $coords[1] ;1: X-Koordinate
    $ycoord = $coords[2] ;2: Y-Koordinate
    $labeltext = $coords[3] ;3: Inhalt des Labels
    if $aObjekte[$d] = "Label" Then ;Erstellt Label bzw...
    $positionen[ubound($positionen)- 1][0] = GUICtrlCreateLabel($labeltext, $xcoord, $ycoord, 50, 15)
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    Else
    $positionen[ubound($positionen) - 1][0] = GUICtrlCreatePic ($objektepfad & $aObjekte[$d] & ".jpg", $xcoord, $ycoord, 0, 0, $GUI_ONTOP) ;...Bilder an der Position, die aus .ini ausgelesen wurde
    EndIf ;ID's der Conrols werden in Array geschrieben
    $positionen[ubound($positionen)- 1][1] = $aObjekte[$d] ;Objektname, Koordinaten, Labeltext werden ebenfals ins Array geschrieben
    $positionen[ubound($positionen)- 1][2] = $xcoord
    $positionen[ubound($positionen)- 1][3] = $ycoord
    $positionen[ubound($positionen)- 1][4] = $labeltext
    ReDim $positionen[UBound($positionen)+1][5] ;Redimnesioniert, da es pro Eintrag größer wird, das Array
    Next
    Next
    for $f = 0 to ubound($positionen) - 1 ;Erstellt das Backuparray mit identischen Inhalten aus $positionen
    $positionenbackup[$f][0] = $positionen[$f][0] ;Hat man Änderungen vorgenommen, können diese verworfen werden, indem die Inhalte
    $positionenbackup[$f][1] = $positionen[$f][1] ;aus dem backuparray in die .ini geschrieben werden
    $positionenbackup[$f][2] = $positionen[$f][2]
    $positionenbackup[$f][3] = $positionen[$f][3]
    $positionenbackup[$f][4] = $positionen[$f][4]
    ReDim $positionenbackup[UBound($positionenbackup)+1][5]
    Next
    FileDelete(@ScriptDir & "\" & $GSauswahl & ".ini") ;.ini muss nach jedem Einlesen in das Array gelöscht werden. Behält man die .ini bei,
    EndSwitch ;kann es bei Änderungen zu Geistereinträgen kommen
    WEnd

    [/autoit]

    Dateien

    falsch.jpg 46,28 kB – 0 Downloads richtig.jpg 58,95 kB – 0 Downloads
  • Bild in Hintergrund/Vordergrund

    • Scritch
    • 5. Juli 2011 um 11:43

    Hallo,
    ich habe mehrere Bilder in meinem Script, die auch übereinander angezeigt werden sollen (z. B. ein Telefon was auf einem Tisch steht).
    Wie ist es mir nun möglich, dass diese Bilder beim Scriptaufruf auch korrekt angezeigt werden? Habe schon gelesen, dass man dass untere Bild mit GUICtrlSetState(-1, $gui_disable) disablen soll und die Bilder die nach vorn sollen, einen Parameter mit auf den Weg geben: $GUI_ONTOP
    Hat aber leider nicht den gewünschten Efekt :(

  • ControlID herausfinden - nicht mit au3Info.exe

    • Scritch
    • 4. Juli 2011 um 14:25

    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:

  • Prüfen auf Rechtsklick mit _isPressed

    • Scritch
    • 1. Juli 2011 um 08:59

    Weil ich nicht wusste, dass es sowas gibt :pinch: Danke.
    Aber vom Prinzip und Verständnis her zu meiner Lösung nochmal: Wieso funktioniert das nicht?
    Gibs eine Übersicht mit diesen ganzen Eventhandlern?

  • Prüfen auf Rechtsklick mit _isPressed

    • Scritch
    • 1. Juli 2011 um 08:37

    Hallo,

    ich habe eine GUI und möchte prüfen, ob die rechte Maustaste gedrückt wurde um dann darauf reagieren. Ich dachte mir eigentlich dass es folgendermaßen geht:

    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 454, 192, 114)
    $Button1 = GUICtrlCreateButton("Button1", 192, 192, 211, 97, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $vUser32Dll = DllOpen("user32.dll")

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

    While True
    $msg = GUIGetMsg()
    switch $msg
    case $Button1
    MsgBox(1, "Button1", "Button1 wurde gedrückt")
    case _ispressed("03", $vUser32Dll)
    MsgBox(1, "Rechte Maustaste", "Du hast die rechte Maustaste gedrückt")
    case $GUI_EVENT_CLOSE
    Exit
    DllClose($vUser32Dll)
    EndSwitch
    WEnd

    [/autoit]


    Tuts aber leider nicht :whistling: Die Aktion die ausgeführt werden soll, führt er immer im jeden Durchgang der Schleife aus! Wo liegt mein Fehler?
    Wenn ich _isPressed(..) = True schreibe, bringt das genauso wenig. Oder verträgt sich das mit dem Switch/Case nicht?

  • _ArraySearch - habe ich da was falsch verstanden?

    • Scritch
    • 30. Juni 2011 um 13:05

    Weil hier das Subitem ja auch als Spaltenangabe fungiert:

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; Beispiel 2 (verwendet ein 2D Array)
    ;===============================================================================
    Local $avArray[6][2] = [ _
    ["String0", "SubString0"], _
    ["String1", "SubString1"], _
    ["String2", "SubString2"], _
    ["String3", "SubString3"], _
    ["String4", "SubString4"], _
    ["String5", "SubString5"]]

    _ArrayDisplay($avArray, "$avArray")

    $sSearch = InputBox("_ArraySearch() Demo", "Welcher String soll gesucht werden?")
    If @error Then Exit

    $sColumn = InputBox("_ArraySearch() Demo", "Welche Spalte soll durchsucht werden?")
    If @error Then Exit
    $sColumn = Int($sColumn)

    $iIndex = _ArraySearch($avArray, $sSearch, 0, 0, 0, 1, 1, $sColumn)
    If @error Then
    MsgBox(0, "Nicht gefunden", '"' & $sSearch & '" wurde nicht in der Spalte ' & $sColumn & ' gefunden.')
    Else
    MsgBox(0, "Gefunden", '"' & $sSearch & '" wurde im Array an Stelle ' & $iIndex & ' in der Spalte ' & $sColumn & ' gefunden.')
    EndIf

    [/autoit]
  • _ArraySearch - habe ich da was falsch verstanden?

    • Scritch
    • 30. Juni 2011 um 12:43

    Moin,

    hänge wieder mit der doofen Funktion _ArraySearch fest. Die Hilfe besagt folgendes:

    [autoit]

    _ArraySearch(Const ByRef $avArray, $vValue [, $iStart = 0 [, $iEnd = 0 [, $iCase = 0 [, $iPartial = 0 [, $iForward = 1 [, $iSubItem = -1]]]]]])

    [/autoit]


    wenn ich bei $iSubitem 0 angebe, wird doch normalerweise in einem 2d-Array nur die erste Spalte (Spalte 0) dursucht, richtig? Oder bin ich ganz und gar plemplem?

  • ControlID herausfinden - nicht mit au3Info.exe

    • Scritch
    • 28. Juni 2011 um 08:28

    Ne, 3D-Bilder sollten es nicht werden. Ich gebe mich schon mit Linien zufrieden :)

  • ControlID herausfinden - nicht mit au3Info.exe

    • Scritch
    • 28. Juni 2011 um 08:09
    Zitat von misterspeed

    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 ;)

  • ControlID herausfinden - nicht mit au3Info.exe

    • Scritch
    • 27. Juni 2011 um 15:51

    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]
  • ControlID herausfinden - nicht mit au3Info.exe

    • Scritch
    • 27. Juni 2011 um 12:51

    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 :)

  • Control Id anhand der Position ermitteln

    • Scritch
    • 27. Juni 2011 um 12:09
    Zitat von misterspeed

    Wenn du sehr viele Buttons hast und nicht jedem eine eigene Variable zuweisen willst benutz ein Array.


    Habe gerade das gleiche Problem und das wäre echt das Optimum. Aber wie stelle ich es an bei der Erstellung des Controls die ID in ein Array zu schreiben?

  • ControlID herausfinden - nicht mit au3Info.exe

    • Scritch
    • 27. Juni 2011 um 11:11

    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]
  • ControlID herausfinden - nicht mit au3Info.exe

    • Scritch
    • 27. Juni 2011 um 10:55

    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?

  • Erweiterter Koda-Formdesigner?

    • Scritch
    • 23. Juni 2011 um 18:14

    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]
  • Erweiterter Koda-Formdesigner?

    • Scritch
    • 23. Juni 2011 um 17:45

    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

  • Erweiterter Koda-Formdesigner?

    • Scritch
    • 23. Juni 2011 um 17:33

    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?

  • Erweiterter Koda-Formdesigner?

    • Scritch
    • 23. Juni 2011 um 16:06

    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.

  • Erweiterter Koda-Formdesigner?

    • Scritch
    • 23. Juni 2011 um 11:50

    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ß!

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™