Da bin ich heut extra gefahren wie ein Teufel, um noch rechtzeitig vor Mitternacht wieder zu Hause zu sein und dir gratulieren zu können.
Also Pee: Alles Gute, Viel Erfolg (und Spaß) beim Studium und alles, was sonst noch wünschenswert ist. ![]()
Da bin ich heut extra gefahren wie ein Teufel, um noch rechtzeitig vor Mitternacht wieder zu Hause zu sein und dir gratulieren zu können.
Also Pee: Alles Gute, Viel Erfolg (und Spaß) beim Studium und alles, was sonst noch wünschenswert ist. ![]()
Wie man sieht, hat dein Bruder allen Grund so zu handeln. ![]()
Ja, das idiotische ist, dass die Funktionsnamen nur einen Unterstrich dazu bekommen haben. Es also keine völlig neuen Funktionen sind.
Statt: _GUICtrlListViewGetItemText JETZT _GUICtrlListView_GetItemText
Und statt _GUICtrlListViewDeleteAllItems($ListView1) JETZT
_GUICtrlListView_DeleteAllItems("Farbe|Name|HEX-Code|R/G/B") - Hier darf NICHT mehr die ID verwendet werden sondern es muß das Control mit Titel angesprochen werden (omfg).
Folgende Fehler:
- du deklarierst "OnEvent-Mode", arbeitest aber in Event UND GUIGetMsg -Mode
- Variablennamen sind mehrfach vergeben
- Events sind nicht korrekt zugeordnet
Bring da erst mal Ordnung rein.
Also seit der neuesten Version von AutoIt ärgere ich mich hier nur noch.
Ich war echt am Überlegen, ob ich mir nicht wieder die vorige Version aufspiele, aber dann kann man ja keine Skripte mehr tauschen ![]()
Die Änderungen gerade im Listview-Bereich sind katastrophal. Kein Befehl wurde erhalten, d.h. alle vorhandenen Skripte müssen umgearbeitet werden *würg*.
Außerdem funktioniert z.B. der Befehl: _GUICtrlListView_DeleteAllItems($ListView1) mit neuer Syntax. Wenn man diesen ausführt, poppt eine Meldung auf, man soll doch gefälligst zum Löschen von Items GUICtrlDelete verwenden oder aber NICHT die ID des Controls, sondern den Titel verwenden. Wer denkt sich denn so etwas aus. Bei 99% der Funktionen wird das Control per ID angesprochen ABER hierbei darf es nicht sein???
So langsam vergeht einem der Spaß. Mal sehen, was für Stinkbomben noch hinterlegt sind in dieser Version - werde mal Stück für Stück meine Skripte testen. Ich befürchte Schlimmes...
Ich wollte mir nur mal Luft machen, weil mich das echt auf die Palme bringt. ![]()
Ich hab dir hier mal eine Variante erstellt, die vielleicht noch nicht 100% aber recht gut läuft.
Du benötigst dazu die "DLLCallBack.au3" aus der au3_callback_v6.5
#include <GUIConstants.au3>
#include <GUIEdit.au3>
#include '...\au3_callback_v6.5\DllCallBack.au3' ; dein Pfad zur DLLCallBack
Opt("GUIOnEventMode", 1)
Global Const $WH_KEYBOARD_LL = 13
Global $hHook, $pStub_KeyProc
Global $pStub_KeyProc = _DllCallBack ("_KeyProc","int;ptr;ptr")
Global $hmod = DllCall("kernel32.dll","hwnd","GetModuleHandle","ptr",0)
Global $hHook = DllCall("user32.dll","hwnd","SetWindowsHookEx","int", _
$WH_KEYBOARD_LL,"ptr",$pStub_KeyProc,"hwnd",$hmod[0],"dword",0)
Global $buffer = ""
Dim $Fest = '<Festtext>'
Dim $minLen = StringLen($Fest)
$Form1 = GUICreate("Form1", 633, 310, 193, 115)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
$Edit1 = GUICtrlCreateEdit("", 24, 16, 585, 265, BitOR($WS_VSCROLL, $WS_HSCROLL, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL))
GUICtrlSetData(-1, $Fest)
GUISetState(@SW_SHOW)
_GUICtrlEdit_SetSel($Edit1, -1, -1) ; Cursor hinter Festtext
While 1
Sleep(10)
WEnd
Func Form1Close()
Exit
EndFunc
Func EvaluateKey($keycode)
Select
Case $keycode = 13 ; Enter
If _checkCurrentRow() Then _
_GUICtrlEdit_AppendText($Edit1, @CRLF & $Fest)
Case $keycode = 8 Or $keycode = 46 ; Backspace oder Delete
_checkCurrentRow()
EndSelect
EndFunc
Func _checkCurrentRow()
$indx = _GUICtrlEdit_LineFromChar($Edit1)
$currLen = _GUICtrlEdit_LineLength($Edit1, $indx)
$pos1stInLine = _GUICtrlEdit_LineIndex($Edit1, $indx)
$pos = _GUICtrlEdit_GetSel($Edit1)
$lenInLine = $pos[0]-$pos1stInLine
If $currLen <= $minLen Or $lenInLine <= $minLen Then
_GUICtrlEdit_Undo($Edit1)
Return False
EndIf
Return True
EndFunc
Func _KeyProc($nCode, $wParam, $lParam)
Local $ret,$KEYHOOKSTRUCT
If $nCode < 0 Then
$ret = DllCall("user32.dll","long","CallNextHookEx","hwnd",$hHook[0], _
"int",$nCode,"ptr",$wParam,"ptr",$lParam)
Return $ret[0]
EndIf
If $wparam = 256 Then
$KEYHOOKSTRUCT = DllStructCreate("dword;dword;dword;dword;ptr",$lParam)
EvaluateKey(DllStructGetData($KEYHOOKSTRUCT,1))
EndIf
$ret = DllCall("user32.dll","long","CallNextHookEx","hwnd",$hHook[0], _
"int",$nCode,"ptr",$wParam,"ptr",$lParam)
Return $ret[0]
EndFunc
Func OnAutoItExit()
DllCall("user32.dll","int","UnhookWindowsHookEx","hwnd",$hHook[0])
EndFunc
Ich hatte anfangs mit _IsPressed() probiert, aber damit läßt sich das Problem nicht lösen, schon allein weil du mit dieser Funktion nicht die 'Delete'-Taste abfangen kannst.
Edit: Hab noch eine Verbesserung eingefügt, ich glaube nun sind wir bei 100% ![]()
Gibt es, habe ich geschrieben und in Skripte gepostet: Standard-Editor notepad ersetzen
Verwende die GUI-Variante, da siehst du immer, welcher Editor gerade als Standardeditor aktiviert ist. Verwenden kannst du das für die meisten Editoren. Kompiliere das Skript und verwende ein Icon deiner Wahl.
Du kannst es doch gleich in einer Abfrage regeln:
ReDim $arSortable[$ar[0]][3]
For $i = 1 To UBound($ar) -1
$var = StringSplit($ar[$i], ' ')
If IsArray($var) And $var[0] = 3 Then ; hier gleich auf korrekte Anzahl prüfen
$arSortable[$i-1][0] = $var[1] ; Geb.Dat.
$arSortable[$i-1][1] = $var[2] ; Vorname
$arSortable[$i-1][2] = $var[3] ; Name
EndIf
Next
Falls einige Einträge dadurch rausfallen hast du im 2D-Array ein paar leere Einträge, die kannst du aber auch noch entfernen. Funktion siehe in meiner Signatur.
Das geht in etwa so:
- wenn Enter gedrückt Zeilenumbruch einfügen und Festtext in die neue Zeile schreiben
- in einer Schleife ständig die Länge der aktuellen Zeile überwachen
- wird durch Rückwärtslöschen oder Markieren und anschließendem Löschen die Mindestlänge für den Festtext unterschritten, aktiviere Undo
Ist aber ziemlich aufwändig.
Mach es doch (ist auch nicht so umständlich) mit Kombination Inputfeld und Editbox (wie z.B. bei einem Messengerprogramm).
Und beim Einlesen des Inputfeldes fügst du den Festbestandteil an und zeigst dann alles in der Editbox.
Warum so kompliziert?
Für ein Update erweiterst du einfach die INI um die entsprechenden Einträge/Sektionen. Du mußt ja davon ausgehen, dass in der INI inzwischen nutzerspezifische Änderungen gespeichert sind (sonst hättest du ja die Werte nicht in einer INI, sondern als Variablen/Konstanten im Programm).
Also füge beim Ausführen des Updates nur neue Werte hinzu, damit die alten Einstellungen nicht verloren gehen.
Du kannst ja um sicher zu gehen, beides hinterlegen.
If Not FileExists($INIPath) Then
FileInstall('..\Quell-Pfad INI', $INIPath)
Else
IniWriteSection($INIPath, 'sectionNEW', 'data') ; neue Sektion
IniWrite($INIPath, 'section', 'key', 'value') ; geänderte oder neue Werte in vorhandener Sektion
EndIf
Verwende statt ConsoleWrite MsgBox(), dann hast du keine Probleme.
Warum erst installieren und dann nur bei Bedarf verschieben?
Besser ist doch: nur installieren, wenn nicht da:
$KDP = @AppDataCommonDir & "\XT\KD"
If not FileExists($KDP&"\KOI.ini") Then _
FileInstall("C:\Dokumente und Einstellungen\Fabian\Desktop\AutoItDateien\Hilfsdateien\KOI.ini", $KDP & "\KOI.ini")
If FileMove(....) = 1 Then ConsoleWrite('Ferddisch')
[/autoit]Ich denke Auswerten des Returnwertes sollte das Einfachste sein. ![]()
ZitatSuccess: Returns 1.
So wird ein Schuh draus:
#include <file.au3>
#include <array.au3>
Dim $file = 'test.txt'
Dim $ar, $arSortable[1][3], $var
_FileReadToArray($file, $ar)
If @error Then Exit
_ArrayDisplay($ar, 'unsortiert - 1D Array')
ReDim $arSortable[$ar[0]][3]
For $i = 1 To UBound($ar) -1
$var = StringSplit($ar[$i], ' ')
If IsArray($var) Then
$arSortable[$i-1][0] = $var[1] ; Geb.Dat.
$arSortable[$i-1][1] = $var[2] ; Vorname
$arSortable[$i-1][2] = $var[3] ; Name
EndIf
Next
_ArrayDisplay($arSortable, 'vor der Sortierung')
_ArraySort($arSortable, Default,0,0,3,1)
_ArrayDisplay($arSortable, 'sortiert nach Vorname')
_ArraySort($arSortable, Default,0,0,3,2)
_ArrayDisplay($arSortable, 'sortiert nach Name')
Also die Erklärung zu '+' mußt du im Vergleich zu '*' betrachten.
'+' bedeutet: Element MUSS mindest einmal, kann beliebig oft vorkommen
'*' bedeutet: Element kann beliebig oft vorkommen, also auch kein-mal.
Und hiermit "[^0-9]+" schließt du alle Ziffern aus dem Match aus
Wenn Du alle Ziffern/Zahlen möchtest: "[0-9]+" oder kürzer: "\d+"
- Das war definitiv ein Beitrag von dem ich nicht ein einziges Wort verstanden habe. ![]()
:wacko: