ControlSend benötigt kein Handle, sondern den Titel.
Lass die Zeile mit WinGetHandle weg und benutze den Titel, dann klappt das auch. Du kannst dann auch die Sleeps weglassen.
Beiträge von Oscar
-
-
Ah! Vielen Dank!
Die Hilfe ist zwar, Microsoft typisch, sehr spärlich was Beispiele angeht, aber so als grobe Übersicht ganz hilfreich.
-
Wo wir gerade dabei sind: Gibt es eigentlich irgendwo eine Übersicht über alle Methoden, die Excel unterstützt?
Ich hab mir da ja was zusammen gesucht, aber da gibt es doch bestimmt noch mehr.
-
Der Link ist klasse! Ich habe nicht gewusst, dass man Rekursion so leicht erklären kann.
-
Es freut mich doch immer wieder, wenn jemand mein Script gebrauchen kann.
Ich habe noch ein paar Änderungen vorgenommen (siehe oben).
Zum Thema lehrreich:
Für diejenigen, die noch nie mit rekursiven Funktionen gearbeitet haben, wird die Funktion _ReFileListToString() ein großes Fragezeichen darstellen. Diese Funktion ruft sich selbst mehrfach auf. Man muss beim programmieren solcher Funktionen sehr auf die Abbruchbedingungen achten, sonst führt das schnell in eine Endlosschleife. -
Stimmt! Man sollte auch abfragen, ob das erzeugen des Objekts auch geklappt hat. Könnte ja sein, das jemand gar kein Excel (in dem Fall die XP-Version) installiert hat. Danke!
Hier habe ich nochmal ein Beispiel, wo das eingebaut ist und in dem noch einige Befehle drin sind, wie man die einzelnen Spalten, Zeilen und Zellen beeinflussen kann (Schriftart, Farbe, Hintergrundfarbe, Größe, Breite usw.).
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstants.au3>$Form1 = GUICreate('Embedded Excel', 600, 600, -1, -1)
[/autoit] [autoit][/autoit] [autoit]
$Obj1 = ObjCreate('OWC10.Spreadsheet')
If Not IsObj($Obj1) Then Exit MsgBox(0, 'Fehler', 'Excel-Objekt konnte nicht erstellt werden.')$Obj1_ctrl = GUICtrlCreateObj($Obj1,50, 50,500,500)
[/autoit] [autoit][/autoit] [autoit]With $Obj1
[/autoit] [autoit][/autoit] [autoit]
.AutoFit=0
.DisplayGridlines=-1
.DisplayHorizontalScrollBar=0
.DisplayTitleBar=0
.DisplayToolbar=0
.DisplayVerticalScrollBar=0
.EnableEvents=-1
.MoveAfterReturn=-1
.RightToLeft=0
.ViewableRange='1:26'
EndWith
With $Obj1
.range("A1:D1").Font.Size = 16
.range("A1:D1").Font.Color = 0xffffff
.range("A1:D1").Font.Bold = TRUE
.range("A1:D1").Interior.Color = 0x8888ff
.range("C1:D1").Interior.Color = 0xff8888
.range("A1:D1").HorizontalAlignment = -4108; -4108 = center, -4131 = left, -4152 = right
.range("A1:D1").VerticalAlignment = -4108; -4108 = center, -4107 = bottom, -4130 = justify, -4160 = top
.Columns("A:G").ColumnWidth = 14
.Rows("1:1").RowHeight = 25
.range('A1').value = 'aaa'
.range('A2').value = '65'
.range('A3').value = '75'
.range('B1').value = 'bbb'
.range('C1').value = 'ccc'
.range('D1').value = 'ddd'
.range('A19').value = 'SUM(A2:A18)'
.range('A20').formula = '=SUM(A2:A18)'
.range('A1').activate
EndwithGUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd -
Meinst Du sowas:
Spoiler anzeigen
[autoit]
[/autoit]
#include <GUIConstants.au3>
Opt('TrayMenuMode', 1) ; Tray-Standardmenü ausschalten
Opt('TrayAutoPause', 0) ; AutoPause ausschalten
Global $TrayShow = TrayCreateItem('Test anzeigen') ; Tray-Menü erstellen
Global $TrayExit = TrayCreateItem('Beenden') ; Tray-Menü erstellen
Global $GUI = GUICreate('Test', 640, 180, -1, -1) ; Fenster erstellen
GUISetState() ; GUI-Fenster anzeigen
While 1 ; MessageLoop-Schleife
Switch GUIGetMsg() ; Anhand des eingetretenen GUI-Ereignisses die entsprechenden Befehle ausführen
Case $GUI_EVENT_MINIMIZE ; Benutzer hat auf Minimieren geklickt
Opt('TrayIconHide', 0) ; Tray-Menü anzeigen
TraySetIcon(@SystemDir & '\shell32.dll', -24) ; Icon für Tray-Menü setzen
GUISetState(@SW_HIDE, $GUI) ; Fenster verstecken
While 2 ; Tray-Menü-Schleife
Switch TrayGetMsg() ; Anhand des eingetretenen Tray-Ereignisses die entsprechenden Befehle ausführen
Case $TrayShow ; wurde 'Anzeigen' aufgerufen, dann...
Opt('TrayIconHide', 1) ; Tray-Menü wieder verstecken
GUISetState(@SW_SHOW, $GUI) ; Fenster anzeigen
GUISetState(@SW_RESTORE, $GUI) ; und wiederherstellen (minimieren rückgängig machen)
ExitLoop ; Tray-Menü-Schleife verlassen
Case $TrayExit ; Benutzer hat 'Beenden' ausgewählt
Exit ; Programm beenden
EndSwitch
WEnd
Case $GUI_EVENT_CLOSE ; Benutzer hat auf 'X' geklickt oder 'ESC' gedrückt
Exit ; Programm beenden
EndSwitch
Wend -
Ahh...verstehe! Ja, da hast Du nicht ganz Unrecht. Vor dem jeweiligen Eintrag, ok, aber warum vor dem ersten Array-Eintrag?
Hat vermutlich damit zu tun, dass man auch ein Filehandle übergeben kann und der Author der Funktion mit dem @CRLF am Anfang das Array davon abtrennen will. Wäre aber ein wenig schlampig programmiert.Was soll's, Du musst die Funktion ja nicht benutzen. Schreib Dir einfach Deine eigene.
-
Man könnte aber auch...
[autoit]
[/autoit]
#Include <Date.au3>
$date = StringLeft(_Now(), 10)...so anfangen. Den Rest dann mit FileMove(), wie maycontainnuts bereits schrieb.
-
McPoldy: Vorsicht mit Vergleichsmessungen. Hier spielt nicht nur das Script eine Rolle. Und auch auf ein und demselben PC, also mit der gleichen Hardware, sollte man den Festplatten-Cache nicht vergessen. Bei mir ergibt sich ein gewaltiger Unterschied, ob man das Script mit z.B. C:\ einmal aufruft oder gleich zweimal. Beim zweiten Mal scheint es so, als würde ein Großteil der Daten aus dem Cache gelesen werden, denn die Zeiten sind deutlich kürzer.
Das sollte man bei Messungen berücksichtigen.
-
Wenn Du Dir mal die Funktion _FileReadToArray anschaust, dann kannst Du erkennen, warum dort ein @CRLF eingefügt wird.
Ich verstehe aber Dein Problem damit nicht bzw. was ist jetzt Deine Frage? -
Du willst alle *.jac Dateien in *.exe Dateien umbenennen? Habe ich das richtig verstanden?
Das würde so gehen:
[autoit]
[/autoit]
FileMove(@ScriptDir & '\*.jac', @ScriptDir & '\*.exe') -
Das Programm scannt ein auswählbares Laufwerk/Verzeichnis komplett durch (rekursiv, also auch alle Unterverzeichnisse) und zeigt anschließend alle Dateien (inkl. Pfad) an, die sich darin befinden. Außerdem wird die Gesamtgröße des Ordners in GB/MB/KB (je nach Größe), sowie in Bytes angezeigt. Man kann in der Ergebnisliste suchen, die Liste oder Teile davon in die Zwischenablage kopieren bzw. abspeichern und es gibt ein Datei-Eigenschafts-Fenster, indem man das Erstellungsdatum/-Uhrzeit sowie die Dateiattribute ändern kann. Dateien können nun auch in den Papierkorb verschoben werden.
Der Sourcecode, das Executable, die Icons und die komplette History befinden sich im ZIP-Archiv im Dateianhang.
Version 1.5.0.1 ( 15.02.2008 )
- Einige kleinere Codeänderungen
- Button-Icons jetzt in 48x48 und komplett extern
- Obere Ergebniszeile ist jetzt ein ReadOnly-Input, sodass man das Ergebnis markieren/kopieren kann.
- Eigenes Fenster für Programm-Infos hinzugefügt
- Delete-Button sowie Eintrag im Menü und Traymenü hinzugefügt
- Fenster hinzugefügt: 'Sollen diese Dateien wirklich in den Papierkorb verschoben werden?' -
@Dustin: Diese Frage hat Dir Pee bereits in OffTopic beantwortet. Was soll das also, jetzt auch noch hier (IOM2/Bug-Report, was sowieso das falsche Forum ist) zu fragen?
-
Die Variante mit Array hatten wir ja schon. Die ist, aufgrund des ReDims für jeden Eintrag, unerträglich langsam. Da gibt es auch kaum was zu optimieren.
-
Das stimmt schon, aber im Ursprungsposting ging es ja um ein Array mit allen Dateien inkl. Unterordner. Hab mein Script in Posting '10' entsprechend angepasst.
Die Idee mit dem String ist mir gekommen, als ich die 'Beschränkung' für String-Datentypen gelesen hatte (Can contain strings of up to 2147483647 characters). Ich bin mir nur nicht ganz sicher wegen der Rekursionstiefe von AutoIt (=5100). Kann man diese Grenze sprengen oder tritt vorher eine Limitierung durch das Dateisystem auf? -
Ich habe noch eine andere Version geschrieben, die einen String als Speicher benutzt. Jetzt kann man auch den Hauptpfad angeben, denn dieses Script ist richtig schnell.
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#Include <GUIConstants.au3>
#Include <File.au3>
#Include <Array.au3>GUICreate('Recursive FileList', 800, 600, -1, -1)
[/autoit] [autoit][/autoit] [autoit]
$label = GUICtrlCreateLabel('', 5, 10, 790, 30)
$edit1 = GUICtrlCreateEdit('', 5, 45, 790, 540)
GUISetState()Global $Files = '', $count
[/autoit] [autoit][/autoit] [autoit]
Global $fpath = 'C:\Programme\AutoIt3\'GUICtrlSetData($label, $fpath)
[/autoit] [autoit][/autoit] [autoit]$start = TimerInit()
[/autoit] [autoit][/autoit] [autoit]_FileListToString($fpath)
[/autoit] [autoit][/autoit] [autoit]$diff = TimerDiff($start)
[/autoit] [autoit][/autoit] [autoit]GUICtrlSetData($edit1, StringReplace($Files, '|', @CRLF))
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetData($label, Round($diff/1000, 3) & ' sek. / ' & $count & ' Dateien')Global $aFileList = StringSplit($Files, '|'); Array $aFileList enthält Auflistung aller Dateien inkl. Pfad
[/autoit] [autoit][/autoit] [autoit]
;_ArrayDisplay($aFileList)While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEndFunc _FileListToString($path)
[/autoit] [autoit][/autoit] [autoit]
Local $hSearch, $sFile
$hSearch = FileFindFirstFile($path & '*.*')
If $hSearch <> -1 Then
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then
SetError(0)
ExitLoop
EndIf
If StringInStr(FileGetAttrib($path & $sFile), "D") <> 0 Then ContinueLoop
$count += 1
$Files &= $path & $sFile & '|'
WEnd
FileClose($hSearch)
EndIf
_ReFileListToString($path)
EndFuncFunc _ReFileListToString($path)
[/autoit]
GUICtrlSetData($label, ' ' & $path)
Local $dFileList = _FileListToArray($path, '*', 2)
If IsArray($dFileList) Then
For $i = 1 To $dFileList[0]
Local $hSearch, $sFile
$hSearch = FileFindFirstFile($path & $dFileList[$i] & "\" & '*.*')
If $hSearch <> -1 Then
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then
SetError(0)
ExitLoop
EndIf
If StringInStr(FileGetAttrib($path & $dFileList[$i] & "\" & $sFile), "D") <> 0 Then ContinueLoop
$count += 1
$Files &= $path & $dFileList[$i] & "\" & $sFile & '|'
WEnd
FileClose($hSearch)
EndIf
_ReFileListToString($path & $dFileList[$i] & '\')
Next
EndIf
EndFuncEdit: Es ging ja darum ein Array mit den Dateien zu erstellen, deswegen habe ich das mal entsprechend angepasst.
-
AspirinJunkie: Ja, das mit _ArrayAdd ist mir auch schon aufgefallen und das habe ich bei meiner Version bereits korrigiert und das führt auch schon zu einer Geschwindigkeitssteigerung.
Deine Version ist wirklich schnell, aber mit der Anzeige stimmt etwas nicht. Die geht nur bis Element 4094 (bei C:\Dokumente und Einstellungen...). Das Script scannt aber alles durch, das kann man ja anhand des SplashText sehen.
-
Es hat mich mal interessiert, wie lange AutoIt für so eine rekursive Liste benötigt.
Eines vorweg: Benutzt das Script nicht im Hauptpfad. Das dauert ewig. Bei moderateren Pfadverhältnissen funktioniert es aber recht gut.
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#Include <File.au3>
#Include <Array.au3>Global $aFileList[1]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $fpath = 'D:\AutoIt\'
SplashTextOn('Recursive FileList', $fpath, 800, 50, -1, -1, 52)
$fFileList = _FileListToArray($fpath, '*.*', 1)
If IsArray($fFileList) Then
$prev = UBound($aFileList)-1
ReDim $aFileList[$prev+1+$fFileList[0]]
For $j = 1 To $fFileList[0]
$aFileList[$prev+$j] = $fpath & $fFileList[$j]
Next
EndIf
_ReFileListToArray($fpath)
SplashOff()
_ArrayDisplay($aFileList,'$FileList')Func _ReFileListToArray($path)
[/autoit]
ControlSetText('Recursive FileList', '', 'Static1', ' ' & UBound($aFileList)-1 & ' ' & $path)
Local $dFileList = _FileListToArray($path, '*', 2)
If IsArray($dFileList) Then
For $i = 1 To $dFileList[0]
$fFileList = _FileListToArray($path & $dFileList[$i] & '\', '*.*', 1)
If IsArray($fFileList) Then
$prev = UBound($aFileList)-1
ReDim $aFileList[$prev+1+$fFileList[0]]
For $j = 1 To $fFileList[0]
$aFileList[$prev+$j] = $path & $dFileList[$i] & '\' & $fFileList[$j]
Next
EndIf
_ReFileListToArray($path & $dFileList[$i] & '\')
Next
EndIf
EndFuncVerbesserungsvorschläge bzw. Geschwindigkeitsoptimierungen sind sehr willkommen.
Edit: Diese Version ist etwas schneller.
-
_FileListToArray() gibt alle (bzw. entsprechend dem Filter) Dateien und Ordner in einem Array zurück. Bei den Ordnern müßtest Du dann noch jeweils die Unterordner und Dateien auslesen, dann dort wieder Ordner und Dateien usw. bis alle Ordner durchsucht sind. Nicht ganz einfach, aber machbar.