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. ![]()
Beiträge von BugFix
-
-
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.5Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#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>'
[/autoit] [autoit][/autoit] [autoit]
Dim $minLen = StringLen($Fest)$Form1 = GUICreate("Form1", 633, 310, 193, 115)
[/autoit] [autoit][/autoit] [autoit]
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 FesttextWhile 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(10)
WEndFunc Form1Close()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFuncFunc EvaluateKey($keycode)
[/autoit] [autoit][/autoit] [autoit]
Select
Case $keycode = 13 ; Enter
If _checkCurrentRow() Then _
_GUICtrlEdit_AppendText($Edit1, @CRLF & $Fest)
Case $keycode = 8 Or $keycode = 46 ; Backspace oder Delete
_checkCurrentRow()
EndSelect
EndFuncFunc _checkCurrentRow()
[/autoit] [autoit][/autoit] [autoit]
$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
EndFuncFunc _KeyProc($nCode, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
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]
EndFuncFunc OnAutoItExit()
[/autoit]
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:
Spoiler anzeigen
[autoit]ReDim $arSortable[$ar[0]][3]
[/autoit]
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.Spoiler anzeigen
[autoit]If Not FileExists($INIPath) Then
[/autoit]
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?
[autoit]
Besser ist doch: nur installieren, wenn nicht da:$KDP = @AppDataCommonDir & "\XT\KD"
[/autoit]
If not FileExists($KDP&"\KOI.ini") Then _
FileInstall("C:\Dokumente und Einstellungen\Fabian\Desktop\AutoItDateien\Hilfsdateien\KOI.ini", $KDP & "\KOI.ini") -
[autoit]
If FileMove(....) = 1 Then ConsoleWrite('Ferddisch')
[/autoit] -
Ich denke Auswerten des Returnwertes sollte das Einfachste sein.
ZitatSuccess: Returns 1.
-
-
So wird ein Schuh draus:
Spoiler anzeigen
[autoit]#include <file.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <array.au3>Dim $file = 'test.txt'
[/autoit] [autoit][/autoit] [autoit]
Dim $ar, $arSortable[1][3], $var_FileReadToArray($file, $ar)
[/autoit] [autoit][/autoit] [autoit]
If @error Then Exit_ArrayDisplay($ar, 'unsortiert - 1D Array')
[/autoit] [autoit][/autoit] [autoit]
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')
[/autoit]
_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: -
Das ist ja grottig
- dann muß man wohl jetzt alle Skripte nochmals testen, Heidenarbeit.
OK - danke für den Tipp, werde ich bei Gelegenheit mal durchsehen. -
Ich verstehe Deinen Ansatz nicht. Du schreibst:
D.h. in der Txt steht ein Name und ein MailAdresse.Warum liest du dann diese eine Zeile in ein Array ein? - Da tuts doch auch FileReadLine().
Und dann vergleichst du die ersten 6 Zeichen aus der Textdatei mit den Dateinamen. Sind denn die Namen bei dir alle genau 6 Zeichen lang? - Kann ich mir nicht vorstellen. -
Arrays sollte man schon mit For-Schleife durchgehen.
In dieser Variante spart man den Array-Include.
Oder nimm die Variante aus meiner Signatur (1D u. 2D).Spoiler anzeigen
[autoit]Func _ArrayDeleteEmpty(ByRef $ARRAY)
[/autoit]
If Not IsArray($ARRAY) Then Return 0
Local $arTMP[1]
For $i = 0 To UBound($ARRAY) -1
If $ARRAY[$i] <> '' Then
If $arTMP[0] = '' Then
$arTMP[0] = $ARRAY[$i]
Else
ReDim $arTMP[UBound($arTMP)+1]
$arTMP[UBound($arTMP)-1] = $ARRAY[$i]
EndIf
EndIf
Next
$ARRAY = $arTMP
EndFunc -
Hi,
wenn ihr mal mit ComboBoxen arbeitet werdet ihr merken, dass die vorhandenen Suchfunktionen ( _GUICtrlComboFindString / _GUICtrlComboBox_FindString ) keinen großen Wert besitzen, da selbst bei nichtsensitiver Suche der Eintrag nur gefunden wird, wenn er mit dem Suchbegriff beginnt.
Bsp.
Eintrag ist 'Waldfee'
Suche nach 'Wald' - erfolgreich
Suche nach 'fee' - kein ErfolgDeshalb habe ich eine Suchfunktion erstellt, die zum einen jedes eventuelle Vorkommen des Suchbegriffs berücksichtigt, wahlweise sensitive oder nichtsensitive Suche, und zum anderen den Index der ComboBoxListe für die Treffer und die zugehörigen Einträge zurückgibt. Rückgabetyp ist eine Array, dass die Anzahl der Treffer in Array[0][0] führt.
Erforderlich ist die aktuelle Beta.Spoiler anzeigen
[autoit];===============================================================================
[/autoit]
; Function Name: _ComboBoxSearch
; Description:: durchsucht alle ComboBox Einträge nach dem Suchbegriff
; Parameter(s): $hWnd Handle der ComboBox
; $sText Suchbegriff
; $iSens Sensitivität 0 = teilweise Übereinstimmung
; 1 = exakte Übereinstimmung
; Requirement(s): aktuelle Beta
; Return Value(s): 2D-Array Array[0][0] enthält die Anzahl der Treffer
; Array[$i][0] = Index in CB-Liste
; Array[$i][1] = Listeneintrag
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
#Include <GuiComboBox.au3>
Func _ComboBoxSearch($hWnd, $sText, $iSens=0)
Local $arMatches[1][2]=[[0,'']], $n = _GUICtrlComboBox_GetCount($hWnd), $val
If $iSens < 0 Or $iSens > 1 Then $iSens = 0
For $i = 0 To $n -1
_GUICtrlComboBox_GetLBText($hWnd, $i, $val)
If StringInStr($val, $sText, $iSens) Then
ReDim $arMatches[UBound($arMatches)+1][2]
$arMatches[UBound($arMatches)-1][0] = $i
$arMatches[UBound($arMatches)-1][1] = $val
$arMatches[0][0] += 1
EndIf
Next
Return $arMatches
EndFunc ;==>_ComboBoxSearch