Mars:
Beiträge von BugFix
-
-
Hi,
da recht häufig eine Dateiauflistung nach Datumskriterien weiterbearbeitet wird, halte ich es für sinnvoll, dass man doch die Listfunktion bereits dafür mit einer Option versieht. Wird diese Option nicht genutzt, führt dies auch zu keinerlei Verlangsamung der originalen Funktion, da der Timestamp erst im Anschluß des Standardablaufs ermittelt wird._FileListToArray
[autoit]; #FUNCTION# ====================================================================================================================
[/autoit]
; Name...........: _FileListToArray
; Description ...: Lists files and\or folders in a specified path (Similar to using Dir with the /B Switch)
; Syntax.........: _FileListToArray($sPath[, $sFilter = "*"[, $iFlag = 0]])
; Parameters ....: $sPath - Path to generate filelist for.
; $sFilter - Optional the filter to use, default is *. Search the Autoit3 helpfile for the word "WildCards" For details.
; $iFlag - Optional: specifies whether to return files folders or both
; |$iFlag= 0 (Default) Return both files and folders
; |$iFlag= 1 Return files only
; |$iFlag= 2 Return Folders only
; ******** $iDate - Optional: specifies to get additional time stamp ('YYYYMMDDHHMMSS')
; ******** |$iDate=-1 (Default) No time stamp
; ******** |$iDate= 0 Gets modification time stamp
; ******** |$iDate= 1 Gets creation time stamp
; ******** |$iDate= 2 Gets last access time stamp
; Return values .: @Error - 1 = Path not found or invalid
; |2 = Invalid $sFilter
; |3 = Invalid $iFlag
; |4 = No File(s) Found
; Author ........: SolidSnake <MetalGX91 at GMail dot com>
; Modified.......: BugFix (additional time stamp)
; Remarks .......: The array returned is one-dimensional and is made up as follows:
; $array[0] = Number of Files\Folders returned
; $array[1] = 1st File\Folder
; $array[2] = 2nd File\Folder
; $array[3] = 3rd File\Folder
; $array[n] = nth File\Folder
; ******** By using additional time stamp the array returned is two-dimensional:
; ******** $array[0][0] = Number of Files\Folders returned
; ******** $array[1][0] = 1st File\Folder, $array[1][1] = 1st time stamp
; ******** $array[2][0] = 2nd File\Folder, $array[2][1] = 2nd time stamp
; ******** $array[3][0] = 3rd File\Folder, $array[3][1] = 3rd time stamp
; ******** $array[n][0] = nth File\Folder, $array[n][1] = nth time stamp
; Related .......:
; Link ..........:
; Example .......: Yes
; Note ..........: Special Thanks to Helge and Layer for help with the $iFlag update speed optimization by code65536, pdaughe
; ===============================================================================================================================
Func _FileListToArray($sPath, $sFilter = "*", $iFlag = 0, $iDate = -1)
Local $hSearch, $sFile, $sFileList, $sDelim = "|"
$sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "" ; ensure single trailing backslash
If Not FileExists($sPath) Then Return SetError(1, 1, "")
If StringRegExp($sFilter, "[\\/:><\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")
$hSearch = FileFindFirstFile($sPath & $sFilter)
If @error Then Return SetError(4, 4, "")
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If ($iFlag + @extended = 2) Then ContinueLoop
$sFileList &= $sDelim & $sFile
WEnd
FileClose($hSearch)
If Not $sFileList Then Return SetError(4, 4, "")
If $iDate = -1 Then
Return StringSplit(StringTrimLeft($sFileList, 1), "|")
Else
Local $aContent = StringSplit(StringTrimLeft($sFileList, 1), "|")
Local $aOut[$aContent[0]+1][2] = [[$aContent[0]]]
For $i = 1 To $aContent[0]
$aOut[$i][0] = $aContent[$i]
$aOut[$i][1] = FileGetTime($sPath & $aContent[$i], $iDate, 1)
Next
Return $aOut
EndIf
EndFunc ;==>_FileListToArray -
Wie kann ich das Bild in einem in einem Ringspeicher abspeichern ? So das immer das 10 Bild gelöscht wird ?
Schreib dir eine Speicherfunktion:
- Dateien im Ordner mit _FileListToArray einlesen
- Zielordner hat weniger als 10 Bilddateien? ==> nur speichern
- sonst ==> durch Array iterieren und älteste Datei ermitteln - diese löschen, neue Datei speichern -
Das Dekompilieren selbst ist glaub ich nicht strafbar, immerhin benutzt du die Software ja, also möchtest du ja auch wissen was sie macht.
Was hingegen nicht erlaubt ist ist die Weitergabe von Dekompilern (soweit ich weiß) und das weitergeben dekompilierter Exen.
Bitte nicht schooon wieder!!
SELBSTREDEND ist das Dekompilieren illegal, da es gegen die AutoIt-Lizenz verstößt. (wer nicht weiß, dass es die gibt, sollte sich dringend damit vertraut machen bevor er von legalem Dekompilieren schwätzt!)Und dazu bedarf es auch keines Juristen, sondern ausschließlich der Fähigkeit des Buchstaben-Aneinanderreihens, umgangssprachlich als "Lesen" bezeichnet.
Mehr möchte ich dazu nicht mehr sagen (müssen). -
Ah.. Komplexe Zahlen, das hatte ich in der Abiturstufe als Kurs belegt.
Feine Lösungen.
[autoit]
Strahlemann, deines erschlägt einen ja fast mit seiner Komplexität - Respekt
Eines mal als Tipp von einem alten Funktions-Junkie
- SetError und in der Folgezeile erst den Return ist selten erforderlich
Da SetError als 3-ten Parameter einen Returnwert enthält, funktioniert "Return SetError(iErr, iExt, iReturn)" super.
- Gerade bei solch umfangreicher Funktionssammlung nach Vereinfachungen schauen. Du verwendest in der Mehrzahl der FunktionenIf Not _CmplxCheck($cmp) Then
[/autoit]
If IsNumber($cmp) Then
$cmp = _Cmplx($cmp, 0)
Else
SetError(1)
Return 0
EndIf
EndIf
[autoit]
Was hältst du hier von:; == dafür nur:
[/autoit]
If Not __Check($cmp) Then Return SetError(1,0,0)
Func __Check(ByRef $_cmp)
If Not _CmplxCheck($_cmp) Then
If Not IsNumber($_cmp) Then Return False
$_cmp = _Cmplx($_cmp, 0)
EndIf
Return True
EndFunc
Spart dir 7 Zeilen Code je Aufruf. Bei dem Umfang haut das ganz schön rein.
-
Mögen diesem Anlauf evtl. mehr User wohlgesonnen sein.

Bei den bisher existierenden 1..2..3..? TS-Versuchen für AutoIt hat das Interesse max. 10..14 Tage vorgehalten. Also versprecht euch besser nicht allzuviel davon. -
Achso, du willst Checkbox UND Icon - das hatte ich übersehen. Meines Wissens sind Beides Elemente, die nur in der ersten Spalte untergebracht werden können. Adhoc fällt mir jetzt nicht ein, wie man das austricksen kann. Eventuell ist mit Ownerdraw was zu Reißen - habe ich in der Form aber bisher nicht probiert. Durchsuch mal das EN-Forum.
-
Wie kann ich das Icon in Spalte 2 bekommen ?
Diese Frage wurde gestern oder vorgestern erst gestellt und beantwortet.
Einfach mal im Forum auch mitlesen.
Icon sind nur in Column 0 möglich -- aber: du kannst die ColumnOrder ändern ;). Schau dir einfach die Befehle in der Listview-UDF an bzw. suche nach der Frage im Forum. -
Bis dahin werde ich wahrscheinlich kommen, ABER die Übergabe, die schaffe ich nicht. Bspw. ich will einen Mitarbeiter einplanen.
Ich markiere den Auftrag, wählen den Mitarbeiter und sage bspw. "disponieren", der Mitarbeiter soll dann im Auftrag auftauchen, und für den Zeitraum aus der Buchung entfernt werden. Ich denke das geht mit Arrays - leider beherrsche ich Listviews nicht und auch die Hilfe, hilft mir nicht wirklich.
Ich denke mal, das Problem liegt hier einen Ansatz zu finden, wie du Mitarbeiter zum Einen in der Buchung führst und zum Anderen an die Planung übergibst und sie währenddessen aus der Verfügbarkeit entfernst.
Hier mal mein spontaner Gedankenansatz, den du dann versuchen kannst umzusetzen.
- Jeder Mitarbeiter wird identifiziert durch eine Zahl - und zwar Potenzen von 2
Somit kannst du eine Summe bilden aus der mit: BitXOr der Kollege zu-/oder abgebucht wird und mit BitAnd seine Verfügbarkeit ermittelbar ist
- Du benötigst ein Zeitarray, je nach Arbeitszeiteinheit gegliedert (10, 12 od. 15 min Einheiten, also 6, 5 od. 4 Einträge je Stunde)
Nun verknüpst du Zeit und Mitarbeitersumme:
- In der Summe Verfügbarkeit wird der Mitarbeiter "abgebucht", die neue Summe wird in dem entsprechenden Zeitraum abgespeichert (bzw. aus vorhandenen Werten mittels BitXOr neu gebildet!)
- Für das Listview brauchst du eine gegenteilige Summe, in der der Mitarbeiter "zugebucht" wird
- Im Listview kannst du die Summe an das Item mit _GuiCtrlListview_SetItemParam zuweisen (abfragbar mit der Umkehrfunktion ...GetItemParam)
ggf. je nach Struktur deines Listview, ist es einfacher in einem Array ( [Zeilen_Listview][Spalten_Listview] ) direkt die "Mitarbeitersumme" abzuspeichern
Übergabe in das Listview kannst du mit Klick in die entsprechende Spalte realisieren.Viel Spaß bei der Umsetzung.
-
Du hast zwei Möglichkeiten:
- Wie bereits benannt "Execute"
oder (was ich bevorzuge)
- Verwende nur eine Funktion aus der Listviewauswertung heraus und übergib den Inhalt des Item als Parameter. Dann kannst du in dieser Funktion je nach Parameterinhalt entsprechend weiterarbeiten.Eines ist aber immer zu beachten bei WM_...Funktionen: Die aufgerufenen Funktionen sollten schnellstmöglich abgehandelt werden. Also niemals eine MsgBox oder Userinteraktion in einer dieser Funktionen! Sonst sind Crashs vorprogrammiert.
-
Ich habe folgendes Bsp. verwendet:
Spoiler anzeigen
[autoit]#include <GuiTreeView.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
#include "TreeviewOrder.au3"Global $aTreeview
[/autoit] [autoit][/autoit] [autoit]
Global $File = @ScriptDir & '\OrderTree.txt'$hGUI = GUICreate("Test", 350, 215)
[/autoit] [autoit][/autoit] [autoit]
$hTV = GUICtrlCreateTreeView(5, 5, 180, 200, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
$btFile = GUICtrlCreateButton('Load From File', 245, 45, 100, 20)
$btWrite = GUICtrlCreateButton('Write To File', 245, 85, 100, 20)
GUISetState()While 1
[/autoit]
Switch GUIGetMsg()
Case -3
Exit
Case $btFile
_GUICtrlTreeView_BeginUpdate($hTV)
$aTreeview = _GUICtrlTreeView_CreateItemFromOrderFile($File, $hTV)
_GUICtrlTreeView_Expand($hTV)
$hItem = _GUICtrlTreeView_GetFirstChild($hTV, $aTreeview[0][0])
_GUICtrlTreeView_Expand($hTV, $hItem, False)
While 1
$hItem = _GUICtrlTreeView_GetNextSibling($hTV, $hItem)
If $hItem = 0 Then ExitLoop
_GUICtrlTreeView_Expand($hTV, $hItem, False)
WEnd
_GUICtrlTreeView_EndUpdate($hTV)
Case $btWrite
Local $sWrite = _GUICtrlTreeView_GetItemOrder($hTV)
Local $fH = FileOpen($File, 2)
FileWrite($fH, $sWrite)
FileClose($fH)
EndSwitch
WEnd
In der "OrderTree.txt" steht:
und das wird angezeigt:
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. In deinem Post sehe ich kein Bild (bei mir wird nix angezeigt). Code ebenfalls nicht, somit ist es schwer darauf einzugehen.
-
aber wenn man nur 1 Item im Treeview hat, bricht das Script ohne Fehlermeldung ab.(ok nur 1 item macht nicht viel Sinn)
Gefixed
Dann hab ich noch ein Problem mit Umlauten beim wieder einlesen aus einer Txt datei. Der Text dahinter fehlt. (boom ist drin)
Habe ich jetzt behoben. Folgende Zeichen plus Leerzeichen sind für die Item zulässig:
a-z A-Z 0-9 ß ä ö ü Ä Ö Ü _ , + - | µ € § % $ & -
-
He, Danke allen Gratulanten.
Ich habe ein Bier auf euer Wohl trinken lassen.
Bin gerade von der Arbeit gekommen und werde jetzt nur noch mein Bett liebkosen.

-
Dazu gibt es
[autoit]_WinAPI_SystemParametersInfo
[/autoit]mit der Action-Variable: $SPI_SETMOUSESPEED
Details findest du im Forum, ich habe dazu mal eine Funktion mit Auflistung aller Aktionen gepostet. -
Mach dir nicht soviel Streß: Verwende Wink
Da zeichnest du einfach auf, was tu tust und kannst anschließend interaktive Messageboxen einbauen u.v.m.
Ich hatte hier im Forum schonmal eine Programmdemo damit erstellt: Demo OwnHotkey -
Ohne jedwedes Skript müssen wir genau das tun:
[Blockierte Grafik: http://piks.nl/tOU]
-
Das geht alles. Ich mach gleich mal ein kleines Bsp.
Aber was ich noch zeigen wollte: So nutzt man Arrays sinnvoll. Ich erstelle hier alle Groups mit Radio in einem Rutsch. Das sind 21 Zeilen Code inkl. Deklaration, Funktion und Funktionsaufruf in Schleife. Du hast dafür ca. 90 Zeilen benötigt.
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
GUICreate('Test', 1600, 1000)Global $aLeftTopTitle[7][3] = [[100,190,"1. Objektivität / Fairness "],[100,420,"2. Kompetenz in seiner Aufgabe "],[100,640,"3. Verständnis für Anliegen/Probleme "], _
[/autoit] [autoit][/autoit] [autoit]
[510,190,"4. Hilfsbereitschaft "],[510,420,"5. Loyalität "],[510,640,"6. Fähigkeit zum Vermitteln von Zusammenhängen "],[920,190,"7. Motivation "]]
Global $aCtrlArray[7]
For $i = 0 To 6
$aCtrlArray[$i] = _Group_w_Radio($aLeftTopTitle[$i][2], $aLeftTopTitle[$i][0], $aLeftTopTitle[$i][1], 350, 200)
NextGUISetState()
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = -3Func _Group_w_Radio($_sTitle, $_iX, $_iY, $_iW, $_iH)
[/autoit]
Local $aCtrl[8] ; == 6*Radio, 1*Picture, 1*Edit
Local $iW_radio = 40 ; == HIER kannst du variieren im Abstand der Radios
GUICtrlCreateGroup($_sTitle, $_iX, $_iY, $_iW, $_iH)
GUICtrlSetFont(-1, 10, 120, 0, "Arial")
For $i = 0 To 5 ; == Radio erstellen
$iStyle = Default
If $i = 0 Then $iStyle = $WS_GROUP
$aCtrl[$i] = GUICtrlCreateRadio( $i+1, $_iX +20 +$i*$iW_radio, $_iY +30, $iW_radio, 20, $iStyle)
Next
$aCtrl[6] = GUICtrlCreatePic("", $_iX +20 +200, $_iY +25, 44, 44)
$aCtrl[7] = GUICtrlCreateEdit("", $_iX +20, $_iY +70, $_iW -40, $_iH -80)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Return $aCtrl
EndFuncEdit:
Ich habe den Code jetzt mal etwas überarbeitet und die Smiley-Aktivierung eingefügt:
Spoiler anzeigen
[autoit]#include <WindowsConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
GUICreate('Test', 1600, 1000)Global $sPathIcon = "C:\Users\BugFix\Pictures\SMILEYS" ; == Smileys im Anhang, Pfad anpassen.
[/autoit] [autoit][/autoit] [autoit]Global $aPict[6] = [ _
[/autoit] [autoit][/autoit] [autoit]
$sPathIcon & "1.ico", _
$sPathIcon & "2.ico", _
$sPathIcon & "3.ico", _
$sPathIcon & "4.ico", _
$sPathIcon & "5.ico", _
$sPathIcon & "6.ico"]Global $aLeftTopTitle[7][3] = [[100,190,"1. Objektivität / Fairness "],[100,420,"2. Kompetenz in seiner Aufgabe "],[100,640,"3. Verständnis für Anliegen/Probleme "], _
[/autoit] [autoit][/autoit] [autoit]
[510,190,"4. Hilfsbereitschaft "],[510,420,"5. Loyalität "],[510,640,"6. Fähigkeit zum Vermitteln von Zusammenhängen "],[920,190,"7. Motivation "]]
Global $aCtrlArray[7]
For $i = 0 To 6
$aCtrlArray[$i] = _Group_w_Radio($aLeftTopTitle[$i][2], $aLeftTopTitle[$i][0], $aLeftTopTitle[$i][1], 350, 200)
NextGUISetState()
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
If $nMsg = -3 Then Exit
For $i = 0 To 6
$aTmpCtrl = $aCtrlArray[$i]
For $j = 0 To 5
If $nMsg = $aTmpCtrl[$j] Then
GUICtrlSetImage($aTmpCtrl[6], $aPict[$j])
ExitLoop(2)
EndIf
Next
Next
WEndFunc _Group_w_Radio($_sTitle, $_iX, $_iY, $_iW, $_iH)
[/autoit]
Local $aCtrl[8] ; == 6*Radio, 1*Icon, 1*Edit
Local $iW_radio = 40 ; == HIER kannst du variieren im Abstand der Radios
GUICtrlCreateGroup($_sTitle, $_iX, $_iY, $_iW, $_iH)
GUICtrlSetFont(-1, 10, 120, 0, "Arial")
For $i = 0 To 5 ; == Radio erstellen
$iStyle = Default
If $i = 0 Then $iStyle = $WS_GROUP
$aCtrl[$i] = GUICtrlCreateRadio( $i+1, $_iX +20 +$i*$iW_radio, $_iY +30, $iW_radio, 20, $iStyle)
Next
$aCtrl[6] = GUICtrlCreateIcon("", -1, $_iX +$_iW -60, $_iY +20, 40, 40)
$aCtrl[7] = GUICtrlCreateEdit("", $_iX +20, $_iY +70, $_iW -40, $_iH -80)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Return $aCtrl
EndFuncSo sieht das dann aus:
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. -
-
Dann erstelle mal kurz ein paar Pseudodaten.
Wichtige Infos (die bisher noch fehlen)
- sind die Werte allein in einer Zeile
- wie können Zeilen mit gewollten und mit ungewollten Inhalten aussehen
- wie soll das Ergebnis aussehenVorher-Nachher Beschreibung ist marginal bei Regex-Anwendung. Regex greift nicht über Inhalte direkt, sondern über die Beschreibung möglicher Inhalte. Also muss diese Beschreibung (das Pattern) genau die Umstände im vorhandenen Text berücksichtigen (Zeilenumbrüche, Match am Anfang, Match am Ende, Text vor/nach dem Match etc. pp.).