Es gibt viele Spiele die man spielen kann. Eine gute Auswahl kann man immer finden.
Und was willst Du uns damit jetzt sagen?
Dafür gräbst Du einen 6 Monate alten Thread aus?
Es gibt viele Spiele die man spielen kann. Eine gute Auswahl kann man immer finden.
Und was willst Du uns damit jetzt sagen?
Dafür gräbst Du einen 6 Monate alten Thread aus?
Habe leider noch ein Projekt mit der Autoit Version 3.3.10.2 erstellt.
Funktioniert damit nicht.
Gibt es eine Abhilfe?
Ach Gott! So eine alte AutoIt-Version. Seit der Version hat sich so viel getan.
Beim überfliegen des Changelog ist mir einiges aufgefallen:
- _GDIPlus_BitmapCreateDIBFromBitmap gab es noch nicht
- _GDIPlus_ImageGetDimension gab es noch nicht
- _GDIPlus_EffectCreateHueSaturationLightness war noch fehlerhaft
- $STM_SETIMAGE gab es noch nicht
und wer weiß, was noch alles?
Also: Nein, es gibt keine Abhilfe! Jedenfalls nicht von mir.
Ich denke, Du solltest mal Deine AutoIt-Version updaten.
Mir ist gerade ein Bug aufgefallen. Ich möchte bei einem Treeview nur den ersten (Root) Zweig aufklappen.
Hier mal das Script dazu:
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <WinAPI.au3>
Global $hGui = GUICreate('Test', 400, 200)
Global $idTreeview = GUICtrlCreateTreeView(10, 10, 380, 180)
Global $hTreeview = GUICtrlGetHandle($idTreeview)
Global $hRoot = _GUICtrlTreeView_Add($hTreeview, 0, 'Root')
Global $hAAA = _GUICtrlTreeView_AddChild($hTreeview, $hRoot, 'AAA')
_GUICtrlTreeView_AddChild($hTreeview, $hAAA, 'AA')
_GUICtrlTreeView_AddChild($hTreeview, $hAAA, 'AA')
Global $hBBB = _GUICtrlTreeView_AddChild($hTreeview, $hRoot, 'BBB')
_GUICtrlTreeView_AddChild($hTreeview, $hBBB, 'BB')
_GUICtrlTreeView_AddChild($hTreeview, $hBBB, 'BB')
Global $hCCC = _GUICtrlTreeView_AddChild($hTreeview, $hRoot, 'CCC')
_GUICtrlTreeView_AddChild($hTreeview, $hCCC, 'CC')
_GUICtrlTreeView_AddChild($hTreeview, $hCCC, 'CC')
GUISetState()
_GUICtrlTreeView_SetState($hTreeview, $hRoot, $TVIS_EXPANDED, True)
Do
Until GUIGetMsg() = -3
Exit
Alles anzeigen
dabei passiert folgendes:
Vorne steht ein [-], aber der Baum wird nicht angezeigt. Füge ich nach _GUICtrlTreeView_SetState ein _WinAPI_InvalidateRect($hGui) ein, dann wird der Baum zumindest dargestellt: Treeview-Bug2.png
Aber man kann die Zweige ("AAA", "BBB", "CCC") nicht anklicken. Weder markieren noch mit Klick auf das [+] weiter öffnen. Erst wenn man Root zuklappt und wieder aufklappt, sind die Zweige wieder anklickbar.
Ich vermute den Fehler bei _GUICtrlTreeView_SetState, denn es gibt einen Workaround:
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <WinAPI.au3>
Global $hGui = GUICreate('Test', 400, 200)
Global $idTreeview = GUICtrlCreateTreeView(10, 10, 380, 180)
Global $hTreeview = GUICtrlGetHandle($idTreeview)
Global $hRoot = _GUICtrlTreeView_Add($hTreeview, 0, 'Root')
Global $hAAA = _GUICtrlTreeView_AddChild($hTreeview, $hRoot, 'AAA')
_GUICtrlTreeView_AddChild($hTreeview, $hAAA, 'AA')
_GUICtrlTreeView_AddChild($hTreeview, $hAAA, 'AA')
Global $hBBB = _GUICtrlTreeView_AddChild($hTreeview, $hRoot, 'BBB')
_GUICtrlTreeView_AddChild($hTreeview, $hBBB, 'BB')
_GUICtrlTreeView_AddChild($hTreeview, $hBBB, 'BB')
Global $hCCC = _GUICtrlTreeView_AddChild($hTreeview, $hRoot, 'CCC')
_GUICtrlTreeView_AddChild($hTreeview, $hCCC, 'CC')
_GUICtrlTreeView_AddChild($hTreeview, $hCCC, 'CC')
GUISetState()
_SendMessage($hTreeview, $TVM_EXPAND, $TVE_EXPAND, $hRoot, 0, 'wparam', 'handle') ; <- Workaround
Do
Until GUIGetMsg() = -3
Exit
Alles anzeigen
Ach, und _GUICtrlTreeView_Expand hilft mir nicht weiter, weil ich nicht alle Zweige aufklappen will.
Wie gesagt, ich habe bereits einen "Workaround" gefunden. Ich wollte es euch nur mitteilen, falls jemand mit dem gleichen Fehler kämpft.
Achso, ich habe mich noch gefragt, ob Du die Tickets in dem Treeview "sortiert" haben willst?
Also je nach Status in einem eigenen Ast?
Wenn ja, dann tausche die Funktion _UpdateTicketTreeview mal gegen diese hier aus:
Func _UpdateTicketTreeview() ; zum aktualisieren des Treeviews
; Const $OSC_NORMAL = 0, $OSC_ELEDIGT = 1, $OSC_RESERVIERT = 2, $OSC_WICHTIG = 4
Local $aFiles, $idRoot, $idItem, $aidGroup[UBound($aLegends)], $iFlag
$aFiles = _FileListToArrayRec($sMailerPath, '*.txt', $FLTAR_FILES + $FLTAR_NOHIDDEN + $FLTAR_NOSYSTEM + $FLTAR_NOLINK, $FLTAR_NORECUR, $FLTAR_NOSORT, $FLTAR_RELPATH)
If @error Then Return
_GUICtrlTreeView_BeginUpdate($idTickets)
_GUICtrlTreeView_DeleteAll($idTickets)
$idRoot = GUICtrlCreateTreeViewItem(StringRegExpReplace($sMailerPath, '.+\\(.+)\\', '$1'), $idTickets)
_GUICtrlTreeView_SetIcon($idTickets, $idRoot, 'imageres.dll', 4) ; Icon fuer das oberste Item
For $i = 0 To UBound($aidGroup) - 1
$aidGroup[$i] = GUICtrlCreateTreeViewItem($aLegends[$i], $idRoot)
_GUICtrlTreeView_SetIcon($idTickets, $aidGroup[$i], 'imageres.dll', 4) ; Icon fuer das oberste Item
Next
For $i = 1 To $aFiles[0]
$iFlag = FileRead($sMailerPath & $aFiles[$i], 1) ; das Flag mit dem Status steht an erster Stelle der Datei (einstellig)
Select ; hoechste Prioritaet nach oben und dann absteigend
Case BitAND($iFlag, $OSC_ELEDIGT) = $OSC_ELEDIGT
$idItem = GUICtrlCreateTreeViewItem($aFiles[$i], $aidGroup[1])
_GUICtrlTreeView_SetIcon($idTickets, $idItem, 'imageres.dll', 101)
Case BitAND($iFlag, $OSC_WICHTIG) = $OSC_WICHTIG
$idItem = GUICtrlCreateTreeViewItem($aFiles[$i], $aidGroup[3])
_GUICtrlTreeView_SetIcon($idTickets, $idItem, 'imageres.dll', 100)
Case BitAND($iFlag, $OSC_RESERVIERT) = $OSC_RESERVIERT
$idItem = GUICtrlCreateTreeViewItem($aFiles[$i], $aidGroup[2])
_GUICtrlTreeView_SetIcon($idTickets, $idItem, 'imageres.dll', 102)
Case BitAND($iFlag, $OSC_NORMAL) = $OSC_NORMAL
$idItem = GUICtrlCreateTreeViewItem($aFiles[$i], $aidGroup[0])
_GUICtrlTreeView_SetIcon($idTickets, $idItem, 'imageres.dll', 99)
EndSelect
Next
_GUICtrlTreeView_EndUpdate($idTickets)
For $idItem In $aidGroup
GUICtrlSetState($idItem, $GUI_EXPAND)
Next
GUICtrlSetState($idRoot, $GUI_EXPAND)
EndFunc
Alles anzeigen
Füge mal #AutoIt3Wrapper_UseX64=y als erste Zeile in Dein Script ein.
Im Moment rufst Du es als 32-Bit-Version auf. Auf einem 64-Bit-System musst Du es aber als 64-Bit-Version aufrufen, damit Du alles zu sehen bekommst.
Im Example zu GUICtrlCreateGroup wird das so gemacht, dass die Gruppe geschlossen wird. Von daher habe ich mir das so angewöhnt, dieses auch zu tun.
Ich glaube aber, dass es nur einen Effekt hat, wenn man Radio-Controls verwendet (diese sind dann entsprechend gruppiert).
In den Remarks steht allerdings nichts davon, dass es erforderlich wäre, die Gruppen zu schliessen. Das weglassen führt also wohl nicht zu einem Speicherleck wegen nicht geschlossener Handles oder so.
(Akkustand auf Desktop zeichnen mit Gdi+)
Dafür habe ich mal eine UDF geschrieben: _GUICtrlBatterieLevel
Öffne mal das Dropdown menü, nachdem Du eine datei erstellt hast die keinen markt ausgewählt hat. dann hast du anschließend im dropdownmenü keine einträge mehr zur auswahl.
Ah, klar! Dann wird ein Leerstring in die Combobox geschrieben.
Lässt sich aber durch eine kleine Abfrage ohne Neustart lösen. Tausche mal die Funktion "_TicketClick" gegen diese aus:
Func _TicketClick() ; wenn auf einen Eintrag im Treeview geklickt wurde
; Datei = $iNERW, $sMarkt, $sAbteilung, $sName, $sTelefon, $sBelegnummer, $sAnliegen, $sNotes
; $aidOSCinfos[8] 0=Markt, 1=Name KD, 2=Abteilung, 3=Telefon, 4=Belegnummer, 5=Reservierung, 6=Wichtig, 7=Anliegen
Local $hSelect, $sFilename, $sData, $aData
$hSelect = _GUICtrlTreeView_GetSelection($idTickets) ; das Handle des ausgewaehlten Items
$sFilename = _GUICtrlTreeView_GetText($idTickets, $hSelect) ; der Text (Dateiname) des Items
$sData = FileRead($sMailerPath & $sFilename) ; die Daten aus der Datei lesen
If $sData = '' Then Return
$aData = StringSplit($sData, @CRLF, $STR_ENTIRESPLIT + $STR_NOCOUNT) ; am Zeilenende (@CRLF) splitten
If Not IsArray($aData) Or UBound($aData) <> 9 Then Return
; und die Daten in die Eingabefelder eintragen:
If $aData[1] = '' Then
_GUICtrlComboBox_SetCurSel($aidOSCinfos[0], -1)
Else
GUICtrlSetData($aidOSCinfos[0], $aData[1])
EndIf
GUICtrlSetData($aidOSCinfos[1], $aData[3])
If $aData[2] = '' Then
_GUICtrlComboBox_SetCurSel($aidOSCinfos[2], -1)
Else
GUICtrlSetData($aidOSCinfos[2], $aData[2])
EndIf
GUICtrlSetData($aidOSCinfos[3], $aData[4])
GUICtrlSetData($aidOSCinfos[4], StringTrimRight($sFilename, 4))
GUICtrlSetState($aidOSCinfos[5], (BitAND($aData[0], $OSC_RESERVIERT) ? $GUI_CHECKED : $GUI_UNCHECKED))
GUICtrlSetState($aidOSCinfos[6], (BitAND($aData[0], $OSC_WICHTIG) ? $GUI_CHECKED : $GUI_UNCHECKED))
GUICtrlSetState($idTicketOk, (BitAND($aData[0], $OSC_ELEDIGT) ? $GUI_CHECKED : $GUI_UNCHECKED))
GUICtrlSetData($aidOSCinfos[7], $aData[6])
GUICtrlSetData($idNotes, $aData[7])
EndFunc
Alles anzeigen
Edit: Das Gleiche gilt ja auch für die Abteilung (ist ja auch eine Combobox). Script angepasst.
Ich weiss nicht mehr weiter
Dein ganzes Script zu debuggen, ist mir zu aufwendig.
Ich habe es mal neu geschrieben. Im OnEventMode und ohne diese Restarts des Scripts (wozu sollen die gut sein?).
Die verschiedenen Statusse (Normal, Erledigt, Reserviert, Wichtig) habe ich in eine Zahl (4 Bits) zusammengefasst.
Für das Treeview muss man nicht die Riesenfunktion zum Directory einlesen benutzen. Das geht viel kürzer und die Priorität der Icons habe ich jetzt mal so gewählt, wie es mir am logischsten schien.
Im ZIP-Archiv (im Anhang) befinden sich auch ein paar Beispieldatensätze, sodass Du siehst, dass es mit den verschiedenen Icons durchaus geht.
Wenn Dir die ganzen Kommentare als Erklärung nicht ausreichen, dann frag einfach. ![]()
Danke, für die "Blumen"!
Solche UDFs sind oft ein Nebenprodukt, weil ich das gerade für ein Projekt brauche.
Und wenn ihr die UDF auch gebrauchen könnt, dann freut mich das zusätzlich. ![]()
Ach ja, schon wieder eine Progressbar. ![]()
Ich brauchte etwas Universelleres, als meine bisherigen Progressbars. Vielleicht könnt ihr die UDF ja auch gebrauchen...
Mit dieser UDF kann man:
- die Koordinaten auf der GUI frei wählen
- die Breite und Höhe der Progressbar frei wählen
- die Progressbar horizontal oder vertikal anzeigen lassen
- die Farbe der Progressbar frei wählen
- eine Prozentanzeige anzeigen lassen
- die Prozentanzeige horizontal oder vertikal anzeigen lassen
Screenshot:
muss es bei Deiner Variablen Deklaration nicht heißen RadToDeg, da wir doch Radianten in Grad umrechnen?
Nein, wir rechnen mit Grad/Deg (For-Schleife: 0...360). Der Sin-Befehl erwartet den Wert aber in Radian/Rad, deswegen ist DegToRad schon richtig.
Edit: Wenn Du gerade anfängst Dich mit GDI+ zu beschäftigen, dann solltest Du auch gleich lernen, wie man einen Backbuffer verwendet. Das hat nämlich den Vorteil, dass man die Grafik schnell wieder neuzeichnen kann (beim Restore oder WM_PAINT).
Außerdem sieht man es nicht, wenn Dein Programm die Grafiken, Linien, Punkte etc. zeichnet, sondern es wird erst die fertige Grafik auf das Fenster gezeichnet:
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
_GDIPlus_Startup()
Global Const $Pi = 3.141592653589793
Global Const $fDegToRad = $PI / 180
Global $iARGB, $aSinColor[360]
Global $iW = 640, $iH = 160, $iX = 10, $iY = 50, $iLine = 0
For $iDeg = 0 To 359
$aSinColor[$iDeg] = Int(255 * Sin($iDeg * $fDegToRad))
Next
;~ _ArrayDisplay($aSinColor)
Global $hGui = GUICreate("Einfacher Copper", $iW, $iH)
GUISetBkColor(0x000000)
Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui) ; Graphic vom Fenster erstellen
Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGraphics) ; Backbuffer erstellen
Global $hGfxCtx = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; Graphic vom Backbuffer
Global $hPen = _GDIPlus_PenCreate(0xFF000000, 1)
For $i = 0 To 180 Step 5
$iARGB = "0xFF0000" & Hex($aSinColor[$i], 2)
_GDIPlus_PenSetColor($hPen, $iARGB)
_GDIPlus_GraphicsDrawLine($hGfxCtx, $iX, $iY + $iLine, $iW - $iX, $iY + $iLine, $hPen) ; wir zeichnen in den Backbuffer
$iLine += 1
Next
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_PAINT, '_WM_PAINT')
_GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0) ; hier wird der Backbuffer auf die Graphic des Fensters gezeichnet
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_GDIPlus_PenDispose($hPen)
_GDIPlus_GraphicsDispose($hGfxCtx)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
Exit
Case $GUI_EVENT_RESTORE
_GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0) ; beim Restore muss der Backbuffer auch wieder auf das Fenster gezeichnet werden
EndSwitch
WEnd
Func _WM_PAINT($hWnd, $iMsg, $wParam, $lParam) ; wenn das Fenster neu gezeichnet werden muss (z.B. weil das Fenster ausserhalb des Desktopbereichs war)
#forceref $hWnd, $iMsg, $wParam, $lParam
_GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0) ; den Backbuffer neu zeichnen
Return $GUI_RUNDEFMSG
EndFunc
Alles anzeigen
Du musst das auch auf die möglichen Blauwerte (0...255) umrechnen:
#include <Array.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
Global Const $Pi = 3.141592653589793
Global Const $fDegToRad = $PI / 180
Global $iARGB, $aSinColor[360]
Global $hGui = GUICreate("Einfacher Copper", 500, 500)
GUISetState(@SW_SHOW)
For $i = 0 To 359
$aSinColor[$i] = Int(255 * Sin($i * $fDegToRad))
Next
;~ _ArrayDisplay($aSinColor)
_GDIPlus_Startup()
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
$hPen = _GDIPlus_PenCreate(0xFF000000, 1)
$k = 0
For $j = 0 To 180 Step 5
$iARGB = "0xFF0000" & Hex($aSinColor[$j], 2)
_GDIPlus_PenSetColor($hPen, $iARGB)
_GDIPlus_GraphicsDrawLine($hGraphics, 0, 50 + $k, 500, 50 + $k, $hPen)
$k += 1
Next
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
_GDIPlus_PenDispose($hPen)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
Alles anzeigen
Ich komme da nicht mehr mit! Poste bitte Dein gesamtes Script.
Dein Script setzt die Icons übrigens nur beim einlesen der Dateien. Es reagiert nicht auf das setzen der Checkboxen.
Hast Du denn meine geänderte Funktion aus Post#27 mal ausprobiert?
Du müsstest dann die Zeile mit dem ContinueCase aktivieren (das ";~" vorne entfernen).
soll er aber die Zeile 6 auslesen und auch dort wieder schauen ob Wert 4 oder 1 und auch dort die restlichen Icons anpassen.
Häh? Was für restliche Icons?
Das Treeview-Item kann nur ein Icon anzeigen. Wenn es laut Zeile 5 (Wert 4 vorhanden) bereits das Icon Nr. 111 hat, soll es dann laut Zeile 6 ein anderes Icon bekommen, oder was?
Ich verstehe das jetzt so:
Func _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath, $bFiles = False)
Local $hFileItem, $FolderColor = 0x0000FF, $Folder, $aCount[2] = [0, 0]
If Not StringInStr(FileGetAttrib($sPath), 'D') Then Return SetError(1, 0, 0)
$sPath = FileGetLongName($sPath)
Local $oFSO = ObjCreate('Scripting.FileSystemObject')
If @error Then Return SetError(2, 0, 0)
_GUICtrlTreeView_BeginUpdate($hTreeView)
_GUICtrlTreeView_DeleteAll(GUICtrlGetHandle($hTreeView))
Local $hTreeViewItem = GUICtrlCreateTreeViewItem($sPath, $hTreeView)
GUICtrlSetColor(-1, $FolderColor)
_GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 134) ;Icon 111
$Folder = $oFSO.GetFolder($sPath)
_CreateDirectoryRecursive($hTreeView, $Folder, $hTreeViewItem, $bFiles, $aCount)
If $bFiles Then
For $Files In $Folder.Files
$hFileItem = GUICtrlCreateTreeViewItem($Files.Name, $hTreeViewItem)
$read_reservierung = FileReadLine($sPath & $Files.Name, 5)
$read_important = FileReadLine($sPath & $Files.Name, 6)
Select
Case $read_reservierung = 4
_GUICtrlTreeView_SetIcon($hTreeView, $hFileItem, 'shell32.dll', 111) ;Icon 111
;~ ContinueCase ; wenn Zeile 6 Vorrang vor Zeile 5 haben soll
Case $read_important = 4
_GUICtrlTreeView_SetIcon($hTreeView, $hFileItem, 'shell32.dll', 92)
Case Else
_GUICtrlTreeView_SetIcon($hTreeView, $hFileItem, 'shell32.dll', 5)
EndSelect
$aCount[1] += 1
Next
EndIf
_GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 3, 2)
_GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 110, 4)
_GUICtrlTreeView_EndUpdate($hTreeView)
GUICtrlSetState($hTreeViewItem, $GUI_EXPAND)
$oFSO = ''
Return $aCount
EndFunc ;==>_GUICtrlTreeView_CreateDirectory
Alles anzeigen
Er springt nicht in den Else-If Bereich rein, da die Bedingung beim ersten "If" bereits erfüllt ist, daher interessiert ihn der weitere Rest nicht...
Genau! Du hast es bereits richtig erkannt.
Also muss die Logik anders aussehen. Da Du aber dazu nichts schreibst, musst Du es halt selbst probieren.
Vielleicht hilft Dir ja Select weiter? Oder zwei getrennte If-Abfragen?
Du bist seit 2006 hier angemeldet und verstehst Arrays nicht?
Was hast Du bisher mit AutoIt gemacht?
Wie wäre es mal mit dem lernen der Grundlagen?
Du kannst bei FileOpenDialog nicht einfach Parameter weglassen (Filter) und bei "Init Dir" sollte ein Pfad stehen und nicht der String "Pfad". Alternativ darf es dort ein Leerstring sein (es wird dann das aktuelle WorkingDir benutzt).
Außerdem gibt FileOpenDialog bei einer Mehrfachauswahl die Dateien durch eine Pipe ("|") getrennt zurück. Wobei am Anfang das Verzeichnis steht und dahinter nur jeweils die Dateinamen.
Will man alle Dateien in einem Array haben, muss man die Rückgabe etwas bearbeiten:
#include <Array.au3>
#include <FileConstants.au3>
Global $aFiles = _SelectFiles(5)
_ArrayDisplay($aFiles)
Func _SelectFiles($iSelectCount)
Do
Local $sFiles = FileOpenDialog("Bitte wähle die Dateien", '', 'All (*.*)', BitOR($FD_FILEMUSTEXIST, $FD_PATHMUSTEXIST, $FD_MULTISELECT))
If @error Then Return
If StringInStr($sFiles, '|') Then
Local $aTmp = StringSplit($sFiles, '|', 2)
Local $aFiles[UBound($aTmp) - 1]
For $i = 1 To UBound($aTmp) - 1
$aFiles[$i - 1] = $aTmp[0] & $aTmp[$i]
Next
Else
Local $aFiles[1] = [$sFiles]
EndIf
If UBound($aFiles) < $iSelectCount Then MsgBox($MB_ICONERROR + $MB_TOPMOST, "Fehler", "Es wurden zu wenig Dateien ausgewählt!")
Until UBound($aFiles) >= $iSelectCount
Return $aFiles
EndFunc
Alles anzeigen