Klasse gemacht!
Am besten gefallen mir "ColorBalls" und "PrimeFactorization".
Allerdings sind die Kreise nur auf meinem Hauptmonitor (Auflösung: 1920 x 1200 px) auch wirklich kreisrund. Bei meinem Zweitmonitor (Auflösung: 1600 x 1200 px) sehen die Kreise eher wie Eier (Ellipsen) aus.
Kann man das noch anpassen? Oder ist das zu aufwendig?
Beiträge von Oscar
-
-
Klar geht das!

So:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>Example()
[/autoit] [autoit][/autoit] [autoit]Func Example()
[/autoit] [autoit][/autoit] [autoit]
Local $MESSAGE = "The following buttons have been clicked"
Local $add, $clear, $mylist, $close, $msgGUICreate("My GUI list") ; will create a dialog box that when displayed is centered
[/autoit] [autoit][/autoit] [autoit]$add = GUICtrlCreateButton("Add", 32, 32, 75, 25)
[/autoit] [autoit][/autoit] [autoit]
$clear = GUICtrlCreateButton("Clear", 32, 72, 75, 25)
$mylist = GUICtrlCreateList("buttons that have been clicked", 140, 32, 240, 97)
GUICtrlSetLimit(-1, 200) ; to limit horizontal scrolling
GUICtrlSetData(-1, $MESSAGE)
$Context = GUICtrlCreateContextMenu($mylist)
$Copy2Clip = GUICtrlCreateMenuItem('Copy2Clip', $Context)
$close = GUICtrlCreateButton("my closing button", 64, 160, 175, 25)GUISetState()
[/autoit] [autoit][/autoit] [autoit]$msg = 0
[/autoit] [autoit][/autoit] [autoit]
While $msg <> $GUI_EVENT_CLOSE
$msg = GUIGetMsg()Select
[/autoit]
Case $msg = $Copy2Clip
ClipPut(GUICtrlRead($mylist))
Case $msg = $add
GUICtrlSetData($mylist, "You clicked button No1|")
Case $msg = $clear
GUICtrlSetData($mylist, "")
Case $msg = $close
MsgBox(0, "", "the closing button has been clicked", 2)
Exit
EndSelect
WEnd
EndFunc ;==>Example -
Ich habe das Script nochmal überarbeitet. Jetzt wird die Bewertung in einer Inidatei abgespeichert. Und man braucht nicht mehr die Icons downloaden. Das Script reicht aus. Die Binärdaten der Icons befinden sich im Script und werden zur Laufzeit extrahiert. Außerdem habe ich das Script mal kommentiert.
-
Die Rückgabe von Run ist auch die PID des gestarteten Prozesses.
Wenn Du die Konsolenausgabe benötigst, musst Du diese mit StdoutRead auslesen (siehe auch das Beispiel zu dem Befehl). -
Der Grund ist der, dass man bei GuiCreate die inneren Abmessungen angibt. WinMove benutzt aber die äußeren Abmessungen des Fensters.
Du könntest Dir damit behelfen, diese Unterschiede mit WinGetPos und WinGetClientSize auszulesen und die Differenz der Werte zu der gewünschten Größe zu addieren.
Das sieht dann ungefähr so aus:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>Global $hGui = GUICreate('Test', 480, 160)
[/autoit] [autoit][/autoit] [autoit]
GUISetState()Sleep(1000)
[/autoit] [autoit][/autoit] [autoit]
_WinMoveClientSize($hGui, 50, 50, 640, 480)
$aWinSize = WinGetClientSize($hGui)
_ArrayDisplay($aWinSize, 'Auflösung innen:')Do
[/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = -3Func _WinMoveClientSize($hGui, $iX, $iY, $iWidth, $iHeight)
[/autoit]
Local $aWinPos = WinGetPos($hGui)
If @error Then Return SetError(@error, 0, '')
Local $aClientSize = WinGetClientSize($hGui)
If @error Then Return SetError(@error, 0, '')
Local $iNewWidth = $iWidth + $aWinPos[2] - $aClientSize[0]
Local $iNewHeight = $iHeight + $aWinPos[3] - $aClientSize[1]
WinMove($hGui, '', $iX, $iY, $iNewWidth, $iNewHeight)
Return SetError(@error, 0, '')
EndFunc -
Stimmt, das war zu kompliziert gedacht.
Aber ganz so einfach, wie bei Dir ist es dann doch nicht, weil bei Dir bereits das überfahren mit der Maus die Anzeige dauerhaft verändert.
Das soll aber erst beim Mausklick passieren. Beim überfahren soll die Anzeige nur temporär die Sterne anzeigen.
Ich hab's jetzt aber mal in Post#1 geändert. Danke für den Verbesserungsvorschlag! -
Hier ist ein Beispiel mit mehreren Timern: Multi-Timer
-
Stimmt! Das passiert wahrscheinlich, weil die GUI bereits gelöscht wird, während die Funktion noch läuft (AdlibRegister)!?
[autoit]
Obwohl ich dachte, dass Adlib nicht wirklich parallel läuft!?
Naja, einIf @error Then Return
[/autoit]
nach ControlGetPos beseitigt das Problem. Habe es oben eingefügt. Danke, CheaterDieter!
-
Hier mal ein Beispielscript, wie man eine Bewertung mit Sternen in das eigene Programm einbauen kann.
Die Bewertung läßt sich mit der Maus ändern. Beim bewegen der Maus über die Sterne werden diese entsprechend angezeigt.
Die beiden Icons (als Binärdaten im Script) sind von findicons.com und laut Beschreibung "Freeware". Diese beiden Icons werden automatisch im Unterverzeichnis ("icons") des Scriptverzeichnisses erstellt.Ich habe das Script mal komplett kommentiert, sodass es auch für Anfänger leichter zu verstehen ist.
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>Opt('GUIOnEventMode', 1) ; den OnEventMode einschalten
[/autoit] [autoit][/autoit] [autoit]Global $hGui = GUICreate('SternBewertung', 480, 160) ; Die GUI erstellen
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent($GUI_EVENT_CLOSE, 'CloseGui') ; Funktion, die aufgerufen wird, wenn man das Fenster schließt
GUISetOnEvent($GUI_EVENT_MOUSEMOVE, '_MOUSEMOVE') ; Funktion, die aufgerufen wird, sobald die Maus bewegt wirdGUICtrlCreateLabel('Bewertung:', 10, 25, 140, 32) ; Label mit Bewertungsschriftzug erstellen
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetFont(-1, 16, 400, 0, 'Verdana', 5) ; die Schriftgröße und -art ändernGlobal $sIconPath = @ScriptDir & '\icons\' ; Variable zum Pfad der Icons
[/autoit] [autoit][/autoit] [autoit]
If Not FileExists($sIconPath) Then DirCreate($sIconPath) ; falls das Verzeichnis nicht existiert, dann dieses erstellenGlobal $sIniFile = @ScriptDir & '\SternBewertung.ini' ; Pfad und Dateiname der Inidatei
[/autoit] [autoit][/autoit] [autoit]Global $aidStars[5] ; Array für die IDs der Gui-Icons erstellen (hier für 5 Sterne)
[/autoit] [autoit][/autoit] [autoit]Global $iShowStars = IniRead($sIniFile, 'Config', 'Bewertung', 0) ; Variable zum speichern der Bewertung (Wert aus der Inidatei lesen)
[/autoit] [autoit][/autoit] [autoit]
If $iShowStars < 0 Or $iShowStars > UBound($aidStars) - 1 Then $iShowStars = 0 ; wenn der gespeicherte Wert nicht im Wertebereich des Arrays liegt, dann auf 0 setzenGlobal $iStars = -1 ; Variable zum speichern der temporären (MouseOver) Bewertung
[/autoit] [autoit][/autoit] [autoit]; Die beiden folgenden Code-Zeilen erstellen die Icons, anhand der Binär-Daten, die mit Hilfe
[/autoit] [autoit][/autoit] [autoit]
; vom "'File to Base64 String' Code Generator" von UEZ in das Script integriert wurden.
If Not FileExists($sIconPath & 'star0.ico') Then _star0ico(True, $sIconPath) ; falls das Icon "star0.ico" nicht existiert, dieses erstellen
If Not FileExists($sIconPath & 'star1.ico') Then _star1ico(True, $sIconPath) ; falls das Icon "star1.ico" nicht existiert, dieses erstellenFor $i = 0 To UBound($aidStars) - 1 ; entsprechend der Größe des Arrays werden hier die Anzahl der Sterne erstellt
[/autoit] [autoit][/autoit] [autoit]
$aidStars[$i] = GUICtrlCreateIcon($sIconPath & 'star0.ico', 0, 170 + $i * 36, 20, 32, 32) ; die Sternicons erstellen
GUICtrlSetOnEvent(-1, '_SetStars') ; Funktion, die aufgerufen wird, wenn man das Sternicon anklickt
Next_ChangeStars($iShowStars) ; einmal die Funktion "_ChangeStars" aufrufen, um die Anzahl der gespeicherten Sterne farbig anzuzeigen
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW, $hGui) ; die GUI anzeigen lassenWinWaitClose($hGui) ; warten, bis die GUI geschlossen wird
[/autoit] [autoit][/autoit] [autoit]
ExitFunc CloseGui()
[/autoit] [autoit][/autoit] [autoit]
GUIDelete($hGui) ; die GUI schließen
EndFunc ;==>CloseGuiFunc _SetStars()
[/autoit] [autoit][/autoit] [autoit]
ToolTip('Das ist die' & @CRLF & 'gespeicherte Bewertung') ; Tooltip anzeigen
$iShowStars = $iStars ; die "Speicher"-Variable mit der temporären Variable füllen
IniWrite($sIniFile, 'Config', 'Bewertung', $iShowStars) ; den Wert in die Inidatei speichern
_ChangeStars($iShowStars) ; die Sterne entsprechend setzen
EndFunc ;==>_SetStarsFunc _MOUSEMOVE()
[/autoit] [autoit][/autoit] [autoit]
Local $aCursorInfo = GUIGetCursorInfo($hGui) ; Informationen über die GUI abrufen
Switch $aCursorInfo[4] ; entsprechend dem GUI-Element, über dem sich gerade die Maus befindet, verzweigen
Case $aidStars[0] To $aidStars[UBound($aidStars) - 1] ; wenn sich die Maus über einen der Sterne befindet, dann...
$iStars = $aCursorInfo[4] - $aidStars[0] ; ausrechnen, um welchen Stern es sich handelt (Wert = 0-4)
If $iStars <> $iShowStars Then ; wenn der Stern ungleich dem gespeicherten ist, dann...
ToolTip('Bewertung ändern' & @CRLF & 'auf ' & $iStars + 1 & StringLeft(' Sterne', 6 + ($iStars > 0))) ; Tooltip anzeigen
Else ; ansonsten (der Stern unter der Maus ist der gespeicherte Stern)...
ToolTip('Das ist die' & @CRLF & 'gespeicherte Bewertung') ; Tooltip anzeigen
EndIf
_ChangeStars($iStars) ; temporäre Sterne anzeigen
Case Else ; wenn sich die Maus nicht über einen der Sterne befindet, dann...
ToolTip('') ; Tooltip schließen
_ChangeStars($iShowStars) ; gespeicherte Sterne anzeigen
EndSwitch
EndFunc ;==>_MOUSEMOVEFunc _ChangeStars($iChange)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
For $i = 0 To UBound($aidStars) - 1 ; Schleife zum bearbeiten aller Sterne
If $i > $iChange Then ; wenn der Wert größer als $iChange ist, dann..
GUICtrlSetImage($aidStars[$i], $sIconPath & 'star0.ico', 0) ; den grauen Stern anzeigen
Else ; ansonsten...
GUICtrlSetImage($aidStars[$i], $sIconPath & 'star1.ico', 0) ; den farbigen Stern anzeigen
EndIf
Next
EndFunc ;==>_ChangeStars; Die folgenden Codezeilen wurden mit dem "'File to Base64 String' Code Generator v1.15 Build 2014-05-01" von UEZ erstellt
[/autoit] [autoit][/autoit] [autoit]
; Danke an UEZ (http://www.autoit.de) für diesen tollen Generator
Func _star0ico($bSaveBinary = False, $sSavePath = @ScriptDir)
Local $star0ico
$star0ico &= '9rRIAAABABAgIAFwIAAAqBAAABYAAMwAKAAYAJAAQAAYAVyhGQEeHh4BgAECgAECBIABB46OjlBYqFhYGoAFE4ABFoABqhmAARuAARyAAR+EAbYhjAGBCR2EE4EdF4ABAhSAARFsbGwhYKhgYBGABQWEMwGQPQGBDQ2FhYVZv79Av/+kpKT/gAWiUCoqKk6AC0+AAVRVgAFYgAFbgAFegAFgrYABYYQBwQJcwABZwAAKVcAAUcAATEZGRgBbiYmJoqioqAD/oqKi/0pKSvYYwTfAAAPFIMQfwQDBHwAMkpKSdc/PzwL/AQDT09P/o6MAo/+BgYGjJibuJsEUwQDBIVfEIsEbwQALwQPBHVLBKjo6OloAhoaGqKampv8I3d3dwhKenp7hDcAGDs0fzCADkJCQACKurq7/9vb2AP/m5ub/8vLyMP/Q0NDCL8AmhCl8KSnBVsExwQDBZcUCFwBEREQelZWVjoClpaX/2dnZwg6A7e3t/+jo6MEfDqfEHcpfEQChoaHJAcEN2tra/9jY2BD/5eXlwhLOzs4hwkOgoKByyQupqRSpBsAXfsEd1dXVAP/z8/P/4+PjAP/W1tb/5+fnoP/Jycn/wBRa5aONwAp4wR3BENLS0sJhA8EzwTHx8fH/zMxqzMEh0sBEacEK4Q7RPNHR4g5hJmEHYQbU1KLU4haqqqphFhI/DwMDAGALKra2tv/wPPDwYhjhCGEAYRvb2yDb/+rq6mIDysr8yv9hReEOYRPhJWEE5QW/4QHhBGEVvw4LAGAa0mEHGNzc3GIKaQDX19c/4kphHWEzYQThFO0E5OSg5P/f399haYc/DuMLAGEG4ODg4gvhDX8AAW8A7u7u/8DAwBr/YBk8Pw4LAKenp/Azvr6+4j1hP2E6fwADZwDhNPf39/+rq7yr/+FTPw4PAOBG4eFwj2EoYTl/AGcA4uLiYm/dYAi0Pw0TAGAXlmFg4TjHYTx/AGcA6enpYkJgCHZpPw1yDzzhkOFaYUDePN7efwBoAOEGYRetrTStlmAJHj8O6i4hr4ivr6XhJ+/v72Ip42FRaQDh4eFmAL0BMQDvsQexP7ETcAyWXwYPAHQPYA+wsLCWcScBAPlA+fn/+Pj4cgD7APv7//z8/P/9wP39//7+/joAMQHxsQH6+vo6AwEAMQgxBQPfBg8AsbGxluzs/uxyAzEFtQYPAA8ACQD1CG9xAAEAMSywBZAfBwcAs/izs5OxCg8ADwAPAA8AFw0AcTkwBo2fBwAAtfi1tY21cg8ADwAPAA8AbQ8A//JksAaBuQewXj//sQkPAA8ADwAPAA8ACwBxdBC3t7cqOQi6uroAjbi4uPa5ubnG/z8AMwC7u7vPBAwA+38DPgDqsAf6Dw8ADwABAH3wB3IxNQ8AAwBxWjACOT+fAw8ADwAPAA0AMBIPxQzFxY8HBAC8vLzPf18DDwAPAA8ADwADADBplv2fB/9yarAPv1YPAA8ADwAbDwA3GC1xXQ0AxsbG4P/CwsIMHwMPAA8Ahw8ADwAHAMHBwbr9B39wfv9NDwAPAA8ADwD/B1HvMZgFALF+cBktnwIPAA8ADw8ADwALAPA7A8TExPv2B/AIxl8CDwAPAA8ADwDDDwABAMPDw3XxXfE4/bAAXR8CDwAPAA8ADwAPAMcBALEm8a/IyMhxJ/+Vfw8ADwAPAA8ADwAGADAvCQDCwl2wKMIGADgA/wQAgAA0AAMAHAEBBgEW+AMggB/4AAABBj/84QgG/gAAfwEGARYBNgbwAEYAAw/gAAAHFsAANwA7AQEH/+AHgP//4A////AEA4T4HwQDP////AQDAP5//w=='
$star0ico = _WinAPI_Base64Decode($star0ico)
Local $tSource = DllStructCreate('byte[' & BinaryLen($star0ico) & ']')
DllStructSetData($tSource, 1, $star0ico)
Local $tDecompress
_WinAPI_LZNTDecompress($tSource, $tDecompress, 4286)
$tSource = 0
Local $bString = Binary(DllStructGetData($tDecompress, 1))
If $bSaveBinary Then
Local $hFile = FileOpen($sSavePath & "\star0.ico", 18)
FileWrite($hFile, $bString)
FileClose($hFile)
EndIf
Return $bString
EndFunc ;==>_star0icoFunc _star1ico($bSaveBinary = False, $sSavePath = @ScriptDir)
[/autoit] [autoit][/autoit] [autoit]
Local $star1ico
$star1ico &= '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'
$star1ico &= 'sA0zBzEAsQAA1/v//0y84/99MAI5jwMPAA8ADwAOAJkA3Q8YqNr/2vpg/v/O+f8wGTMA0AHwCMv0+/8Bn9h+z08DDwAPAA8ADwA0MqLg2Jas5vXyDnEHMQAC2bAAhdXu/wCefta/Vg8ADwAPAA8ABAAGEJ/SLT5wNOH9/wz/1XAHMQDf+/7/ABSq3P8AqtUMPx8DDwAPAA8ADwAHAAOlANq6yPH5/9r8CP//3DAAsej2//gCpdr/TQ8ADwAPAA8AAQ0Ap9lRbM/r/wriMBDkMABDwOX/8Aaf3S2PAg8ADwAPAAMPAAwAqv8DCKrbAP/e+vz/1Pb74P8DptvGTwIPAA8ADw8ADwAPADMI2nWY4QDy/3/X7/8DqvzZXQ8CDwAPAA8ADwAPAAHzB9UMELDe/wz6rrBMqv+VDwAPAA8ADwADDwA5COMJAKpdsCjVBgA4AP8EAIAANAADABwBAQYBFvgDIIAf+AAAAQY//OEIBv4AAH8BBgEWATYG8ABGAAMP4AAABxbAADcAOwEBB//gB4D//+AP///wBAOE+B8EAz////wEAwD+f/8='
$star1ico = _WinAPI_Base64Decode($star1ico)
Local $tSource = DllStructCreate('byte[' & BinaryLen($star1ico) & ']')
DllStructSetData($tSource, 1, $star1ico)
Local $tDecompress
_WinAPI_LZNTDecompress($tSource, $tDecompress, 4286)
$tSource = 0
Local $bString = Binary(DllStructGetData($tDecompress, 1))
If $bSaveBinary Then
Local $hFile = FileOpen($sSavePath & "\star1.ico", 18)
FileWrite($hFile, $bString)
FileClose($hFile)
EndIf
Return $bString
EndFunc ;==>_star1icoFunc _WinAPI_Base64Decode($sB64String)
[/autoit] [autoit][/autoit] [autoit]
Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
$aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
Return DllStructGetData($bBuffer, 1)
EndFunc ;==>_WinAPI_Base64DecodeFunc _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize)
[/autoit]
$tOutput = DllStructCreate("byte[" & $iBufferSize & "]")
If @error Then Return SetError(1, 0, 0)
Local $aRet = DllCall("ntdll.dll", "uint", "RtlDecompressBuffer", "ushort", 0x0002, "struct*", $tOutput, "ulong", $iBufferSize, "struct*", $tInput, "ulong", DllStructGetSize($tInput), "ulong*", 0)
If @error Then Return SetError(2, 0, 0)
If $aRet[0] Then Return SetError(3, $aRet[0], 0)
Return $aRet[6]
EndFunc ;==>_WinAPI_LZNTDecompress -
Das Problem läßt sich relativ einfach beheben, wenn man die Unterscheidung (auf-/zuklappen und Checkbox anhaken) hinbekommt.
Dazu kann man eine Variable benutzen, die mittels WM_NOTIFY entsprechend gesetzt wird (das ist in dem Beispiel von mir, das Kanashius gepostet hat, noch schlechter gelöst):Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Add_Constants=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>$Debug_TV = False
[/autoit] [autoit][/autoit] [autoit]
Opt("GUIOnEventMode", 1)$Form1_1 = GUICreate("Test Framework Build Tool", 500, 360, 382, 56, BitOR($GUI_SS_DEFAULT_GUI, $DS_MODALFRAME))
[/autoit] [autoit][/autoit] [autoit]
$Group1 = GUICtrlCreateGroup("Build Steps", 8, 8, 481, 350)
$TreeView1 = GUICtrlCreateTreeView(16, 24, 465, 326, BitOR($GUI_SS_DEFAULT_TREEVIEW, $TVS_CHECKBOXES))
$TreeView1_4 = GUICtrlCreateTreeViewItem("Main", $TreeView1)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main1Item = GUICtrlCreateTreeViewItem("Main 1", $TreeView1_4)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main1Sub1Item = GUICtrlCreateTreeViewItem("Sub 1", $main1Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main1Sub2Item = GUICtrlCreateTreeViewItem("Sub 2", $main1Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main1Sub3Item = GUICtrlCreateTreeViewItem("Sub 3", $main1Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main1Sub4Item = GUICtrlCreateTreeViewItem("Sub 4", $main1Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main1Sub5Item = GUICtrlCreateTreeViewItem("Sub 5", $main1Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main1Sub6Item = GUICtrlCreateTreeViewItem("Sub 6", $main1Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main1Sub7Item = GUICtrlCreateTreeViewItem("Sub 7", $main1Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main2Item = GUICtrlCreateTreeViewItem("Main 2", $TreeView1_4)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main2Sub1Item = GUICtrlCreateTreeViewItem("Sub 1", $main2Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main2Sub2Item = GUICtrlCreateTreeViewItem("Sub 2", $main2Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main2Sub3Item = GUICtrlCreateTreeViewItem("Sub 3", $main2Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main2Sub4Item = GUICtrlCreateTreeViewItem("Sub 4", $main2Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main2Sub5Item = GUICtrlCreateTreeViewItem("Sub 5", $main2Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main2Sub6Item = GUICtrlCreateTreeViewItem("Sub 6", $main2Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")
$main2Sub7Item = GUICtrlCreateTreeViewItem("Sub 7", $main2Item)
GUICtrlSetOnEvent(-1, "SelectionChangedChildItem")GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]GUISetOnEvent($GUI_EVENT_CLOSE, "Form1_1Close")
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent($GUI_EVENT_MINIMIZE, "Form1_1Minimize")
GUISetOnEvent($GUI_EVENT_MAXIMIZE, "Form1_1Maximize")
GUISetOnEvent($GUI_EVENT_RESTORE, "Form1_1Restore")$fExpanded = False
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(100)
WEndFunc WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iCode, $tNMHDR, $hWndTreeview
$hWndTreeview = GUICtrlGetHandle($TreeView1)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndTreeview
Switch $iCode
Case $TVN_ITEMEXPANDEDA, $TVN_ITEMEXPANDEDW
$fExpanded = True
Case $NM_CLICK
$fExpanded = False
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFYFunc SelectionChangedChildItem()
[/autoit] [autoit][/autoit] [autoit]
If $fExpanded Then Return
SetCheckedForAllChildItems(@GUI_CtrlId)
SetCheckedForParentItem(@GUI_CtrlId)
EndFunc ;==>SelectionChangedChildItemFunc SetCheckedForParentItem($hChildItem)
[/autoit] [autoit][/autoit] [autoit]
Local $hParent = _GUICtrlTreeView_GetParentHandle($TreeView1, $hChildItem)If $hParent <> 0 Then
[/autoit] [autoit][/autoit] [autoit]
If _GUICtrlTreeView_GetChecked($TreeView1, $hChildItem) Then
_GUICtrlTreeView_SetChecked($TreeView1, $hParent)
;SetTreeViewItemCheckedState($TreeView1, $hParent, True)
Else
Local $hChild
Local $childCount = _GUICtrlTreeView_GetChildCount($TreeView1, $hParent)
If $childCount > 0 Then
Local $isAnyChildChecked = False
For $i = 1 To $childCount
If $i = 1 Then
$hChild = _GUICtrlTreeView_GetFirstChild($TreeView1, $hParent)
Else
$hChild = _GUICtrlTreeView_GetNextSibling($TreeView1, $hChild)
EndIf
$isAnyChildChecked = BitOR($isAnyChildChecked, _GUICtrlTreeView_GetChecked($TreeView1, $hChild))
Next
_GUICtrlTreeView_SetChecked($TreeView1, $hParent, $isAnyChildChecked)
;SetTreeViewItemCheckedState($TreeView1, $hParent, $isAnyChildChecked)
EndIf
EndIf
SetCheckedForParentItem($hParent)
EndIf
EndFunc ;==>SetCheckedForParentItemFunc SetTreeViewItemCheckedState($treeViewCtrl, $treeViewItem, $isChecked)
[/autoit] [autoit][/autoit] [autoit]
If _GUICtrlTreeView_GetChecked($treeViewCtrl, $treeViewItem) <> $isChecked Then
_GUICtrlTreeView_SetChecked($treeViewCtrl, $treeViewItem, $isChecked)
EndIf
EndFunc ;==>SetTreeViewItemCheckedStateFunc SetCheckedForAllChildItems($hParentItem)
[/autoit] [autoit][/autoit] [autoit]
Local $hChild
Local $childCount = _GUICtrlTreeView_GetChildCount($TreeView1, $hParentItem)
Local $isChecked = _GUICtrlTreeView_GetChecked($TreeView1, $hParentItem)If $childCount > 0 Then
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $childCount
If $i = 1 Then
$hChild = _GUICtrlTreeView_GetFirstChild($TreeView1, $hParentItem)
Else
$hChild = _GUICtrlTreeView_GetNextSibling($TreeView1, $hChild)
EndIf
_GUICtrlTreeView_SetChecked($TreeView1, $hChild, $isChecked)
;SetTreeViewItemCheckedState($TreeView1, $hChild, $isChecked)
SetCheckedForAllChildItems($hChild)
Next
EndIf
EndFunc ;==>SetCheckedForAllChildItemsFunc OnCloseSecondary()
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>OnCloseSecondaryFunc Form1_1Close()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFunc ;==>Form1_1CloseFunc Form1_1Maximize()
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>Form1_1MaximizeFunc Form1_1Minimize()
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>Form1_1MinimizeFunc Form1_1Restore()
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>Form1_1RestoreFunc Input1Change()
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>Input1ChangeFunc TreeView1Click()
[/autoit]
EndFunc ;==>TreeView1Click -
Kann mir einer bei der GUI-Checkbox-Variablenzuweisung helfen?
Wir könnten Dir sicher helfen! Vorausgesetzt Du postest mal Dein Script.
-
Oh, ist die GUI dann nicht OnTop?
Hmm...muss ich mal schauen, wie man die erkennen kann. -
Danke, für das Lob! Naja, komplett erklären ist schwierig. Als Neuling solltest Du Dich vielleicht erstmal an den Beispielen in der Hilfe versuchen. Dabei lernt man sehr viel.
Es gibt aber auch schon wieder eine neue Version. Man kann jetzt auch mehrere USB-Sticks registrieren.
Alles weitere in Post #1. -
Hier ein Beispiel, wie misterspeed und James es gemeint haben:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>Global $hGui = GUICreate('Test', 240, 100)
[/autoit] [autoit][/autoit] [autoit]
Global $idCombo = GUICtrlCreateCombo('', 10, 10, 220, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $WS_VSCROLL))
GUICtrlSetData(-1, 'Test1|Test2|Test3|Test4|Test5|Test6|Test7', 'Test4')
Global $idEdit = GUICtrlCreateInput('', 10, 60, 220, 20)
GUICtrlSetData(-1, GUICtrlRead($idCombo))
GUISetState(@SW_SHOW)While 1
[/autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $idCombo
GUICtrlSetData($idEdit, GUICtrlRead($idCombo))
EndSwitch
WEnd -
Ich würde @error anstatt einer globalen Variablen benutzen. Außerdem muss man nicht mehr FileGetAttrib benutzen, um die Unterscheidung "Datei/Ordner" zu treffen. Das Makro @extended wird bei einem Ordner gesetzt.
Das ganze würde dann so aussehen:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
$Path = Search(".exe", "C:")
MsgBox(0, "$Path", $Path)Func Search($app, $Dir) ;ohne GUI
[/autoit]
Local $Search, $File, $FullFilePath
$Search = FileFindFirstFile($Dir & '\*.*')
While 1
If $Search = -1 Then ExitLoop
$File = FileFindNextFile($Search)
If @error Then ExitLoop
$FullFilePath = $Dir & '\' & $File
If @extended Then ;ordner gefunden
$FullFilePath = Search($app, $FullFilePath)
If @error Then
FileClose($Search)
Return SetError(1, 0, $FullFilePath)
EndIf
Else ;datei gefunden
If StringRight($FullFilePath, 4) = ".exe" Then
If StringInStr($FullFilePath, $app, 2) Then
Switch MsgBox(3, "Objekt gefunden", "Soll folgendes Objekt verwendet werden?" & @LF & $FullFilePath)
Case "6"
Return SetError(1, 0, $FullFilePath)
Case "2"
MsgBox(0, "Abbruch", "Suche durch den Benutzer abgebrochen")
Return SetError(2, 0, '')
EndSwitch
EndIf
EndIf
EndIf
WEnd
FileClose($Search)
Return SetError(0, 0, $FullFilePath)
EndFunc ;==>Search -
Hast Du es hiermit schonmal versucht: _PlaySystemSound()
-
Verdammt, das war ein blöder Bug! Sorry, an alle die davon betroffen waren.
Habe den Bug beseitigt und Deine Vorschläge eingebaut. Danke!
Neue Version in Post #1. -
Schau Dir mal das Script an: Listview-Datenbank-Beispiel
-
Also erstmal: FileOpen gibt ein Handle zurück und dieses benutzt man dann bei FileWrite bzw. FileRead (siehe auch das Beispiel in der Hilfe).
Jede Datei, die Du mit FileOpen öffnest musst Du unbedingt mit FileClose wieder schließen, sonst liegt ein Lock auf der Datei.Nun zu Deinem Problem: Wenn Du die Zeilen gelöscht hast, schreibst Du einfach den gesamten Datenbestand aus dem Listview in die Datei. So sind alle Änderungen abgespeichert.
Eventuell vorher noch ein Backup von der Datei erstellen, dann kann man auch zu einem alten Bestand zurückkehren. -
Noch ein paar kleine Änderungen, damit das Programm jetzt auch mit mehreren Monitoren funktioniert.
Neue Version in Post #1.