Was ist das denn für ein seltsames Konstrukt?
2 ineinander verschachtelte While-Schleifen mit gleichem Inhalt...
Bring das erst mal in eine sinnvolle Struktur. Das läßt sich gar nicht lesen.
Was ist das denn für ein seltsames Konstrukt?
2 ineinander verschachtelte While-Schleifen mit gleichem Inhalt...
Bring das erst mal in eine sinnvolle Struktur. Das läßt sich gar nicht lesen.
OK, habs mal schnell entworfen. Die Funktion '_StrOverwrite' kannst du in den anderen Fällen genauso einsetzen. Beachten, der übergebene Originalstring ($STR) wir direkt bearbeitet (ByRef). Also nicht versuchen ein Return der Funktion auszuwerten.
Das ganze ist ungetestet - also auf eigene Gefahr
#Include <GuiEdit.au3>
#include <Array.au3>
Dim $Pfad = @ScriptDir & '\BLABLA.nfo'
Dim $line = 9 ; Zeile festlegen, ab der Inhalt aus Editbox geschrieben werden soll
Dim $posX = 5 ; Spalte ab der der Text eingefügt werden soll innerhalb der Zeile
Dim $arNFO ; hier wird nfo-Datei eingelesen
Dim $lineCount = 1
If IsArray(_FileReadToArray($Pfad, $arNFO)) Then
For $i = $line To ($line + _GUICtrlEditGetLineCount($hEdit))-1
_StrOverwrite($arNFO[$i], _GUICtrlEditGetLine($hEdit, $lineCount)
$lineCount += 1
Next
_ArrayDelete($arNFO, 0)
FileMove($Pfad, $Pfad & '.BAK', 1)
_FileWriteFromArray($Pfad, $arNFO)
EndIf
Func _StrOverwrite(ByRef $STR, $TXT2OVERWRITE, $STARTPOS)
Local $strTmp = ''
Local $arAlt = StringSplit($STR, '')
Local $arInsert = StringSplit($TXT2OVERWRITE, '')
$pos = 7
For $i = 1 To UBound($arInsert) -1
$arAlt[$STARTPOS+$i] = $arInsert[$i]
Next
For $i = 1 To UBound($arAlt) -1
$strTmp &= $arAlt[$i]
Next
$STR = $strTmp
EndFunc ;==>_StrOverwrite
Hi,
also du mußt schon einen Vorgang starten, bei dem die gewählten Parameter dann angesprochen werden (z.B. Kopiervorgang einer größeren Datei um 'DiskReadBytes/DiskWriteBytes' zu erhalten, oder laß eine Mediadatei abspielen um eine dauerhafte Änderung der PercentIdleTime zu sehen).
Ich hatte dazu hier im Forum mal die Links eingestellt.
s. hier:
Objekte unter AutoIt
Nö
sollen die Zeilenumbrüche aus dem Edit-Ctrl entfernt werden oder nicht?
Ich sehe nicht,dass du was probiert hast.
; wichtig 'Include' nicht vergessen!
#include <file.au3>
$logPath = @ScriptDir & '\send.log'
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func Senden1()
Send($F1Send)
Send("{ENTER}")
_FileWriteLog($logPath, $F1Send)
EndFunc
Func Senden2()
Send($F2Send)
Send("{ENTER}")
_FileWriteLog($logPath, $F2Send)
EndFunc
Func Senden3()
Send($F3Send)
Send("{ENTER}")
_FileWriteLog($logPath, $F3Send)
EndFunc
Func Senden4()
Send($F4Send)
Send("{ENTER}")
_FileWriteLog($logPath, $F4Send)
EndFunc
Func Senden5()
Send($F5Send)
Send("{ENTER}")
_FileWriteLog($logPath, $F5Send)
EndFunc
Verstehe ich richtig:
Du liest aus einer Editbox, in der der enthaltene Text aber als ein String betrachtet werden soll?
Edit:
Dann mach aus dem Edit-Inhalt einen fortlaufenden String und behandele es wie im anderen Bsp.:
#Include <GuiEdit.au3>
$str = ''
For $i = 1 To _GUICtrlEditGetLineCount($hEdit)
$str &= _GUICtrlEditGetLine($hEdit, $i)
Next
Kann mir nicht vorstellen, wie dein Skript verlorengeht, aber warum soll ich es dir neu schreiben? Was ich zur Verfügung hatte steht hier im Forum, also kopiers dir runter.
Und was ich hinzugefügt habe ist eine Zeile pro Funktion und eine für $logPath. Also warum solltest du das nicht schreiben können?
Aber bei mir schon.
So hab ich getestet:
#include <file.au3>
$logPath = @ScriptDir & '\send.log'
$F1Send = 'Test' ; als Ersatz für GUICtrlRead($F1)
Senden1()
Func Senden1()
Send($F1Send)
Send("{ENTER}")
_FileWriteLog($logPath, $F1Send)
EndFunc
Kein Problem:
[autoit]#include <file.au3>
$logPath = @ScriptDir & '\send.log'
Func Senden1()
Send($F1Send)
Send("{ENTER}")
_FileWriteLog($logPath, $F1Send)
EndFunc
Hier mal mit Strings gemacht:
$strAlt = 'A Z'
$strInsert = 'X $$ X'
; einfügen ab Pos. 7
$arAlt = StringSplit($strAlt, '')
$arInsert = StringSplit($strInsert, '')
$pos = 7
For $i = 1 To UBound($arInsert) -1
$arAlt[$pos+$i] = $arInsert[$i]
Next
$strOut = ''
For $i = 1 To UBound($arAlt) -1
$strOut &= $arAlt[$i]
Next
MsgBox(0, '', $strOut)
Äh,wie jetzt?
Steht in der Datei 100 mal Chr(32) und du willst z.B. einen Text von 20 Zeichen ab Position 1 schreiben und den Rest belassen?
Tipp:
Füge bei jedem Senden ein _FileWriteLog() an. Dann speicherst du automatisch alles was gesendet wird.
Statt des Save-Buttons würde ich beim Beenden per MsgBox fragen ob gespeichert werden soll, wenn nein löschst du die Logdatei.
Hier hast du alle Parameter, die du abfragen kannst. Ich hab mal das momentan nicht wichtige auskommentiert und nur für alle HD gemeinsam ('_Total') ausgeben lassen.
Pack es in eine Schleife - fertig.
$wbemFlagReturnImmediately = 0x10
$wbemFlagForwardOnly = 0x20
$colItems = ""
$strComputer = "localhost"
$Output=""
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfDisk_PhysicalDisk", "WQL", _
$wbemFlagReturnImmediately + $wbemFlagForwardOnly)
If IsObj($colItems) then
For $objItem In $colItems
If $objItem.Name = '_Total' Then
$Output = $Output & "Name: " & $objItem.Name & @CRLF
;~ $Output = $Output & "AvgDiskBytesPerRead: " & $objItem.AvgDiskBytesPerRead & @CRLF
;~ $Output = $Output & "AvgDiskBytesPerTransfer: " & $objItem.AvgDiskBytesPerTransfer & @CRLF
;~ $Output = $Output & "AvgDiskBytesPerWrite: " & $objItem.AvgDiskBytesPerWrite & @CRLF
;~ $Output = $Output & "AvgDiskQueueLength: " & $objItem.AvgDiskQueueLength & @CRLF
;~ $Output = $Output & "AvgDiskReadQueueLength: " & $objItem.AvgDiskReadQueueLength & @CRLF
;~ $Output = $Output & "AvgDisksecPerRead: " & $objItem.AvgDisksecPerRead & @CRLF
;~ $Output = $Output & "AvgDisksecPerTransfer: " & $objItem.AvgDisksecPerTransfer & @CRLF
;~ $Output = $Output & "AvgDisksecPerWrite: " & $objItem.AvgDisksecPerWrite & @CRLF
;~ $Output = $Output & "AvgDiskWriteQueueLength: " & $objItem.AvgDiskWriteQueueLength & @CRLF
;~ $Output = $Output & "Caption: " & $objItem.Caption & @CRLF
;~ $Output = $Output & "CurrentDiskQueueLength: " & $objItem.CurrentDiskQueueLength & @CRLF
;~ $Output = $Output & "Description: " & $objItem.Description & @CRLF
;~ $Output = $Output & "DiskBytesPersec: " & $objItem.DiskBytesPersec & @CRLF
$Output = $Output & "DiskReadBytesPersec: " & $objItem.DiskReadBytesPersec & @CRLF
;~ $Output = $Output & "DiskReadsPersec: " & $objItem.DiskReadsPersec & @CRLF
$Output = $Output & "DiskTransfersPersec: " & $objItem.DiskTransfersPersec & @CRLF
$Output = $Output & "DiskWriteBytesPersec: " & $objItem.DiskWriteBytesPersec & @CRLF
;~ $Output = $Output & "DiskWritesPersec: " & $objItem.DiskWritesPersec & @CRLF
;~ $Output = $Output & "Frequency_Object: " & $objItem.Frequency_Object & @CRLF
;~ $Output = $Output & "Frequency_PerfTime: " & $objItem.Frequency_PerfTime & @CRLF
;~ $Output = $Output & "Frequency_Sys100NS: " & $objItem.Frequency_Sys100NS & @CRLF
;~ $Output = $Output & "PercentDiskReadTime: " & $objItem.PercentDiskReadTime & @CRLF
;~ $Output = $Output & "PercentDiskTime: " & $objItem.PercentDiskTime & @CRLF
;~ $Output = $Output & "PercentDiskWriteTime: " & $objItem.PercentDiskWriteTime & @CRLF
$Output = $Output & "PercentIdleTime: " & $objItem.PercentIdleTime & @CRLF
;~ $Output = $Output & "SplitIOPerSec: " & $objItem.SplitIOPerSec & @CRLF
;~ $Output = $Output & "Timestamp_Object: " & $objItem.Timestamp_Object & @CRLF
;~ $Output = $Output & "Timestamp_PerfTime: " & $objItem.Timestamp_PerfTime & @CRLF
;~ $Output = $Output & "Timestamp_Sys100NS: " & $objItem.Timestamp_Sys100NS & @CRLF
If Msgbox(1,"WMI Output",$Output) = 2 Then ExitLoop
EndIf
Next
Else
Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_PerfFormattedData_PerfDisk_PhysicalDisk" )
Endif
Hier mal eine Möglichkeit um Koordinaten zu ermitteln. Beenden, indem die Maus auf (0,0) gesetzt wird.
AutoitSetOption('MouseCoordMode', 1) ; 0 = relative coords to the active window
; 1 = absolute screen coordinates (default)
; 2 = relative coords to the client area of the active window
_CursorPos()
Func _CursorPos()
Local $x, $y
Do
$pos = MouseGetPos()
$x = $pos[0]
$y = $pos[1]
Select
Case ((@DesktopWidth-$pos[0]) < 130) And ((@DesktopHeight-$pos[1]) >= 60)
$x = @DesktopWidth-130
$y = $pos[1]
Case ((@DesktopWidth-$pos[0]) < 130) And ((@DesktopHeight-$pos[1]) < 60)
$x = @DesktopWidth-130
$y = @DesktopHeight-60
Case ((@DesktopWidth-$pos[0]) >= 130) And ((@DesktopHeight-$pos[1]) < 60)
$x = $pos[0]
$y = @DesktopHeight-60
EndSelect
ToolTip('x = ' & $pos[0] & @LF & 'y = ' & $pos[1], $x, $y, 'Cursorposition', 1)
Until ($pos[0] = 0 And $pos[1] = 0)
ToolTip('Funktion beendet', $pos[0], $pos[1], 'Cursorposition', 1)
Sleep(1500)
ToolTip('')
EndFunc ;==>_CursorPos
@(VX-)Rexx
Ich stimme dir insofern zu, dass dieser Punkt in der bisherigen Doku keinen Eingang gefunden hat und dies wünschenswert wäre.
Andererseits kann ich mir nicht verkneifen zu sagen, dass jemand der Arrays in einem Array ablegt schon tiefergehende Programmierkenntnisse besitzen sollte (nicht zwingend in AutoIt, nur fürs Verständnis) und somit durch try & error nach spätestens 5 Minuten zu diesem Ergebnis kommt.
EDIT:
Ich habe anhand deines Beispiels mal einen Beitrag für unser Wiki geschrieben.
Arrays als Elemente eines Arrays
Nimm beide, und was dir dann nicht gefällt, gibst du mir.
Nee, ernsthaft. Ist sicher stark von deiner Nutzung abhängig. Ich nehme eig. lieber langsam laufende Platten. Performanceverlust beim Lesen/schreiben halte ich für vernachlässigbar.
Guck mal hier rein, da verwende ich das:
ToolTip, beenden mit Mausbewegung bzw. nach Zeitablauf
Wenn ich z.B. aus einer Anwendung in die Zwischenablage kopiere, gebe ich i.A. per ToolTip aus: '...wurde in die Zwischenablage kopiert'. Dahinter ein Sleep, damit der User auch Zeit zum Lesen hat.
Da jeder unterschiedlich schnell liest, suchte ich nach einer möglichst einfachen Variante um den ToolTip vor Ablauf der Zeit zu killen.
Daraus ist diese Funktion entstanden.
Wird während der Tooltip-Anzeige die Maus um mehr als 10 Pixel horizontal oder vertikal bewegt, wird der Tooltip beendet.
Die Parameter sind identisch, wie bei ToolTip. Hinzugekommen ist $TIME mit Voreinstellung von 3 s.
Edit:
Irgendwas findet man immer noch zum Ändern.
Hab jetzt als Standard (wenn $x oder $y =-1), dass der Tipp an der Mausposition gezeigt wird.
_ToolTipMouseExit($TEXT, $TIME=-1, $x=-1, $y=-1, $TITLE='', $ICON=0, $OPT='')
;----------------------------------------------------------------------------------------------------------------------
; Function _ToolTipMouseExit("text", [time [, x=-1 [, y=-1 [, "title" [, icon [, options]]]]]] )
;
; Description usual ToolTip, will be terminate with mouse move, latest after time
;
; Parameter same ase used by ToolTip
; if x Or y =-1 then ToolTip will be placed at mouse position
; optional $TIME default is 3000 ms
;
; Author BugFix ([email='bugfix@autoit.de'][/email])
;----------------------------------------------------------------------------------------------------------------------
Func _ToolTipMouseExit($TEXT, $TIME=-1, $x=-1, $y=-1, $TITLE='', $ICON=0, $OPT='')
If $TIME = -1 Then $TIME = 3000
Local $start = TimerInit(), $pos0 = MouseGetPos()
If ($x = -1) Or ($y = -1) Then
ToolTip($TEXT, $pos0[0], $pos0[1], $TITLE, $ICON, $OPT)
Else
ToolTip($TEXT, $x, $y, $TITLE, $ICON, $OPT)
EndIf
Do
Sleep(50)
$pos = MouseGetPos()
Until (TimerDiff($start) > $TIME) Or _
(Abs($pos[0] - $pos0[0]) > 10 Or _
Abs($pos[1] - $pos0[1]) > 10)
ToolTip('')
EndFunc ;_ToolTipMouseExit
Nein, es ist kein Bug. Du kannst nur nicht direkt auf ein Array innerhalb eines Array-Elements zugreifen. Du mußt es erst separieren:
[autoit]$Array[3]=$AnotherArray
; Anzeigen von $AnotherArray[2]
$x = $Array[3]
MsgBox(0, '', $x[2])
Wenn ich das richtig sehe, ermittelst du die abgelaufene Zeit durch ein Sleep(1000) in deiner For-Schleife.
Damit kannst du diese Schleife natürlich kaum verlassen.
Wenn du mit einer gegebenen Zeitspanne arbeiten möchtest und gleichzeitig Interaktion zulassen willst, empfiehlt sich der Einsatz von: TimerInit() und TimerDiff(). Probiers mal.