Ja, beschreib bitte den Fehler:
- Zustand / Werte, die sein sollen
- Zustand / Werte, die auftreten
und Fehlermeldungen vom System, soweit ausgegeben.
Beiträge von BugFix
-
-
Ist mir zumindest nicht bekannt die Variante.
Wenn du für jede Zeile der Listview in einer Spalte eine Auswahlmöglichkeit für den Nutzer bieten möchtest, brauchst du nur eine Combobox.
Du ermittelst den Index der aktuell selektierten Zeile. In Abhängigkeit zum aktuellen Index befüllst du deine Combobox.
Hierbei solltest du aber im OnEvent-Modus arbeiten, sonst wird das ein 'Rumgeeiere'.
-
Also warum das überhaupt?
Ich selbst nutze HBCI mit Chipkarte. Bei der Bank meiner Frau war dies bisher nicht möglich und da ich einfach keine Lust habe immer nach dem blöden Zettel mit der TAN-Liste zu suchen um eine Rechnung meiner Frau zu begleichen, habe ich dieses Tool geschrieben.@derda: Dazu steh ich nach wie vor :D. Im Klartext sollte man die TAN nicht auf dem PC speichern. Aber in chiffrierter Form mit dem Paßwort im Kopf halte ich es für ausreichend sicher. Zumal eh keiner Zugang auf den PC hat. Außerdem hab ich das alles auf 'nem alten USB-Stick, den ich dann nur bei Bedarf anstecke.
@Sn0opy: Ja, die TAN-Liste mußt du schon im PC erfassen. Das ist auch das Erste was beim Programmstart passiert - Aufforderung eine TAN-Liste zu erfassen.
-
Zitat
irgendwie reden wir aneinander vorbei. Ich hoffe mal, dass ich es nicht falsch verstehe.
Den Eindruck hatte ich auch
- Vielleicht solltest du nicht immer so wortkarg sein ? 
Ich stimme dir völlig zu.
Dann wäre es doch eigentlich sinnvoll, wenn in AutoIt-Funktionen die Parameter ohne besondere Kennzeichnung als ByRef betrachtet werden. Für die Mehrzahl der Parameter ist doch eine ByRef-Übergabe sinnvoll - oder? Ausnahmen könnte man dann mit ByVal festlegen (gibts halt in AutoIt nicht explizit, alle Argumente sind ja automatisch ByVal). Kann mich schwach an meine VB-Übungen erinnern, da mußte man das sowieso festlegen. -
Hi,
so ziemlich jeder nimmt am Electronic-Banking teil. Leider hat sich noch nicht bei allen Banken der HBCI-Standard durchgesetzt.
Für all jene, die noch mit TAN/PIN arbeiten (müssen) ist dieses Tool gedacht.
Einige Bankingprogramme bieten ja schon die Speicherung der TAN an. Aber das geschieht entweder im Klartext, oder die ganze Liste wird im Moment des Zugangs zum Programm entschlüsselt. Seeeehr sinnvoll.
(Vielleicht gibt es auch Programme, die es anders machen. Aber die mir bekannten sind nicht so toll.)In meiner TAN-Verwaltung sind die TAN einmalig, während sie erfaßt werden, in einer Liste unverschlüsselt sichtbar. Sie können dann noch vom User bearbeitet werden (z.B. Schreibfehler korrigieren).
Anschließend wird ein Paßwort angefordert und damit werden die TAN verschlüsselt in einer Datei abgespeichert.
Wenn der User eine TAN verwenden möchte, doppelklickt er darauf in der Liste, gibt den Verwendungszweck ein, anschließend das Paßwort.
Jetzt wird diese eine TAN entschlüsselt und an die Zwischenablage übergeben.
Datum und Verwendungszweck werden anschließend in der Datei gespeichert und die Liste wird aktualisiert.Spoiler anzeigen
[autoit]#include <file.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <array.au3>
#include <String.au3>
#include <GUIConstants.au3>
#Include <GuiList.au3>
Opt("GUIOnEventMode", 1)
Global Const $WM_COMMAND = 0x0111
Global Const $WM_NOTIFY = 0x004E
Global Const $NM_FIRST = 0
Global Const $NM_LAST = (-99)
Global Const $NM_CLICK = ($NM_FIRST - 2)
Global Const $NM_DBLCLK = ($NM_FIRST - 3)
Global Const $NM_RCLICK = ($NM_FIRST - 5)
Global Const $NM_RDBLCLK = ($NM_FIRST - 6)
Dim $listPath = 'trans_list.txt', $arTAN, $arErfass[1]
Dim $neu = 0, $Salmon = 0xFA8072, $PaleGreen = 0x98FB98; TAN-Erfassung GUI
[/autoit] [autoit][/autoit] [autoit]
$TanErfass = GUICreate("TAN - Liste erfassen", 257, 424, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "TanErfassClose")
$Label1 = GUICtrlCreateLabel("TAN - Listen - Nr.:", 16, 16, 89, 17)
$inListNr = GUICtrlCreateInput("", 109, 13, 121, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL))
$Group1 = GUICtrlCreateGroup(" TAN ", 16, 44, 217, 329)
$lstTAN = GUICtrlCreateList('0', 25, 59, 200, 305, BitOR($WS_VSCROLL,$WS_BORDER))
$mnu = GUICtrlCreateContextMenu($lstTAN)
$itemChange = GUICtrlCreateMenuItem('Ändern', $mnu)
GUICtrlSetOnEvent(-1, 'changeTAN')
$itemDelete = GUICtrlCreateMenuItem('Löschen', $mnu)
GUICtrlSetOnEvent(-1, 'deleteTAN')
GUICtrlCreateGroup("", -99, -99, 1, 1)
$bSave = GUICtrlCreateButton("Verschlüsseln && Speichern", 16, 390, 217, 22, 0)
GUICtrlSetOnEvent(-1, 'bSaveClick')
; /TAN-Erfassung GUI
; Main GUI
$Form1 = GUICreate("TAN - Verwaltung", 667, 363, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "AForm1Close")
$ListView1 = GUICtrlCreateListView("lfd. Nr.|TAN|Datum|Verwendungszweck", 16, 34, 636, 289, $LVS_NOSORTHEADER, _
BitOR($LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))
_GUICtrlListViewSetColumnWidth(-1, 0, 50)
_GUICtrlListViewSetColumnWidth(-1, 1, 190)
_GUICtrlListViewSetColumnWidth(-1, 2, 100)
_GUICtrlListViewSetColumnWidth(-1, 3, 290)
_GUICtrlListViewJustifyColumn(-1, 0, 1)
_GUICtrlListViewJustifyColumn(-1, 1, 2)
_GUICtrlListViewJustifyColumn(-1, 2, 2)
_GUICtrlListViewJustifyColumn(-1, 3, 0)
$Label1 = GUICtrlCreateLabel("TAN - Listen - Nr.:", 220, 9, 89, 17)
$ListenNr = GUICtrlCreateInput("", 316, 6, 129, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL,$ES_READONLY))
$Label2 = GUICtrlCreateLabel("Anzahl freier TAN:", 16, 9, 90, 17)
$freeTAN = GUICtrlCreateInput("", 110, 6, 33, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL,$ES_READONLY))
$bTANneu = GUICtrlCreateButton('TAN - Liste erfassen', 502, 6, 150, 21)
GUICtrlSetOnEvent(-1, "bTANneuClick")
$Label3 = GUICtrlCreateLabel("TAN auswählen mit Doppelklick - Dechiffrierung und Übergabe an Zwischenablage nach Paßwort-Abfrage", 16, 336, 636, 17, $SS_CENTER)
; /Main GUIIf _FileReadToArray($listPath, $arTAN) = 0 Then
[/autoit] [autoit][/autoit] [autoit]
If MsgBox(262180, 'FEHLER!', 'TAN - Liste konnte nicht geladen werden.' & @LF & 'Datei: ' & $listPath & ' nicht gefunden.' & @LF & _
'Wenn die TAN - Liste bereits angelegt wurde,' & @LF & _
'muß die Datei sich im selben Verzeichnis,' & @LF & _
'wie dieses Programm befinden.' & @LF & @LF & _
'Wollen Sie jetzt eine TAN - Liste erfassen?') = 6 Then
bTANneuClick()
$neu = 1
Else
Exit
EndIf
EndIfIf $neu = 0 Then
[/autoit] [autoit][/autoit] [autoit]
_ArrayDelete($arTAN, 0)
GUISetState(@SW_SHOW, $Form1)
_writeListView()
EndIf
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(100)
WEnd
Func AForm1Close()
Exit
EndFuncFunc TanErfassClose()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
If (Not FileExists($listPath)) Then
MsgBox(0, 'FEHLER!', 'Es wurde noch keine TAN-Liste angelegt!' & @LF & 'Das Programm wird beendet.')
Exit
EndIf
GUISetState(@SW_SHOW, $Form1)
GUISetState(@SW_HIDE, $TanErfass)
EndFuncFunc ListViewDoubleClick()
[/autoit] [autoit][/autoit] [autoit]
$idx = _GUICtrlListViewGetSelectedIndices($ListView1)
If String(_GUICtrlListViewGetItemText($ListView1, $idx, 2)) <> '0' Then
MsgBox(0, 'ACHTUNG!', 'Diese TAN wurde bereits verwendet.')
Return
EndIf
If MsgBox(262180, 'TAN abrufen', 'Wollen Sie die TAN mit der' & @LF & 'lfd. Nr.: ' & $idx+1 & @LF & 'jetzt verwenden ?') = 7 Then Return
Local $arReplace[4]=[3,_GUICtrlListViewGetItemText($ListView1, $idx, 1), @MDAY&'.'&@MON&'.'&@YEAR, _
InputBox('Verwendungszweck', 'Bitte geben Sie den Verwendungszweck ein')]
$arTAN[$idx+2] = $arReplace
_writeFromArrayTAN()
ClipPut( _StringEncrypt(0, _GUICtrlListViewGetItemText($ListView1, $idx, 1), _
InputBox('Paßwort Entschlüsselung', 'Bitte jetzt das Paßwort zur Entschlüsselung eingeben.', '', '•')))
MsgBox(0, 'Zwischenablage', 'Die TAN wurde in die Zwischenablage eingefügt.')
_GUICtrlListViewDeleteAllItems($ListView1)
_FileReadToArray($listPath, $arTAN)
_ArrayDelete($arTAN, 0)
_writeListView()
EndFuncFunc _writeFromArrayTAN()
[/autoit] [autoit][/autoit] [autoit]
Local $arTmp[UBound($arTAN)]
$arTmp[0] = $arTAN[0]
$arTmp[1] = $arTAN[1]
For $i = 2 To UBound($arTAN)-1
$arTmp[$i] = _SubArrayGetEntry($arTAN, 1, $i) & ';' & _
_SubArrayGetEntry($arTAN, 2, $i) & ';' & _
_SubArrayGetEntry($arTAN, 3, $i)
Next
If FileExists($listPath) Then FileMove($listPath, $listPath & '.BAK')
_FileWriteFromArray($listPath, $arTmp)
EndFunc
Func bTANneuClick()
If FileExists($listPath) Then MsgBox(0, 'HINWEIS', 'Nach dem Erfassen einer neuen TAN - Liste' & @LF & _
'kann auf die bisherige Liste nicht mehr zugegriffen werden.' & @LF & _
'Sie wird unter dem Namen: ' & $listPath & '.BAK im Programmverzeichnis abgelegt.')
GUISetState(@SW_HIDE, $Form1)
GUISetState(@SW_SHOW, $TanErfass)
SplashTextOn('TAN - Nummern eingeben', @LF & ' Um die Erfassung der TAN - Nummern zu aktivieren,' & @LF & _
' bitte einen Doppelklick in die Liste ausführen' & @LF & _
' Um das Eingabefenster zu schließen, bei leerem Eingabefeld OK klicken.' & @LF & _
' Per Rechtsklick auf einen markierten Eintrag kann dieser:' & @LF & _
' - geändert oder' & @LF & _
' - gelöscht werden.', 550, 150, -1, -1, 4)
Sleep(12000)
SplashOff()
EndFuncFunc _writeListView()
[/autoit] [autoit][/autoit] [autoit]
Local $free = 0, $arLV[UBound($arTAN)-2]
GUICtrlSetData($ListenNr, $arTAN[0])
For $i = 2 To UBound($arTAN)-1
$arTAN[$i] = StringSplit($arTAN[$i], ';')
$arLV[$i-2] = GUICtrlCreateListViewItem($i-1 & '|' & _SubArrayGetEntry($arTAN, 1, $i) _
& '|' & _SubArrayGetEntry($arTAN, 2, $i) _
& '|' & _SubArrayGetEntry($arTAN, 3, $i), $ListView1)
If _SubArrayGetEntry($arTAN, 2, $i) = 0 Then
$free += 1
GUICtrlSetBkColor($arLV[$i-2], $PaleGreen)
Else
GUICtrlSetBkColor($arLV[$i-2], $Salmon)
EndIf
Next
GUICtrlSetData($freeTAN, $free)
EndFuncFunc List_DoubleClick()
[/autoit] [autoit][/autoit] [autoit]
$TAN = InputBox('TAN - Erfassung', 'Bitte hier die TAN eingeben')
If $TAN <> '' Then
_GUICtrlListAddItem($lstTAN, $TAN)
_GUICtrlListReplaceString($lstTAN, 0, String(_GUICtrlListCount($lstTAN)-1))
Else
Return
EndIf
List_DoubleClick()
EndFuncFunc changeTAN()
[/autoit] [autoit][/autoit] [autoit]
$idx = _GUICtrlListGetCaretIndex($lstTAN)
$new = InputBox('TAN - Erfassung', 'Bitte korrigieren', _GUICtrlListGetText($lstTAN, $idx))
If $new <> '' Then _GUICtrlListReplaceString($lstTAN, $idx, String($new))
EndFuncFunc deleteTAN()
[/autoit] [autoit][/autoit] [autoit]
$idx = _GUICtrlListGetCaretIndex($lstTAN)
If MsgBox(262180, 'Löschen', 'Soll:' & @LF & _GUICtrlListGetText($lstTAN, $idx) & @LF & 'wirklich gelöscht werden?') = 6 Then
_GUICtrlListDeleteItem($lstTAN, $idx)
_GUICtrlListReplaceString($lstTAN, 0, String(_GUICtrlListCount($lstTAN)-1))
EndIf
EndFuncFunc bSaveClick()
[/autoit] [autoit][/autoit] [autoit]
$listNr = GUICtrlRead($inListNr)
If $listNr = '' Then
MsgBox(0, '', 'Listen-Nr. wurde nicht erfaßt!')
Return
EndIf
$anz = _GUICtrlListCount($lstTAN)
If $anz < 2 Then
MsgBox(0, '', 'Keine TAN-Nr. erfaßt!')
Return
EndIf
ReDim $arErfass[$anz+1]
$arErfass[0] = $listNr
$arErfass[1] = $anz
$KEY = InputBox('Paßwort Verschlüsselung', 'Bitte jetzt das Paßwort zur Verschlüsselung eingeben.', '', '•')
For $i = 1 To $anz-1
$arErfass[$i+1] = _StringEncrypt(1, _GUICtrlListGetText($lstTAN, $i), $KEY) & ';0;'
Next
If FileExists($listPath) Then FileMove($listPath, $listPath & '.BAK', 1)
_FileWriteFromArray($listPath, $arErfass)
_GUICtrlListViewDeleteAllItems($ListView1)
_FileReadToArray($listPath, $arTAN)
_ArrayDelete($arTAN, 0)
TanErfassClose()
_writeListView()
EndFuncFunc _SubArrayGetEntry($ARRAY, $SubIdx, $iDim1, $iDim2=-1)
[/autoit] [autoit][/autoit] [autoit]
If (Not IsArray($ARRAY)) Then
SetError(1)
Return 0
EndIf
If ($iDim1 < 0) Or ($iDim1 > UBound($ARRAY)-1) Then
SetError(2)
Return 0
EndIf
Local $UbSecond = UBound($ARRAY, 2)
If @error Then
If $iDim2 <> -1 Then
SetError(3)
Return 0
EndIf
ElseIf ($iDim2 < -1) Or ($iDim2 > $UbSecond-1) Then
SetError(2)
Return 0
EndIf
Local $sub
Switch $iDim2
Case -1
$arSub = $ARRAY[$iDim1]
Case Else
$arSub = $ARRAY[$iDim1][$iDim2]
EndSwitch
If ($SubIdx < 0) Or ($SubIdx > UBound($arSub)-1) Then
SetError(4)
Return 0
Else
Return $arSub[$SubIdx]
EndIf
EndFuncFunc MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $nNotifyCode = BitShift($wParam, 16)
Local $nID = BitAND($wParam, 0xFFFF)
Local $hCtrl = $lParam
Local Const $LBN_ERRSPACE = (-2);
Local Const $LBN_SELCHANGE = 1;
Local Const $LBN_DBLCLK = 2;
Local Const $LBN_SELCANCEL = 3;
Local Const $LBN_SETFOCUS = 4;
Local Const $LBN_KILLFOCUS = 5;Switch $nID
[/autoit] [autoit][/autoit] [autoit]
Case $lstTAN
Switch $nNotifyCode
Case $LBN_ERRSPACE
;~ _DebugPrint("$LBN_ERRSPACE")
Case $LBN_SELCHANGE
;~ _DebugPrint("$LBN_SELCHANGE")
Case $LBN_SELCANCEL
;~ _DebugPrint("$LBN_SELCANCEL")
Case $LBN_SETFOCUS
;~ _DebugPrint("$LBN_SETFOCUS")
Case $LBN_KILLFOCUS
;~ _DebugPrint("$LBN_KILLFOCUS")
Case $LBN_DBLCLK
List_DoubleClick()
EndSwitch
EndSwitch
; Proceed the default Autoit3 internal message commands.
; You also can complete let the line out.
; !!! But only 'Return' (without any value) will not proceed
; the default Autoit3-message in the future !!!
Return $GUI_RUNDEFMSG
EndFunc ;==>MY_WM_COMMANDFunc WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
[/autoit]
;#forceref $hWndGUI, $MsgID, $wParam
Local $tagNMHDR, $event, $hwndFrom, $code
$tagNMHDR = DllStructCreate("int;int;int", $lParam);NMHDR (hwndFrom, idFrom, code)
If @error Then Return
$event = DllStructGetData($tagNMHDR, 3)
Select
Case $wParam = $ListView1
Select
Case $event = $NM_CLICK
;~ ListView_Click ()
Case $event = $NM_DBLCLK
ListViewDoubleClick()
Case $event = $NM_RCLICK
;~ ListView_RightClick ()
Case $event = $NM_RDBLCLK
;~ ListView_RightDblClick ()
EndSelect
EndSelect
$tagNMHDR = 0
$event = 0
$lParam = 0
EndFunc ;==>WM_Notify_EventsUnd so sieht es aus:
-
Ich kopiere es ja nicht, sondern ich selektiere das an einer bestimmten Arrayposition($iDim1/$iDim2) enthaltene 'interne' Array um dann mit dem übergebenen Subindex daraus einen Wert zu erhalten.
-
Zitat
Original von Xenobiologist
Hi,evtl. noch ByRef

So long,
Mega
Beim Auslesen

-
Edit 27.07.07 [alles gaaanz neu]
Da AutoIt die Möglichkeit bietet, in einem Array als Elemente Arrays abzulegen, habe ich eine Funktion erstellt, die ein direktes Auslesen und auch Schreiben von Sub-Arrayelementen ermöglicht.
In der aktualisierten Version sind nun bei Parent-Array und auch bei Sub-Array 2D-Arrays einsetzbar ohne Limitierung.
_SubArray2DGetEntry($ARRAY, $SubRow, $ParentRow [, $SubCol=-1 [, $ParentCol=-1])
_SubArray2DSetEntry($ARRAY, $Entry, $SubRow, $ParentRow [, $SubCol=-1 [, $ParentCol=-1])
- $ARRAY ==> Ausgangsarray
- $Entry ==> Nur bei ...SetEntry(), der zu setzende Wert
- $SubRow ==> Zeilen-Index Sub-Array
- $ParentRow ==> Zeilen-Index Parent-Array (enthält das Sub-Array
- $SubCol=-1 ==> Spalten-Index Sub-Array, Standard ist -1 ==> nur 1D
- $ParentCol=-1 ==> Spalten-Index Parent-Array, Standard ist -1 ==> nur 1DDas Bsp.ist auch aktualisiert:
Spoiler anzeigen
[autoit]Dim $ar1_1[3]=[0,1,2]
[/autoit] [autoit][/autoit] [autoit]
Dim $ar1_2[3]=[3,4,5]
Dim $ar1_3[3]=[6,7,8]
Dim $ar1_4[3]=[9,10,11]
Dim $ar1_5[3]=[12,13,14]Dim $ar1[5]=[$ar1_1,$ar1_2,$ar1_3,$ar1_4,$ar1_5]
[/autoit] [autoit][/autoit] [autoit]MsgBox(0, '$ar1[2] -> SubArray[1]', _SubArray2DGetEntry($ar1, 1, 2)) ; = $ar1_3[1] ==> 7
[/autoit] [autoit][/autoit] [autoit]
_SubArray2DSetEntry($ar1, 77, 1, 2) ; Wert wird auf 77 geändert
MsgBox(0, '$ar1[2] -> SubArray[1]; Wert geändert', _SubArray2DGetEntry($ar1, 1, 2)) ; geänderter WertDim $ar2[5][3]
[/autoit] [autoit][/autoit] [autoit]
$ar2[0][0] = $ar1_1
$ar2[1][0] = $ar1_4
$ar2[2][0] = $ar1_2
$ar2[3][0] = $ar1_5
$ar2[4][0] = $ar1_3$ar2[0][1] = $ar1_2
[/autoit] [autoit][/autoit] [autoit]
$ar2[1][1] = $ar1_1
$ar2[2][1] = $ar1_3
$ar2[3][1] = $ar1_4
$ar2[4][1] = $ar1_5$ar2[0][2] = $ar1_4
[/autoit] [autoit][/autoit] [autoit]
$ar2[1][2] = $ar1_2
$ar2[2][2] = $ar1_5
$ar2[3][2] = $ar1_3
$ar2[4][2] = $ar1_1MsgBox(0, '$ar2[2][2] -> SubArray[1]', _SubArray2DGetEntry($ar2, 1, 2, -1, 2)) ; = $ar2[2][2] Idx 1 = $ar1_5[1] ==> 13
[/autoit] [autoit][/autoit] [autoit]
_SubArray2DSetEntry($ar2, 133, 1, 2, -1, 2) ; Wert wird auf 133 geändert
MsgBox(0, '$ar2[2][2] -> SubArray[1]; Wert geändert', _SubArray2DGetEntry($ar2, 1, 2, -1, 2)) ; geänderter WertDim $ar3[2][2]
[/autoit] [autoit][/autoit] [autoit]
$ar3[0][0] = 'eins'
$ar3[1][0] = 'zwei'
$ar3[0][1] = 'drei'
$ar3[1][1] = 'vier'$ar2[0][1] = $ar3 ; 2D-Array in 2D-Array
[/autoit] [autoit][/autoit] [autoit]MsgBox(0, '$ar2[0][1] -> SubArray[0][1]', _SubArray2DGetEntry($ar2, 0, 0, 1, 1)) ; = $ar2[0][1] Sub[0][1] = $ar3[0][1] ==> 'drei'
[/autoit] [autoit][/autoit] [autoit]
_SubArray2DSetEntry($ar2, 'dreißig', 0, 0, 1, 1) ; Wert wird auf 'dreißig' geändert
MsgBox(0, '$ar2[0][1] -> SubArray[0][1]; Wert geändert', _SubArray2DGetEntry($ar2, 0, 0, 1, 1)) ; geänderter Wert;----------------------------------------------------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]
; Function _SubArray2DGetEntry(ByRef $ARRAY, $SubRow, $ParentRow [, $SubCol=-1 [, $ParentCol=-1])
;
; Description For Array with Array as entry you got the determined entry
; Works with any occurences in 2nd Dimension (parent array and sub-array too)
; Works also with 1D-Array
;
; Parameter $ARRAY Given array with array as entrys
; $SubRow 0-based row -index of the entry inside the sub-array, you want to got
; $ParentRow 0-based row -index of parent-array
; optional $SubCol 0-based column -index of sub-array, (if exists)
; optional $ParentCol 0-based column -index of parent-array, (if exists)
;
; Return Succes value from determined sub-array
; Failure 0 and set @error
; @error = 1 given array is not array
; @error = 2 row -index for parent-array out of range
; @error = 3 col -index for parent-array out of range
; @error = 4 col -index for parent-array is given, but array is 1D
; @error = 5 row -index for sub-array out of range
; @error = 6 col -index for sub-array out of range
; @error = 7 col -index for sub-array is given, but array is 1D
;
; Author BugFix ([email='bugfix@autoit.de'][/email])
;----------------------------------------------------------------------------------------------------------------------
Func _SubArray2DGetEntry(ByRef $ARRAY, $SubRow, $ParentRow, $SubCol=-1, $ParentCol=-1)
If (Not IsArray($ARRAY)) Then
SetError(1)
Return 0
EndIf
If ($ParentRow < 0) Or ($ParentRow > UBound($ARRAY)-1) Then
SetError(2)
Return 0
EndIf
Local $Ub2ndParent = UBound($ARRAY, 2)
If @error Then
If $ParentCol <> -1 Then
SetError(4)
Return 0
EndIf
ElseIf ($ParentCol < -1) Or ($ParentCol > $Ub2ndParent-1) Then
SetError(3)
Return 0
EndIf
Switch $ParentCol
Case -1
Local $arSub = $ARRAY[$ParentRow]
Case Else
Local $arSub = $ARRAY[$ParentRow][$ParentCol]
EndSwitch
If ($SubRow < 0) Or ($SubRow > UBound($arSub)-1) Then
SetError(5)
Return 0
EndIf
Local $Ub2ndSub = UBound($arSub, 2)
If @error Then
If $SubCol <> -1 Then
SetError(7)
Return 0
Else
Return $arSub[$SubRow]
EndIf
Else
If ($SubCol < 0) Or ($SubCol > $Ub2ndSub) Then
SetError(6)
Return 0
Else
Return $arSub[$SubRow][$SubCol]
EndIf
EndIf
EndFunc ;==>_SubArray2DGetEntry;----------------------------------------------------------------------------------------------------------------------
[/autoit]
; Function _SubArray2DSetEntry(ByRef $ARRAY, $Entry, $SubRow, $ParentRow [, $SubCol=-1 [, $ParentCol=-1])
;
; Description For Array with Array as entry you set the determined entry
; Works with any occurences in 2nd Dimension (parent array and sub-array too)
; Works also with 1D-Array
;
; Parameter $ARRAY Given array with array as entrys
; $Entry Value you want to set in the sub-array
; $SubRow 0-based row -index of the entry inside the sub-array, you want to set
; $ParentRow 0-based row -index of parent-array
; optional $SubCol 0-based column -index of sub-array, (if exists)
; optional $ParentCol 0-based column -index of parent-array, (if exists)
;
; Return Succes -1 value is set
; Failure 0 and set @error
; @error = 1 given array is not array
; @error = 2 row -index for parent-array out of range
; @error = 3 col -index for parent-array out of range
; @error = 4 col -index for parent-array is given, but array is 1D
; @error = 5 row -index for sub-array out of range
; @error = 6 col -index for sub-array out of range
; @error = 7 col -index for sub-array is given, but array is 1D
;
; Author BugFix ([email='bugfix@autoit.de'][/email])
;----------------------------------------------------------------------------------------------------------------------
Func _SubArray2DSetEntry(ByRef $ARRAY, $Entry, $SubRow, $ParentRow, $SubCol=-1, $ParentCol=-1)
If (Not IsArray($ARRAY)) Then
SetError(1)
Return 0
EndIf
If ($ParentRow < 0) Or ($ParentRow > UBound($ARRAY)-1) Then
SetError(2)
Return 0
EndIf
Local $Ub2ndParent = UBound($ARRAY, 2)
If @error Then
If $ParentCol <> -1 Then
SetError(4)
Return 0
EndIf
ElseIf ($ParentCol < -1) Or ($ParentCol > $Ub2ndParent-1) Then
SetError(3)
Return 0
EndIf
Switch $ParentCol
Case -1
Local $arSub = $ARRAY[$ParentRow]
Case Else
Local $arSub = $ARRAY[$ParentRow][$ParentCol]
EndSwitch
If ($SubRow < 0) Or ($SubRow > UBound($arSub)-1) Then
SetError(5)
Return 0
EndIf
Local $Ub2ndSub = UBound($arSub, 2)
If @error Then
If $SubCol <> -1 Then
SetError(7)
Return 0
Else
$arSub[$SubRow] = $Entry
EndIf
Else
If ($SubCol < 0) Or ($SubCol > $Ub2ndSub) Then
SetError(6)
Return 0
Else
$arSub[$SubRow][$SubCol] = $Entry
EndIf
EndIf
Switch $ParentCol
Case -1
$ARRAY[$ParentRow] = $arSub
Case Else
$ARRAY[$ParentRow][$ParentCol] = $arSub
EndSwitch
Return -1
EndFunc ;==>_SubArray2DSetEntry -
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

Spoiler anzeigen
[autoit]#Include <GuiEdit.au3>
[/autoit] [autoit][/autoit] [autoit]
#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)
EndIfFunc _StrOverwrite(ByRef $STR, $TXT2OVERWRITE, $STARTPOS)
[/autoit]
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.
Spoiler anzeigen
[autoit]; wichtig 'Include' nicht vergessen!
[/autoit] [autoit][/autoit] [autoit]
#include <file.au3>$logPath = @ScriptDir & '\send.log'
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func Senden1()
[/autoit]
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:
[autoit]
Dann mach aus dem Edit-Inhalt einen fortlaufenden String und behandele es wie im anderen Bsp.:#Include <GuiEdit.au3>
[/autoit]
$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:
Spoiler anzeigen
[autoit]#include <file.au3>
[/autoit]
$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>
[/autoit][autoit][/autoit][autoit]
$logPath = @ScriptDir & '\send.log'Func Senden1()
[/autoit]
Send($F1Send)
Send("{ENTER}")
_FileWriteLog($logPath, $F1Send)
EndFunc -
Hier mal mit Strings gemacht:
Spoiler anzeigen
[autoit]$strAlt = 'A Z'
[/autoit]
$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.