Offenbar versteht keiner den Zusammenhang. ![]()
Du sollst doch kein Beispielscript liefern, sondern nur ein Beispiel, was in Array1 steht, was in Array2 steht und was dann hinterher in Array2 stehen soll.
Offenbar versteht keiner den Zusammenhang. ![]()
Du sollst doch kein Beispielscript liefern, sondern nur ein Beispiel, was in Array1 steht, was in Array2 steht und was dann hinterher in Array2 stehen soll.
So müsste es gehen:
[autoit]
;~ $string = '1231234567567' ; 4 kommt nur einmal vor
$string = '83211234756567' ; 8 und 4 kommen jeweils nur einmal vor
MsgBox(0,0, StringRegExpReplace($string, '(\d+)(.*)\1', '\3'))
Poste mal ein Beispiel. Ich verstehe das Problem nicht.
Dazu brauchst Du doch nur das 1.Array kopieren:
[autoit]
#include <Array.au3>
Dim $array1[6] = [1,6,3,8,3,7]
Dim $array2[8] = [8,3,4,6,1,9,4,5]
$array2 = $array1
_ArrayDisplay($array2)
oder habe ich das falsch verstanden?
na wie habens die anderen verstanden würde auch lieber alles 2 mal lesen statt 1 mal
[Erinnerung an meine Jugend ON]
Also, mein damaliger Deutschlehrer hat in einem ähnlichen Fall (betraf einen meiner Mitschüler) gar nicht erst angefangen das Geschriebene zu berichtigen, sondern hat das ganze Blatt rot durchgekreuzt und darunter geschrieben:
6 (7)
[Erinnerung an meine Jugend OFF]
Und auch nach 5maligem durchlesen bin ich mir nicht sicher, was Du eigentlich willst. Irgendwas mit Hotkeys und 2 Tastaturen.
Du möchtest Hilfe bekommen, zu einem (AutoIt?)-Problem. Da kann man doch als Helfender wenigstens erwarten, dass Du Dir etwas Mühe gibst und die Frage(n) halbwegs verständlich formulierst.
Es ist ja schon schlimm genug, dass einige hier die Groß-/Kleinschreibung und Zeichensetzung ignorieren, aber Deine Ansammlung scheinbar wahllos zusammengewürfelter Wörter erreicht bei mir eine Grenze, wo ich das auch mal aussprechen muss.
Also sorry, für dieses oberlehrerhafte Getue. Ich erwarte auch nicht perfektes Deutsch (bin selbst nicht perfekt), aber etwas mehr Mühe kannst Du Dir schon geben.
Verdammt! Wie habt ihr rausgekriegt, was Harun27 uns mit diesem Post sagen wollte?
Ich will auch ein Upgrade für meine Kristallkugel... ![]()
Hatte gerade mal Lust dazu:
#include <GUIConstantsEx.au3>
GUICreate('Musik-Maker', 640, 240)
GUISetBkColor(0xffffff)
GUICtrlCreatePic('tonleiter.gif', 10, 10, 620, 110)
Global $aNotes[8][2] = [['C', 264], ['D', 297], ['E', 330], ['F', 352], ['G', 396], ['A', 440], ['H', 495], ['C1', 528]]
Global $ahNotes[8]
For $i = 0 To 7
$ahNotes[$i] = GUICtrlCreateLabel($aNotes[$i][0], 116 + $i * 64, 118, 30, 30)
GUICtrlSetColor($ahNotes[$i], 0xffffff)
GUICtrlSetFont(-1, 16, 800)
Next
$hStart = GUICtrlCreateButton('Start', 300, 200, 80, 22)
GUISetState()
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $hStart
GUICtrlSetState($hStart, $GUI_DISABLE)
$aPlay = StringSplit(FileRead('notes.txt'), ' ')
For $i = 1 To $aPlay[0]
_Play($aPlay[$i])
Next
GUICtrlSetState($hStart, $GUI_ENABLE)
EndSwitch
WEnd
Func _Play($sNote)
Local $aPlayPar = StringSplit($sNote, ',')
If Not IsArray($aPlayPar) Then Return
If $aPlayPar[0] <> 2 Then Return
For $i = 0 To 7
If $aPlayPar[1] = $aNotes[$i][0] Then
GUICtrlSetColor($ahNotes[$i], 0xff0000)
Beep($aNotes[$i][1], $aPlayPar[2])
GUICtrlSetColor($ahNotes[$i], 0xffffff)
ExitLoop
EndIf
Next
EndFunc
Die Daten in der Notendatei "notes.txt" müssen in der folgenden Form vorliegen: Note,Länge[Leerzeichen]
Im ZIP-Archiv gibt's auch die Grafik und eine Beispiel-Notendatei.
[Hust] Äh, wenn man einen Verschlüsselungs-Algorithmus schreibt, dann sollte man auch eine Funktion zum Wiederherstellen anbieten, ansonsten ist das Ganze ziemlich sinnfrei.
Und wenn die einzige Sicherheit im Geheimhalten des Algorithmus besteht (kein Passwort), dann ist die Funktion sowieso zum scheitern verurteilt.
Sorry für die harte Kritik, wollte Dich nur anspornen die Verschlüsselung praxisgerechter zu gestalten. ![]()
Und mit Sicherheit gehört es nicht nach "AutoIt/Hilfe & Unterstützung".
[moved to off topic]
Micha_he: Oh, Mist, hast recht, wenn es das Verzeichnis nicht gibt, dann wird die "Fertig."-Meldung nicht angezeigt.
Habe das Script berichtigt und im Post geändert.
Dazu sind dann schon noch einige Anpassungen nötig.
Ich hatte aber gerade Lust dazu und so habe ich daraus mal ein "CopyTool" entwickelt:
Screenshot:
Script:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>
Global $sPath = @ScriptDir
Global $width = 800, $height = 600
Global $hGui = GUICreate('CopyTool', $width, $height, -1, 0)
Global $hInput = GUICtrlCreateInput($sPath, 10, 10, $width - 160, 20, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
Global $hChoose = GUICtrlCreateButton('...', $width - 148, 9, 30, 22)
GUICtrlSetFont(-1, 9, 600, 0, 'Verdana')
Global $hFiles = GUICtrlCreateCheckbox('zeige Dateien', $width - 100, 14, 80, 16)
Global $bFiles = False
Global $hTreeView = GUICtrlCreateTreeView(10, 40, $width - 20, $height - 110, BitOR($GUI_SS_DEFAULT_TREEVIEW, $TVS_CHECKBOXES), $WS_EX_STATICEDGE)
GUICtrlSetFont(-1, 10, 400, 0, 'Arial')
GUICtrlSetBkColor(-1, 0xF8F8F8)
Global $hContextMenu = GUICtrlCreateContextMenu($hTreeView)
Global $hInfo = GUICtrlCreateMenuItem('Informationen', $hContextMenu)
Global $hExpand = GUICtrlCreateMenuItem('alles auseinanderfalten', $hContextMenu)
Global $hCollapse = GUICtrlCreateMenuItem('alles zusammenfalten', $hContextMenu)
Global $hCopy = GUICtrlCreateButton('markierte Dateien/Verzeichnisse kopieren...', 10, $height - 60, 240, 25)
Global $hStatus1 = GUICtrlCreateLabel('', 0, $height - 16, $width / 2, 16, -1, $WS_EX_STATICEDGE)
Global $hStatus2 = GUICtrlCreateLabel('', $width / 2 + 1, $height - 16, $width / 2, 16, -1, $WS_EX_STATICEDGE)
GUISetState()
_TreeViewUpdate($hTreeView)
[/autoit] [autoit][/autoit] [autoit]While True
Switch GUIGetMsg()
Case $hChoose
$sTmp = FileSelectFolder('Verzeichnis auswählen', '', 0, $sPath, $hGui)
If Not @error Then
$sPath = $sTmp
GUICtrlSetData($hInput, $sPath)
_TreeViewUpdate($hTreeView)
EndIf
Case $hFiles
$bFiles = BitAND(GUICtrlRead($hFiles), $GUI_CHECKED) = $GUI_CHECKED
_TreeViewUpdate($hTreeView)
Case $GUI_EVENT_PRIMARYDOWN
$aInfo = GUIGetCursorInfo($hGui)
If $aInfo[4] = $hTreeView Then
$oldGUIDataSeparatorChar = Opt('GUIDataSeparatorChar', '\')
GUICtrlSetData($hStatus1, ' ' & StringReplace(_GUICtrlTreeView_GetTree($hTreeView), '\\', '\'))
Opt('GUIDataSeparatorChar', $oldGUIDataSeparatorChar)
If BitAND(_GUICtrlTreeView_HitTest($hTreeView, $aInfo[0] - 11, $aInfo[1] - 41), 64) Then
$checked = _GUICtrlTreeView_GetChecked($hTreeView, _GUICtrlTreeView_GetSelection($hTreeView))
$hItem = _GUICtrlTreeView_GetFirstChild($hTreeView, _GUICtrlTreeView_GetSelection($hTreeView))
If $hItem And $checked Then _SetChildItemsUnChecked($hTreeView, $hItem)
If $checked Then
$hParent = _GUICtrlTreeView_GetParentHandle($hTreeView, _GUICtrlTreeView_GetSelection($hTreeView))
If $hParent Then _SetParentItemsUnchecked($hTreeView, $hParent)
EndIf
EndIf
EndIf
Case $hInfo
$oldGUIDataSeparatorChar = Opt('GUIDataSeparatorChar', '\')
$TempPath = StringReplace(_GUICtrlTreeView_GetTree($hTreeView), '\\', '\')
Opt('GUIDataSeparatorChar', $oldGUIDataSeparatorChar)
MsgBox(0, 'Informationen', $TempPath & @CRLF & 'Dateigröße: ' & FileGetSize($TempPath) & ' Bytes')
Case $hExpand
_ExpandAll($hTreeView)
Case $hCollapse
_CollapseAll($hTreeView)
Case $hCopy
Global $aItems[_GUICtrlTreeView_GetCount($hTreeView) - 1]
Global $iCheckedCount = 0
$oldGUIDataSeparatorChar = Opt('GUIDataSeparatorChar', '\')
_CheckedItemsToArray($hTreeView)
$sDestDir = FileSelectFolder('Zielverzeichnis auswählen!', '', 3, '', $hGui)
If Not @error Then
GUICtrlSetData($hStatus1, ' Bitte warten! Dateien/Verzeichnisse werden kopiert...')
For $i = 0 To $iCheckedCount - 1
If StringInStr(FileGetAttrib($aItems[$i]), 'D') Then
$sDir = StringRegExpReplace($aItems[$i], '.*(\\.*)', '$1')
GUICtrlSetData($hStatus1, ' Kopiere: ' & $aItems[$i] & ' --> ' & $sDestDir & $sDir)
DirCopy($aItems[$i], $sDestDir & $sDir, 1)
Else
GUICtrlSetData($hStatus1, ' Kopiere: ' & $aItems[$i] & ' --> ' & $sDestDir)
FileCopy($aItems[$i], $sDestDir, 9)
EndIf
Next
GUICtrlSetData($hStatus1, ' Fertig.')
EndIf
Opt('GUIDataSeparatorChar', $oldGUIDataSeparatorChar)
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _CheckedItemsToArray(ByRef $hTreeView)
Local $hFirstItem = _GUICtrlTreeView_GetFirstChild($hTreeView, 1)
_ReadChildItems($hTreeView, $hFirstItem)
If $iCheckedCount = 0 Then Return
ReDim $aItems[$iCheckedCount]
EndFunc ;==>_CheckedItemsToArray
Func _ReadChildItems(ByRef $hTreeView, $hItem)
Do
$hNewItem = _GUICtrlTreeView_GetFirstChild($hTreeView, $hItem)
If $hNewItem Then _ReadChildItems($hTreeView, $hNewItem)
If _GUICtrlTreeView_GetChecked($hTreeView, $hItem) Then
$aItems[$iCheckedCount] = StringReplace(_GUICtrlTreeView_GetTree($hTreeView, $hItem), '\\', '\')
$iCheckedCount += 1
EndIf
$hItem = _GUICtrlTreeView_GetNextChild($hTreeView, $hItem)
Until $hItem = 0
EndFunc ;==>_ReadChildItems
Func _SetParentItemsUnchecked(ByRef $hTreeView, $hItem)
Local $hParent = _GUICtrlTreeView_GetParentHandle($hTreeView, $hItem)
If $hParent Then _SetParentItemsUnchecked($hTreeView, $hParent)
_GUICtrlTreeView_SetChecked($hTreeView, $hItem, False)
EndFunc ;==>_SetParentItemsUnchecked
Func _SetChildItemsUnChecked(ByRef $hTreeView, $hItem)
Do
$hNewItem = _GUICtrlTreeView_GetFirstChild($hTreeView, $hItem)
If $hNewItem Then _SetChildItemsUnChecked($hTreeView, $hNewItem)
_GUICtrlTreeView_SetChecked($hTreeView, $hItem, False)
$hItem = _GUICtrlTreeView_GetNextChild($hTreeView, $hItem)
Until $hItem = 0
EndFunc ;==>_SetChildItemsUnChecked
Func _ExpandAll(ByRef $hTreeView)
_GUICtrlTreeView_Expand($hTreeView)
EndFunc ;==>_ExpandAll
Func _CollapseAll(ByRef $hTreeView)
_GUICtrlTreeView_Expand($hTreeView, 0, False)
EndFunc ;==>_CollapseAll
Func _TreeViewUpdate(ByRef $hTreeView)
GUICtrlSetData($hStatus1, ' Bitte warten! Verzeichnis wird eingelesen...')
GUICtrlSetData($hStatus2, '')
$Timer = TimerInit()
Local $aCount = _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath, $bFiles)
If Not @error Then
$msg = ' Benötigte Zeit: ' & Round(TimerDiff($Timer) / 1000, 3) & ' sek.'
$msg &= ' | ' & $aCount[1] & ' Datei(en) und ' & $aCount[0] & ' Verzeichniss(e)'
GUICtrlSetData($hStatus2, $msg)
EndIf
GUICtrlSetData($hStatus1, ' Fertig.')
EndFunc ;==>_TreeViewUpdate
; Beispiel Ende
;===============================================================================
; Function Name: _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath, $bFiles)
; Description:: erstellt ein TreeView mit Verzeichnissen (+Dateien)
; Parameter(s): $hTreeView = ControlID/Handle des TreeViews
; $sPath = Verzeichnispfad, der dargestellt werden soll
; $bFiles = True = auch Dateien anzeigen, False = nur Verzeichnisse
; Requirement(s): #include <GuiTreeView.au3>
; Return Value(s): Array mit Anzahl der Verzeichnisse=[0] und Dateien=[1]
; 0 und @error = 1, wenn der Pfad nicht existiert bzw. kein Verzeichnis ist
; 0 und @error = 2, wenn das FileSystemObject nicht erstellt werden konnte
; Author(s): Oscar (http://www.autoit.de)
;===============================================================================
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', 0)
$Folder = $oFSO.GetFolder($sPath)
_CreateDirectoryRecursive($hTreeView, $Folder, $hTreeViewItem, $bFiles, $aCount)
If $bFiles Then
For $Files In $Folder.Files
$hFileItem = GUICtrlCreateTreeViewItem($Files.Name, $hTreeViewItem)
$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
Func _CreateDirectoryRecursive($hTreeView, $Folder, $ItemOld, $bFiles, ByRef $aCount)
Local $hFolderItem, $hFileItem, $FolderColor = 0x0000FF
For $Subfolder In $Folder.SubFolders
$hFolderItem = GUICtrlCreateTreeViewItem($Subfolder.Name, $ItemOld)
GUICtrlSetColor(-1, $FolderColor)
_GUICtrlTreeView_SetIcon($hTreeView, $hFolderItem, 'shell32.dll', 3, 2)
_GUICtrlTreeView_SetIcon($hTreeView, $hFolderItem, 'shell32.dll', 110, 4)
$aCount[0] += 1
_CreateDirectoryRecursive($hTreeView, $Subfolder, $hFolderItem, $bFiles, $aCount)
If $bFiles Then
For $Files In $Subfolder.Files
$hFileItem = GUICtrlCreateTreeViewItem($Files.Name, $hFolderItem)
$aCount[1] += 1
Next
EndIf
Next
EndFunc ;==>_CreateDirectoryRecursive
Edit: Fehler beseitigt!
Dann schau Dir doch mal die _ScreenCapture-Funktionen an.
Alina, Deine Idee an sich ist schon ganz gut, nur musst Du eine Schleife benutzen, um flexibel auf die Stringlänge reagieren zu können:
[autoit]
#include <Array.au3>
$Var = "ABCD1234DEFG5678"
$Len = StringLen($Var)
Global $Array[$Len / 4]
For $i = 0 To $Len / 4 - 1
$Array[$i] = StringMid($Var, $i * 4 + 1, 4)
Next
_ArrayDisplay($Array)
Ursprünglich hieß das Spiel mal Sokoban und das gab es schon auf den Home-Computern der 1980er Jahre.
Mittlerweile gibt es davon Tausende Variationen (2D und 3D) für jedes erdenkliche Betriebssystem.
Ich will Dich aber nicht davon abhalten, das Spiel in AutoIt umzusetzen. Sieht ja bis jetzt ganz gut aus. Bin schon gespannt auf das Ergebnis... ![]()
Ist die Anzahl der Array-Elemente immer durch 4 teilbar?
Wenn ja, dann so:
#include <Array.au3>
$Var = "ABCD1234DEFG"
$Array = StringRegExp($Var, '.{4}', 3)
_ArrayDisplay($Array)
sonst:
[autoit]
#include <Array.au3>
$Var = "ABCD1234DEFG56"
$Array = StringRegExp($Var, '.{1,4}', 3)
_ArrayDisplay($Array)
Na siehste, Du hast es doch geschafft!
_ArrayDelete funktioniert auch. Ist geschwindigkeitsmässig nicht so toll (wegen ReDim), aber das macht in Deinem Script nichts aus.
Die Variante, die ich oben benutzt habe, stammt AFAIR von BugFix aus unserem damaligen Lottozahlen-Contest. Dadurch, dass sie ohne ReDim auskommt, ist sie "sauschnell".
Bei Deinem Script spielt die Geschwindigkeit aber keine Rolle, deshalb lass es ruhig bei _ArrayDelete.
Muss gleich weg! Daher komme ich erst heute abend dazu, mir Dein Script mal genauer anzuschauen.
Du musst also noch ein wenig Geduld haben. Oder einer der anderen kommt mir zuvor. ![]()
Es gibt ja die _GUIScrollBars-UDFs, aber ob die auch auf TABs funktionieren, weiss ich nicht.
Musst Du vielleicht mal ausprobieren.
Kannst Du doch mit ReDim erweitern. Jedes mal, wenn Du einen neuen Eintrag erstellst.
Damit keine Fragen doppelt vorkommen musst Du sie aus dem "Array nehmen".
Das geht am leichtesten, wenn man das Ende des Zufallsbereichs in jeder Runde um eins verringert und die letzte Frage an die Position der momentan gestellten Frage kopiert.
Hört sich kompliziert an, ist aber gar nicht so schwer. Hier ein Beispiel:
Global $array[9] = ['Frage1', 'Frage2', 'Frage3', 'Frage4', 'Frage5', 'Frage6', 'Frage7', 'Frage8', 'Frage9']
For $i = 0 To 5
$random = Random(0, 8 - $i, 1)
MsgBox(0, 'Frage', $array[$random])
$array[$random] = $array[UBound($array) - 1 - $i]
Next