Es gibt wieder eine neue Version (siehe Post#1).
Ich habe eine umfangreiche Suchfunktion eingebaut (mit StringInStr- und StringRegExp-Suche). Außerdem kann man Verknüpfungen erstellen und einige kleinere Fehler sind nun behoben.
Es gibt wieder eine neue Version (siehe Post#1).
Ich habe eine umfangreiche Suchfunktion eingebaut (mit StringInStr- und StringRegExp-Suche). Außerdem kann man Verknüpfungen erstellen und einige kleinere Fehler sind nun behoben.
Klar! Ganz einfach:
[autoit]
#include <Array.au3>
$string = '123'
$array = StringSplit($string, '', 2)
$array = _ArrayPermute($array)
_ArrayDisplay($array)
Ich hab's mal korrigiert (Kommentare):
#include <FTP.au3>
$server = 'server'
$username = 'bn'
$pass = 'pw'
$Dateipfad = @ScriptDir & '\'
$Dateiname = '_test1.au3'
$hFTPOpen = _FTPOpen($server) ; <- Hier die Variable $Server
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$hFTPConnect=_FTPConnect($hFTPOpen, $server, $username, $pass)
if @error then msgbox(0,"Error","Connect", 3)
_FTPMakeDir($hFTPConnect, 'Psychware') ; <- Hier kann ein Fehler auftreten, wenn das Verzeichnis bereits existiert
if @error then msgbox(0,"Error","MakeDir", 3)
_FtpPutFile($hFTPConnect, $Dateipfad & $Dateiname, 'Psychware/' & $Dateiname) ; <- Der Remotepfad muss auch den Dateinamen enthalten
if @error then msgbox(0,"Error","PutFile 3", 3)
_FTPClose($hFTPOpen) ; <- Close nicht vergessen
[/autoit]Ich habe Dir mal ein Auswahl-Dialog erstellt, bei dem man ein RegExp-Pattern angeben kann.
In dem Beispiel werden alle Dateien angezeigt, die nicht diesem Muster "9935_x.txt" (wobei das x für beliebige Zeichen steht) entsprechen:
$sFiles = _FileOpenDialog('Datei(en) auswählen', @ScriptDir, '^9935_.*\.txt', 0)
If Not @error Then MsgBox(0, 'Datei(en):', $sFiles)
Func _FileOpenDialog($sTitle, $sInitDir, $sPattern = '.*', $iOptions = 0, $hWnd = 0)
Local $iOldOpt, $hSearch, $hGui, $hFileList, $hFile, $sDate, $iSize, $hOk, $hCancel, $aMsg
If Not FileExists($sInitDir) Then Return SetError(1, 0, '')
If StringRight($sInitDir, 1) <> '\' Then $sInitDir &= '\'
$hSearch = FileFindFirstFile($sInitDir & '*.*')
If $hSearch = -1 Then Return SetError(2, 0, '')
$iOldOpt = Opt('GUIOnEventMode', 0)
$hGui = GUICreate($sTitle, 600, 400, -1, -1, BitOR(-2134245376, 262144), Default, $hWnd) ; -2134245376 = $GUI_SS_DEFAULT_GUI, 262144 = $WS_SIZEBOX
$hFileList = GUICtrlCreateListView('Name|Änderungsdatum|Größe', 10, 10, 580, 350, BitOR(8, BitXOR(BitAND($iOptions, 4), 4))) ; 8 = $LVS_SHOWSELALWAYS, 4 = $LVS_SINGLESEL
While True
$hFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If @extended Or StringRegExp($hFile, $sPattern) Then ContinueLoop
$sDate = StringRegExpReplace(FileGetTime($sInitDir & $hFile, 0, 1), '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})', '$3.$2.$1 $4:$5:$6')
$iSize = FileGetSize($sInitDir & $hFile)
GUICtrlCreateListViewItem($hFile & '|' & $sDate & '|' & $iSize, $hFileList)
WEnd
FileClose($hSearch)
GUICtrlSendMsg($hFileList, 4126, 0, -1) ; 4126 = $LVM_SETCOLUMNWIDTH, -1 = $LVSCW_AUTOSIZE
$hOk = GUICtrlCreateButton('Ok', 430, 370, 65, 22)
GUICtrlSetResizing(-1, 1 + 64)
$hCancel = GUICtrlCreateButton('Abbrechen', 500, 370, 90, 22)
GUICtrlSetResizing(-1, 1 + 64)
GUISetState()
While True
$aMsg = GUIGetMsg(True)
Switch $aMsg[1]
Case $hGui
Switch $aMsg[0]
Case $hCancel, -3 ; -3 = $GUI_EVENT_CLOSE
GUIDelete($hGui)
Opt('GUIOnEventMode', $iOldOpt)
Return SetError(3, 0, '')
Case $hOk
$sSelect = ControlListView($hGui, '', $hFileList, 'GetSelected', 1)
If $sSelect <> '' Then
$aItems = StringSplit($sSelect, '|')
$sSelect = ''
For $i = 1 To $aItems[0]
$sSelect &= ControlListView($hGui, '', $hFileList, 'GetText', $aItems[$i]) & '|'
Next
$sSelect = StringTrimRight($sSelect, 1)
EndIf
GUIDelete($hGui)
Opt('GUIOnEventMode', $iOldOpt)
Return $sSelect
EndSwitch
EndSwitch
WEnd
EndFunc
Das geht meines Wissens nicht!
Zumindest nicht mit FileOpenDialog. Da müsstest Du Dir eine eigene Dialog-GUI basteln.
Meinst Du so:
[autoit]$Fileopen = FileOpenDialog($message, @HomeDrive, "Textdatei (9935_*.txt)", 1 + 4)
[/autoit]Irgendwie ist das hier sowieso nicht so wirklich ein Tutorial.
Ich hab's mal nach H&U verschoben.
Wenn es Dir egal ist, welche Taste gedrückt wurde:
#include <GUIConstantsEx.au3>
#include <Timers.au3>
$hGui = GUICreate('Test', 400, 300)
GUICtrlCreateLabel('Maus bewegen oder Taste drücken', 10, 10, 350, 25)
$hLabel = GUICtrlCreateLabel('', 40, 80, 350, 25)
GUICtrlSetFont(-1, 12)
GUISetState()
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
If _Timer_GetIdleTime() < 250 Then
If GUICtrlRead($hLabel) = '' Then GUICtrlSetData($hLabel, 'Maus bewegt oder Taste gedrückt')
Else
If GUICtrlRead($hLabel) <> '' Then GUICtrlSetData($hLabel, '')
EndIf
WEnd
Solche Fragen gehören hier nach "Hilfe & Unterstützung" und nicht nach "Tutorials"!
Ich habe bereits Deinen anderen Beitrag (Inputboxen mit Variablen) mit fast der gleichen Frage hierher verschoben.
Ich denke, dass das hier im C++ Forum besser aufgehoben ist. Im Projekte-Forum geht es ja um AutoIt.
[verschoben]
Bei mehreren GUIs brauchst Du den advanced Modus von GUIGetMsg, um die einzelnen GUIs getrennt auswerten zu können.
Ich würde Dir aber raten gleich auf den OnEvent-Mode zu wechseln. Der ist bei mehreren GUIs deutlich einfacher zu handhaben und es gibt auch nicht die Probleme mit der dynamischen Prozessorlast.
Dein Beispiel kann so keiner nachvollziehen, weil Du absolute Pfade (die gibt es so nur bei Dir) benutzt und die Bilder nicht mitlieferst. Auch das verwenden von Nicht-Standard-Fonts kann zu Anzeigeproblemen bei anderen Benutzern führen.
Jetzt gibt es einen Geschwindigkeitsrausch. ![]()
Die Funktion "_GUICtrlListView_AddArrayEx" ist sowas von schnell gegenüber dem einzelnen erstellen mit "GUICtrlCreateListViewItem", dass ich das kaum für möglich gehalten hatte.
Eigentlich wollte ich eine Art Buffer für die Dateilisten einbauen und brauchte dafür eine Funktion, die auch den Image-Index mit übernimmt. So habe ich dann die Original-Funktion modifiziert und rausgekommen ist das.
Jetzt weiss ich gar nicht, ob ich den Buffer noch zusätzlich einbauen soll. Das testen, ob das aktuelle Verzeichnis im Buffer vorhanden ist, könnte da ja schon fast länger dauern. ![]()
Naja, schaut es euch an. Neue Version in Post#1.
Siehe mein Edit in Post#1.
Das funktioniert bei mir einwandfrei:
[autoit]
#RequireAdmin
DirCreate(@ProgramFilesDir & '\test')
Sind das alles AutoIt-Skripte?
Wenn ja, dann könntest Du die doch als Skript (zusätzlich gepackt) verschicken und dann vor Ort compilieren.
So geht's:
$i = 100
$du = 100
$d = 0
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 623, 442, 192, 124)
DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 0) ; auf den klassischen Style umschalten
$Progress1 = GUICtrlCreateProgress(40, 240, 150, 17)
GUICtrlSetColor(-1, 0xFF0000)
GUICtrlSetBkColor(-1, 0xC0C0C0)
$Progress2 = GUICtrlCreateProgress(264, 240, 150, 17)
GUICtrlSetColor(-1, 0x3D95FF)
DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 7) ; zurück zum Standard-Windowsstyle
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
$a = (Chr(Random(97, 122, 1)))
$b = (Chr(Random(97, 122, 1)))
If $a = "w" Or $a = "a" Then
If $du <= 0 Then
MsgBox(0, "", "Gewonnen")
$i = 100
$du = 100
EndIf
If $i <= 0 Then
MsgBox(0, "", "Game Over")
$i = 100
$du = 100
EndIf
If $d = 2 Then $i = $i - 1
If $d = 1 Then $du = $du - 1
If Not ($du >= 0) Then MsgBox(0, "", "Gewonnen")
EndIf
If $d = 2 Then
$d = -1
EndIf
$d = $d + 1
GUICtrlSetData($Progress1, $i)
GUICtrlSetData($Progress2, $du)
WEnd
Oder meine Funktion ("_RecursiveFileListToArray") benutzen. Dort kann man ein RegExp-Pattern angeben:
#include <Array.au3>
$array = _RecursiveFileListToArray('c:\', '.*(csv|txt).*', 1)
_ArrayDisplay($array)
;===============================================================================
; Function Name: _RecursiveFileListToArray($sPath[, $sPattern][, $iFlag][, $iFormat][, $iRecursion][, $sDelim])
; Description:: gibt Verzeichnisse (rekursiv) und/oder Dateien zurück, die einem RegExp-Pattern entsprechen
; Parameter(s): $sPath = Startverzeichnis
; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
; $iFlag = Auswahl
; 0 = Dateien & Verzeichnisse
; 1 = nur Dateien
; 2 = nur Verzeichnisse
; $iFormat = Rückgabeformat
; 0 = String
; 1 = Array mit [0] = Anzahl
; 2 = Nullbasiertes Array
; $iRecursion = Verzeichnisse rekursiv durchsuchen
; 0 = Nein
; 1 = Ja
; $sDelim = Trennzeichen für die String-Rückgabe
; Requirement(s): AutoIt 3.3.0.0
; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
; Author(s): Oscar (http://www.autoit.de)
; Anregungen von: bernd670 (http://www.autoit.de)
;===============================================================================
Func _RecursiveFileListToArray($sPath, $sPattern = '', $iFlag = 0, $iFormat = 1, $iRecursion = 1, $sDelim = @CRLF)
Local $hSearch, $sFile, $sReturn = ''
If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
$hSearch = FileFindFirstFile($sPath & '*.*')
If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn)
While True
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If @extended Then
If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
If $iRecursion Then $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0)
ContinueLoop
EndIf
If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
WEnd
FileClose($hSearch)
If $iFormat And $sReturn = '' Then Return StringSplit($sReturn, '', $iFormat)
If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
Return $sReturn
EndFunc
Für _FTPMakeDir und _FTPPutFile brauchst Du das Handle von _FTPConnect und nicht das Handle von _FTPOpen.
Ich habe für einen weiteren XP-Support gestimmt, weil ich viele meiner Skripte auch auf meinem Notebook verwenden will.
Und da das Notebook zu alt (keine Treiber) für Windows7 ist, habe ich auch keine Möglichkeit dort ein Upgrade vorzunehmen.
Von daher werde ich versuchen meine Skripte XP-kompatibel zu halten.