Soll ich mal raten, warum er das nicht tut? ![]()
Beiträge von Oscar
-
-
Warum benutzt Du ein Verkehrsmittel, wenn Du zu Fuß wie zu alten Ritterzeiten auch 1000 km überwinden kannst?
Hier schon mal der Codeschnipsel als Lösung: Zeit
AutoIt ist eine Programmiersprache. Da hinkt Dein Vergleich ganz gewaltig.
"zu Fuß" bist Du da viel schneller unterwegs.
-
Schreibst Du bitte ein Beispiel, wie Du das heute per For Next mit Koordinaten machen würdest?
Wenn man bestimmte Teile eines Programms öfter benötigt, dann bietet es sich auch an, diese in eine Funktion auszulagern.
Damit erhält man einen viel kürzeren Quelltext und kann der Funktion auch Parameter übergeben. Somit kann man nicht nur mehrere
Control-Elemente per Koordinatenberechnung erstellen lassen, sondern diese auch noch in einer Funktion zusammenfassen.
Hier mal das Beispiel:AutoIt
Alles anzeigen#include <GUIConstantsEx.au3> $Form1 = GUICreate("Form1", 623, 436, 192, 132) Global $aRadioGroup1 = _CreateRadioGroup('Gruppe 1', 64, 20) Global $aRadioGroup2 = _CreateRadioGroup('Gruppe 2', 320, 20) Global $aRadioGroup3 = _CreateRadioGroup('Gruppe 3', 64, 160) Global $aRadioGroup4 = _CreateRadioGroup('Gruppe 4', 320, 160) GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $aRadioGroup1[1] To $aRadioGroup1[3] MsgBox(0, 'Radio', 'Gruppe 1, ' & GUICtrlRead($nMsg, 1)) Case $aRadioGroup2[1] To $aRadioGroup2[3] MsgBox(0, 'Radio', 'Gruppe 2, ' & GUICtrlRead($nMsg, 1)) EndSwitch WEnd Func _CreateRadioGroup($sGroupname, $iX, $iY) Local $aRadioGroup[4] $aRadioGroup[0] = GUICtrlCreateGroup($sGroupname, $iX, $iY, 220, 110) For $i = 1 To UBound($aRadioGroup) - 1 $aRadioGroup[$i] = GUICtrlCreateRadio('Radio' & $i, $iX + 50, $iY + $i * 25, 110, 20) Next GUICtrlCreateGroup("", -99, -99, 1, 1) Return $aRadioGroup EndFunc ;==>_CreateRadioGroup -
Funktionsnamen "_ArrayFileCopy" geändert in "_FileCopyEx" (finde ich passender).
Die Funktion habe ich noch etwas erweitert.
Man muss jetzt zwei Arrays übergeben. Eines mit den Quelldateien und eines (genauso groß) mit den Zielverzeichnissen.
Somit kann man für jede Quelldatei angeben, wohin sie kopiert werden soll. Damit kann man die Funktion auch zum patchen von Programmen verwenden oder als Ersatz für DirCopy.
Um das kopieren ganzer Verzeichnisse (DirCopy) mit meiner Funktion zu erleichtern, habe ich eine Helper-Funktion "_FileCopyEx_CreateArrays" geschrieben, die nach Übergabe des Quellverzeichnisses und des Zielverzeichnisses die für "_FileCopyEx" benötigten Arrays erstellt. Das hört sich jetzt komplizierter an, als es eigentlich ist. Schaut euch einfach das Beispiel an.
Mit Angabe des Flags bei der Funktion kann man folgendes erreichen:
; 0 = kein überschreiben einer existierenden Zieldatei (Standardwert)
; 1 = überschreiben einer existierenden Zieldatei
; 2 = die Datums- und Zeitinformationen der Quelldateien werden auf die Zieldateien kopiert
; 4 = wenn Kopiervorgang beendet, warten bis der Anwender auf [Ok] klickt
; 8 = erstelle Zielverzeichnis, wenn es noch nicht existiert
; 16 = erstelle ein Log-String; 32 = FileMove statt FileCopy (Quelldateien werden nach erfolgreichen kopieren geloescht)
Nach dem kopieren jeder Datei wird die Dateigröße der Quelldatei mit der Größe der Zieldatei verglichen. Nur wenn diese gleich groß sind, wird der Kopiervorgang als erfolgreich angesehen.
Ansonsten gibt es eine Fehlermeldung.In dieser Version ist jetzt auch die Progressbar von UEZ wieder dabei, wie ich sie ja auch schon bei "_DownloadWithProgress" verwendet habe. Nochmals: Vielen Dank, UEZ!

Ich habe das Script auch ausführlich kommentiert, sodass man (hoffentlich) nachvollziehen kann, was da im einzelnen passiert.

Neue Version (30.11.2018):
- Wenn man beim Flag das Bit 6 (Wert 32) setzt, wird ein FileMove statt FileCopy ausgeführt. Alle erfolgreich kopierten Quelldateien werden anschließend im Quellverzeichnis gelöscht.
-
Das weiß ich. Schau mal bitte in meine beiden Spoiler. Dort steht ein Array im Code (URL aus dem Forum ist hinterlegt). Es steht zwischen den Koda-Zeilen. Glaubst Du, das wurde nachträglich per Hand geändert? Der Code ist von Oscar, also "Konversation starten" oder "E-Mail senden" - wie wird das hier im Forum gehandhabt?
Meist reicht abwarten!
Ich jedenfalls lese so gut wie alle Beiträge.
Da ich Koda so gut wie nie benutze, werde ich das wohl von Hand eingetragen haben.
Aus welchem Thread stammt das denn?
Das scheint mir schon etwas älter zu sein, weil ich sowas mittlerweile eher in einer For...Next-Schleife mit Berechnung der Koordinaten machen würde.
-
Beim Treeview ist das auslesen nicht so ganz einfach. Bei einem meiner Scripte habe ich ziemlich lange gebraucht, bis ich eine funktionierende (und relativ einfache) Lösung gefunden habe.
Ich habe Dir das mal in Dein Script eingebaut:Spoiler anzeigen
AutoIt
Alles anzeigen#include <Array.au3> #include <GuiTreeView.au3> #include <GuiConstants.au3> ; Dieses Array ist ein Beispiel dafür, wie die Daten aus den FahrtenbuchDateien zurück gegeben werden. Global $a_FahrtenbuchDaten[13][3] = [[12], ["2012", "November", "01 (Montag)"], ["2012", "November", "02 (Dienstag)"], ["2012", "Dezember", "03 (Mittwoch)"], ["2013", "Oktober", "04 (Donnerstag)"], _ ["2013", "November", "05 (Freitag)"], ["2013", "Dezember", "06 (Samstag)"], ["2014", "November", "07 (Sonntag)"], ["2014", "November", "08 (Montag)"], _ ["2014", "November", "09 (Dienstag)"], ["2015", "Juni", "10 (Mittwoch)"], ["2015", "August", "11 (Donnerstag)"], ["2015", "Oktober", "12 (Freitag)"]] ; Dieses Array ist ein Beispiel dafür, wie FileListToArray() in der Funktion "TreeView_Fahrtenbuch()" die Daten zurück gibt. Global $a_Fahrtenbuch[5] = [4, "Fahrtenbuch 2012.dat", "Fahrtenbuch 2013.dat", "Fahrtenbuch 2014.dat", "Fahrtenbuch 2015.dat"] Global $hGui, $hSoSollsWerden, $hTreeView Func _TreeView_Fahrtenbuch() Local $hJahr, $hMonat, $sSeparatorChar = Opt("GUIDataSeparatorChar") _GUICtrlTreeView_DeleteAll($hTreeView) For $i = 1 To $a_FahrtenbuchDaten[0][0] $hJahr = _GUICtrlTreeView_FindItem($hTreeView, $a_FahrtenbuchDaten[$i][0]) ; <- nach dem Jahr suchen If $hJahr = 0 Then ; wenn Jahr noch nicht vorhanden, dann... $hJahr = _GUICtrlTreeView_Add($hTreeView, 0, $a_FahrtenbuchDaten[$i][0]) ; Jahr erstellen EndIf $hMonat = _GUICtrlTreeView_FindItemEx($hTreeView, $a_FahrtenbuchDaten[$i][0] & $sSeparatorChar & $a_FahrtenbuchDaten[$i][1]) ; <- nach Jahr & Monat suchen If $hMonat = 0 Then ; wenn Monat noch nicht vorhanden, dann... $hMonat = _GUICtrlTreeView_AddChild($hTreeView, $hJahr, $a_FahrtenbuchDaten[$i][1]) ; Monat erstellen EndIf _GUICtrlTreeView_AddChild($hTreeView, $hMonat, $a_FahrtenbuchDaten[$i][2]) ; Tag erstellen Next _GUICtrlTreeView_Expand($hTreeView) EndFunc ;==>_TreeView_Fahrtenbuch $hGui = GUICreate("TestGUI", 470, 560) GUISetBkColor(0xFFFBBB) GUICtrlCreateLabel("So ist es aktuell...", 20, 20, 200, 30, $SS_CENTER) GUICtrlSetBkColor(-1, 0xBBBBBB) GUICtrlSetFont(-1, 12, 800, 4) $hTreeView = GUICtrlCreateTreeView(20, 50, 200, 500) GUICtrlSetBkColor(-1, 0xBBBBBB) GUICtrlSetFont(-1, 12) $idDummyTreeView = GUICtrlCreateDummy() _TreeView_Fahrtenbuch(); Diese Funktion soll mir das TreeView mit den Daten aus dem Array "$a_FahrtenbuchDaten" befüllen. GUISetState(@SW_SHOW) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") While 1 Switch GUIGetMsg() Case $Gui_Event_Close Exit EndSwitch WEnd Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $tNMTREEVIEW = DllStructCreate($tagNMTREEVIEW, $lParam) Local $hWndFrom, $iCode, $tNMHDR $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case GUICtrlGetHandle($hTreeView) Switch $iCode Case $TVN_SELCHANGINGA, $TVN_SELCHANGINGW Local $tInfo = DllStructCreate($tagNMMOUSE, $lParam) Local $hItem = DllStructGetData($tNMTREEVIEW, 'NewhItem') If $hItem = 0 Then Return 1 Local $sTree = _GUICtrlTreeView_GetTree($hTreeView, $hItem) ConsoleWrite($sTree & @CR) EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY -
Ich würde es so machen:
Spoiler anzeigen
AutoIt
Alles anzeigenFunc _TreeView_Fahrtenbuch() Local $hJahr, $hMonat, $sSeparatorChar = Opt("GUIDataSeparatorChar") _GUICtrlTreeView_DeleteAll($hTreeView) For $i = 1 To $a_FahrtenbuchDaten[0][0] $hJahr = _GUICtrlTreeView_FindItem($hTreeView, $a_FahrtenbuchDaten[$i][0]) ; <- nach dem Jahr suchen If $hJahr = 0 Then ; wenn Jahr noch nicht vorhanden, dann... $hJahr = _GUICtrlTreeView_Add($hTreeView, 0, $a_FahrtenbuchDaten[$i][0]) ; Jahr erstellen EndIf $hMonat = _GUICtrlTreeView_FindItemEx($hTreeView, $a_FahrtenbuchDaten[$i][0] & $sSeparatorChar & $a_FahrtenbuchDaten[$i][1]) If $hMonat = 0 Then ; wenn Monat noch nicht vorhanden, dann... $hMonat = _GUICtrlTreeView_AddChild($hTreeView, $hJahr, $a_FahrtenbuchDaten[$i][1]) ; Monat erstellen EndIf _GUICtrlTreeView_AddChild($hTreeView, $hMonat, $a_FahrtenbuchDaten[$i][2]) ; Tag erstellen Next _GUICtrlTreeView_Expand($hTreeView) EndFunc -
-
Die Funktion die mit der TimerUdf aufgerufen wird, funktioniert auch während auf ein externes Programm gewartet wird.
Hier im Beispiel auf Notepad:Spoiler anzeigen
AutoIt
Alles anzeigen#include <Timers.au3> $hGui = GUICreate('Test', 320, 120, 10, 10) DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 0) ; auf den klassischen Style umschalten $idProgress = GUICtrlCreateProgress(10, 10, 300, 30) DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 7) ; zurück zum Standard-Windowsstyle GUISetState() WinSetOnTop($hGui, '', 1) $iTimer = TimerInit() $iEndTime = 10000 ; <- Zeit in Millisekunden, bis Notepad automatisch geschlossen wird _Timer_SetTimer($hGui, 20, '_UpdateProgress') RunWait('Notepad.exe') ; <- wartet auf das beenden von Notepad _Timer_KillAllTimers($hGui) GUIDelete($hGui) Exit Func _UpdateProgress($hWnd, $Msg, $iIDTimer, $dwTime) #forceref $hWnd, $Msg, $iIDTimer, $dwTime Local $iTimerDiff = TimerDiff($iTimer) If $iTimerDiff > $iEndTime Then Return ProcessClose('Notepad.exe') Local $iPercent = Int(100 / $iEndTime * $iTimerDiff) GUICtrlSetData($idProgress, $iPercent) EndFunc -
Als Anfänger-Projekt ist das gut geeignet! Man lernt mit solchen kleinen Programmen sehr viel.
Erst mal ein paar Fehler, die Dir passiert sind:
1. _FileCreate ist überflüssig, weil FileOpen die Datei erstellt, wenn sie noch nicht vorhanden ist.
2. FileOpen, ohne zweiten Parameter öffnet die Datei nur zum lesen (0 = Lesemodus (Standard), 2 = Schreibmodus)
3. FileWrite musst Du dann mit dem Handle von FileOpen benutzen, anstatt dem Dateinamen.
4. FileMove erst nachdem Du das Handle ($offen) mit FileClose wieder geschlossen hast, ansonsten liegt noch ein Lock auf der Datei.Du kannst das aber noch verbessern/ausbauen. Hier mal ein paar Vorschläge/Anregungen:
1. Den Speichern-Button nur aktivieren, wenn bereits ein Text eingegeben wurde.
2. Den Benutzer den Dateinamen über einen Dialog auswählen lassen. Stichwort: FileSaveDialog()
3. Fehlerbehandlung: wenn der Benutzer bereits den Dateinamen mit Endung eingibt, dann nicht mehr ".txt" anfügen.
4. Fehlerbehandlung: wenn FileOpen fehlschlägt (z.B. wegen fehlender Schreibrechte), wird "-1" zurückgegeben, statt des Handle. Das kann man mit If...Then abfangen. -
Ich hatte auch schon die dritte Version des Starplayers angefangen gehabt. Aber auch die ist von irgendwann 2010.
Ich müßte das Script erstmal an die neue Version von AutoIt anpassen. Momentan befinde ich mich aber im Urlaub (keine Zeit).
Mittlerweile bin ich auch dabei einen ganz neuen MP3-Player zu schreiben. Das ist aber nur ein Projekt von mehreren und wie immer habe ich zu wenig Freizeit, um das alles fertig zu kriegen.

-
So:
Spoiler anzeigen
[autoit][/autoit] [autoit][/autoit] [autoit]#include <ButtonConstants.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("MouseCoordMode", 2); Die GUI erstellen.
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$GUI = GUICreate("Form1", 600, 500, -1, -1)
GUISetBkColor(0x6791C9)
; Ein Label in der GUI erstellen.
$Label1 = GUICtrlCreateLabel("", 64, 32, 468, 364, BitOR($SS_CENTER, $SS_SUNKEN, $WS_BORDER), $WS_EX_CLIENTEDGE)
GUICtrlSetBkColor($Label1, 0x00FF00)
; Ein Label in der GUI erstellen.
$Label2 = GUICtrlCreateLabel("Nur ein Test", 68, 42, 460, 42, $SS_CENTER)
GUICtrlSetFont($Label2, 18, 800, 0, "Times New Roman")
GUICtrlSetBkColor($Label2, $GUI_BKCOLOR_TRANSPARENT)
; Ein Label in der GUI erstellen.
$Label3 = GUICtrlCreateLabel("Test Test Test Test Test", 68, 92, 460, 42, $SS_CENTER)
GUICtrlSetFont($Label3, 10, 800, 0, "Times New Roman")
GUICtrlSetColor($Label3, 0x0000FF)
GUICtrlSetBkColor($Label3, $GUI_BKCOLOR_TRANSPARENT)
; Einen Button in dem Label erstellen.
$Button1 = GUICtrlCreateButton("Klick mich.", 176, 176, 209, 81)
GUICtrlSetBkColor($Button1, 0xFF0000)
; Die GUI anzeigen.
GUISetState(@SW_SHOW, $GUI)GUICtrlSetState($Button1, $GUI_ONTOP) ; <- Wichtig! Diese Zeile muss NACH GuiSetState stehen!
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While 1
[/autoit]
$Msg = GUIGetMsg()
Switch $Msg
Case $GUI_EVENT_CLOSE
ExitLoop
Case $Button1
MsgBox(0, "", "Treffer !", 1)
EndSwitch
WEnd
GUIDelete($GUI)
Exit -
Bei Deiner Funktion fehlt aber das/der Filehandle/-name.
-
-
Wenn Du AutoIt lernen willst, warum bestehst Du unbedingt auf die ImageSearch.udf?
Fang mit den Grundlagen an und wenn Du Fragen hast, dann erstelle hier einen Thread, beschreibe genau wo Du nicht weiter weißt und vor allem poste Dein bisheriges Script (kein Screenshot vom Script). -
Bevor man auf eine neue Version von AutoIt updated, sollte man sich die History mal durchlesen:
ZitatChanged: Excel UDF was re-written. Functions and/or parameters have been renamed, removed or added. THIS IS A SCRIPT BREAKING CHANGE.
-
Nur mal so nebenbei, wie ich das gelöst hätte:
Spoiler anzeigen
[autoit][/autoit] [autoit][/autoit] [autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$iNumber = 2162160
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$iTimer = TimerInit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$iCount = _GetCombCount($iNumber)
ConsoleWrite('Count: ' & $iCount & ', Time (ms): ' & TimerDiff($iTimer) & @CR)$iTimer = TimerInit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$aDivider = _GetComb($iNumber)
ConsoleWrite('Count: ' & UBound($aDivider) & ', Time (ms): ' & TimerDiff($iTimer) & @CR)For $i = 0 To UBound($aDivider) - 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$aDivider[$i] = Number($aDivider[$i])
Next
_ArraySort($aDivider)
_ArrayDisplay($aDivider)Func _GetCombCount($iNumber)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $sDivider = '', $iTmp
For $i = 1 To Sqrt($iNumber)
If Not Mod($iNumber, $i) Then $iTmp += 2
Next
Return $iTmp
EndFuncFunc _GetComb($iNumber)
[/autoit]
Local $sDivider = '', $iTmp
For $i = 1 To Sqrt($iNumber)
$iTmp = $iNumber / $i
If Not Mod($iNumber, $i) Then $sDivider &= $i & ';' & $iTmp & ';'
Next
Return StringSplit(StringTrimRight($sDivider, 1), ';', 2)
EndFunc -
Du benutzt überhaupt nicht den OnEventMode, sondern den MsgLoopMode!
Im OnEventMode gibt es diese Schleife (außer vielleicht eine Sleep-Schleife) gar nicht.
Dort gibt man mit GuiCtrlSetOnEvent eine Funktion an, die bei Mausklick aufgerufen wird.
Sieh Dir mal entsprechende Beispiele an. Es gibt hier im Forum zahlreiche davon. -
Wie viele sollen denn geladen werden?
Oder ist das keine feste Anzahl?
In dem Fall wäre der OnEventMode besser geeignet, weil man dort eine Funktion als Event angeben kann und mit @GUI_CtrlId die entsprechende ControlID erhält.
Beim dynamischen erstellen der Pic-Controls ist es aber immer ratsam diese auch wieder zu löschen, bevor man wieder neue erstellt. Ansonsten gibt's irgendwann einen Absturz (Anzahl der GUI-Elemente ist begrenzt). -
So wird für jede Bildvorschau ein neues Pic-Control erstellt. Das führt irgendwann zum Absturz des Scripts.
Abhilfe: Das Pic-Control nur einmal (am Anfang) erstellen und dann einfach nur das geladene Bild dem Control zuweisen.
So nebenbei löst das auch das Problem mit der Abfrage in der MsgLoop.