Ist es mit Autoit möglich, eine GUI mit den vorhandenen Controls in eine PDF-Datei oder ein Bild z. B. Jetpeg zu exportieren?
Beiträge von Scritch
-
-
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>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <array.au3>
#include <Misc.au3>
#include <file.au3>
#include <ListViewConstants.au3>Global $objektepfad = @ScriptDir & "\Objekte\"
[/autoit] [autoit][/autoit] [autoit]
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)for $c = 0 to ubound($aObjekte) - 1
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData($List1, $aObjekte[$c] & "|") ;Inhalt für Dropdownbox aus Array wird hierein geschrieben
NextGUISetState()
[/autoit] [autoit][/autoit] [autoit]
$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$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
[/autoit]
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 -
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
-
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>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <array.au3>
#include <Misc.au3>
#include <file.au3>
#include <ListViewConstants.au3>Global $objektepfad = @ScriptDir & "\Objekte\"
[/autoit] [autoit][/autoit] [autoit]
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"$hWnd = GUICreate("Drag/Drop Controls", 1400, 900)
[/autoit] [autoit][/autoit] [autoit];~ $grundriss = GUICtrlCreatePic(@ScriptDir & "\Lunden.jpg", 10, 10, 1220, 880)
[/autoit] [autoit][/autoit] [autoit]
;~ GUICtrlSetState(-1, $GUI_DISABLE)$Objekte = GUICtrlCreateGroup("Objekte verwalten", 1230, 20, 150, 320)
[/autoit] [autoit][/autoit] [autoit]
$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)for $c = 0 to ubound($aObjekte) - 1
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData($List1, $aObjekte[$c] & "|")
Nextfor $d = 0 to ubound($aObjekte) - 1 ;Anhand der Objekte aus dem Array $aObjects werden die Werte aus den jeweiligen Sektionen gelesen
[/autoit] [autoit][/autoit] [autoit]
$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
Nextfor $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
[/autoit] [autoit][/autoit] [autoit]
$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 nichtGUISetState()
[/autoit]
$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
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
-
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? -
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>
[/autoit][autoit][/autoit][autoit]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>#Region ### START Koda GUI section ### Form=
[/autoit][autoit][/autoit][autoit]
$Form1 = GUICreate("Form1", 633, 454, 192, 114)
$Button1 = GUICtrlCreateButton("Button1", 192, 192, 211, 97, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###$vUser32Dll = DllOpen("user32.dll")
[/autoit][autoit][/autoit][autoit]While True
[/autoit]
$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
Tuts aber leider nicht
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? -
Weil hier das Subitem ja auch als Spaltenangabe fungiert:
Spoiler anzeigen
[autoit];===============================================================================
[/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 -
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? -
Ne, 3D-Bilder sollten es nicht werden. Ich gebe mich schon mit Linien zufrieden

-
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 FunktionWie 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
-
Danke, hat mir sehr geholfen. Eigentlich echt easy! Oh mann
Habe es noch bischen an meine Bedürfnisse angepasst:Spoiler anzeigen
[autoit]#include <ButtonConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <array.au3>
#include <Misc.au3>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)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$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");~ GUICtrlCreateGroup("", -99, -99, 1, 1)
[/autoit]
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 -
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>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <array.au3>
#include <Misc.au3>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)
[/autoit] [autoit][/autoit] [autoit]
$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");~ GUICtrlCreateGroup("", -99, -99, 1, 1)
[/autoit]
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
WEndEdit: Das sind keine Butons, sondern Images die ich erstelle

-
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? -
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
[/autoit]
$ausgewaehlt = GUICtrlRead($List1)
GUICtrlCreatePic (@ScriptDir & "\" & $ausgewaehlt & ".jpg", 1, 1, 0, 0) -
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?
-
Ich müsste irgendwie rausfinden, wieviele Controls es gibt... so funktionierts nicht
Spoiler anzeigen
[autoit]#include <ButtonConstants.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <array.au3>
#include <Misc.au3>$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|LAN-Buchse")
$Button1 = GUICtrlCreateButton("Hinzufügen", 1144, 256, 123, 25, $WS_GROUP)
GUICtrlSetData($Button1, "Hinzufügen")
GUICtrlSetOnEvent($Button1, "Button1")GUICtrlCreateGroup("", -99, -99, 1, 1)
[/autoit]
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 -
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
[/autoit]
$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$section = IniReadSection (@ScriptDir & "\ControlPos.ini", "Controls" )
[/autoit]
[autoit]
wie auslesen und schliesslich meinen Controlls die Koordinaten aus dem Array zuordnen$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 -
Hallo,
[autoit]
magst du mir erklären, was du mitSwitch FileExists(@ScriptDir & "\ControlPos.ini")
[/autoit]
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
EndSwitchgenau machst? Du splittest den String, die Koordinate, ja, aber wofür genau?
-
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.
-
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>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <array.au3>
#include <Misc.au3>$section = IniReadSection (@ScriptDir & "\ControlPos.ini", "Controls" )
[/autoit] [autoit][/autoit] [autoit]
$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")GUICtrlCreateGroup("", -99, -99, 1, 1)
[/autoit] [autoit][/autoit] [autoit]
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
WEndfunc writeini()
[/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
endfuncObjekte 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!
[autoit]
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:$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ß!