Moin Moin.
Also ich habe da mal eine Frage bezüglich des Inputfeldes.
Wie zähle ich während der Eingabe die Anzahl der eingegebenen Zahlen / Buchstaben / Zeichen?
Das war es schon wieder.
LG,
Crazy-A.
Moin Moin.
Also ich habe da mal eine Frage bezüglich des Inputfeldes.
Wie zähle ich während der Eingabe die Anzahl der eingegebenen Zahlen / Buchstaben / Zeichen?
Das war es schon wieder.
LG,
Crazy-A.
Meinst du alles zusammenzählen oder getrennt nach Zahlen, Buchstaben, ...???
Habe mal alles zusammengezählt
#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]$len_1_alt = 0
[/autoit] [autoit][/autoit] [autoit]GUICreate(" My GUI input acceptfile", 320, 120)
$file = GUICtrlCreateInput("", 10, 5, 300, 20)
$btn = GUICtrlCreateButton("Ok", 40, 75, 60, 20)
$label = GUICtrlCreateLabel("", 10, 50, 50)
GUISetState()
[/autoit] [autoit][/autoit] [autoit]$msg = 0
While $msg <> $GUI_EVENT_CLOSE
$msg = GUIGetMsg()
Select
Case $msg = $btn
ExitLoop
EndSelect
$len_1 = StringLen(GUICtrlRead($file))
If $len_1_alt <> $len_1 Then
GUICtrlSetData($label, $len_1)
$len_1_alt = $len_1
EndIf
WEnd
Oder so:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $inp1
GUICreate(" My GUI", 320, 120)
$inp1 = GUICtrlCreateInput("", 10, 5, 300, 20, BitOR($ES_AUTOHSCROLL, $ES_RIGHT))
GUISetState()
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
ToolTip(StringLen(GUICtrlRead($inp1)))
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
If BitAND($wParam, 0xFFFF) = $inp1 Then ToolTip(StringLen(GUICtrlRead($inp1)))
EndFunc ;==>MY_WM_COMMAND
Hi,
weiß einer, ob meine oder Oscars Version besser bzw. schneller ist?
Was bedeutet bei Oscars Variante "0xFFFF"
Also ich finde beide Versionen haben etwas !!!
Beide arbeiten fehlerfrei bei mir und welche schneller ist? Ich will dazu mal sagen, wenn Frau sehr schnell an der Tastatur ist, dann kann auch mal eine Anzeige nicht hinterher kommen. Nein, Spaß bei Seite. Also, es war Spaß! Ich kann gar kein Unterschied sehen bzw. feststellen.
Da stellt sich mir die Frage, wie soll man das denn feststellen können? Also mit beiden Versionen den gleichen Text abtippen, bringt gar nicht? Doch, genauso kann man es messen.
Jungs, bleibt ruhig, ich es erkläre es euch. Oder sagen wir besser, ich erkläre Euch meine Gedanken die ich dann umgesetzt habe.
Sicherlich wollt ihr nämlich gerade schreiben, das man nie den gleichen Text in der gleichen Zeit abschreiben kann. Das habe ich mir auch gedacht, aber im Kopf nach einer Lösung gesucht. Eine Lösung, die sogar vor Gericht stand haben würde. Ich habe sie gefunden. Ich tippe einmal einen Text von 150 Zeichen aus einen Buch ab. Okay es ware bei mir die TV Zeitung. Das ganze habe ich mit dem Macrorecorder aufgezeichnet. Dann das erste Script seine Arbeit machen lassen. Das erste Tool startete, öffnete der Script, startete es, schrieb 150 Zeichen in das Inputfeld, und so weiter. Das gleiche nochmals mit dem zweiten Script.
Und was war das Ergebnis ? Nun, an PC's getestet und unterschiedliche Sieger. 1x das erste Script, 2x das zweite Script. Das ist jetzt das, was ich nicht verstehe?
Kann mir jemand das erklären?
LG,
Alina.
Tweaky: Wenn man in einem LONGWORD ($wParam) zwei Parameter "einbettet", dann kann man mit BitAND($wParam, 0xFFFF) das LOW WORD und mit BitAND($wParam, 0xFFFF0000) das HIGH WORD ansprechen. Die jeweils anderen Bits werden ausgeblendet. Im Falle von WM_COMMAND befindet sich im LOW WORD die Control-ID der letzten User-Aktion.
Edit: Man kann mein Beispiel auch noch auf mehrere Inputs ausbauen:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
GUICreate(" My GUI", 350, 120)
$inp1 = GUICtrlCreateInput("", 10, 5, 300, 20, BitOR($ES_AUTOHSCROLL, $ES_RIGHT))
$inp2 = GUICtrlCreateInput("", 10, 25, 300, 20, BitOR($ES_AUTOHSCROLL, $ES_RIGHT))
$inp3 = GUICtrlCreateInput("", 10, 45, 300, 20, BitOR($ES_AUTOHSCROLL, $ES_RIGHT))
$label1 = GUICtrlCreateLabel("0", 320, 5, 30, 20)
$label2 = GUICtrlCreateLabel("0", 320, 25, 30, 20)
$label3 = GUICtrlCreateLabel("0", 320, 45, 30, 20)
GUISetState()
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
Switch BitAND($wParam, 0xFFFF)
Case $inp1
GUICtrlSetData($label1, StringLen(GUICtrlRead($inp1)))
Case $inp2
GUICtrlSetData($label2, StringLen(GUICtrlRead($inp2)))
Case $inp3
GUICtrlSetData($label3, StringLen(GUICtrlRead($inp3)))
EndSwitch
EndFunc ;==>MY_WM_COMMAND
AHH Oscar DANKE DANKE DANKE
Auf so eine Erkärung habe ich schon so lange gewartet Jetzt kapier ich erstmal das prinzip Davor habe ich es einfach nur Angewandt, jetzt versteh ich es auch *juhu*
Jetzt noch eine kleine Frage, z.b. bei ner Combobox kann man ja auch noch ne "aktion" abfragen z.b. dropdown scroll eingabe usw usw, In den ganzen beispielscripten stand das dann immer nur so:
Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
$aktion = BitAND($wParam, 16) ;hiword
Switch BitAND($wParam, 0xFFFF)
Case $inp1
Switch $aktion
Case $CBN_DROPDOWN
GUICtrlSetData($label1, StringLen(GUICtrlRead($inp1)))
EndSwitch
Case $inp2
GUICtrlSetData($label2, StringLen(GUICtrlRead($inp2)))
Case $inp3
GUICtrlSetData($label3, StringLen(GUICtrlRead($inp3)))
EndSwitch
EndFunc ;==>MY_WM_COMMAND
Wo wird denn diese Variable ($CBN_DROPDOWN) definiert bzw. gibt es eine Liste was für "aktionen" es bei bestimmten GUICtrl sachen gibt? z.b. für checkboxen, inputs usw usw
Ich hab es soweit verstanden das das HIWORD wohl die Aktion ist, ist das überall so?
desweiteren kann man eigentlich überall noch sowas finden:
If Not IsHWnd($hCombo) Then $hWndCombo = GUICtrlGetHandle($hCombo)
Bei mir hat das sonst auch nie funktioniert, aber was bringt das?
Tweaky & Lina
Also ich habe da ein script in dem es mehr als nur eine Input box gibt, genauer gesagt 200 x 16 + nochn paar :O Tjoar und da hat sich der WM_COMMAND als sehr viel schneller erwiesen :). Weil bei dem anderen Prinzip läuft ja quasi die ganze zeit eine schleife und prüft ob das Input focused ist oder nicht...
da dein Windows im Hintergrund eine ganze Menge tut - und da wahrscheinlich noch einige "andere Applikationen" offen sind, ist es ganz normal das du immer verschiedene Ergebnisse bekommst (selbst wenn beide Programme "gleich schnell" sind)
kompilier doch einfach 10 mal hintereinander das gleiche Skript oder lass eine komplexe Schleife laufen - und guck dir die Zeit in der Cmdline an - die ist immer anders ...
FireFlyer: In dem Fall musst Du erst das HIWORD in den unteren Bereich "shiften", um es dann mit $CBN_DROPDOWN zu vergleichen. Oder um es mit meinem Beispielscript zu erklären:
#include<ComboConstants.au3>
#include<EditConstants.au3>
#include<GUIConstantsEx.au3>
#include<WindowsConstants.au3>
Global $count
GUICreate(" My GUI", 350, 180)
$inp1 = GUICtrlCreateInput("", 10, 5, 300, 20, BitOR($ES_AUTOHSCROLL, $ES_RIGHT))
$inp2 = GUICtrlCreateInput("", 10, 25, 300, 20, BitOR($ES_AUTOHSCROLL, $ES_RIGHT))
$inp3 = GUICtrlCreateInput("", 10, 45, 300, 20, BitOR($ES_AUTOHSCROLL, $ES_RIGHT))
$combo = GUICtrlCreateCombo("item1", 10, 100, 80, 20, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, "item2|item3", "item3")
$label1 = GUICtrlCreateLabel("0", 320, 5, 30, 20)
$label2 = GUICtrlCreateLabel("0", 320, 25, 30, 20)
$label3 = GUICtrlCreateLabel("0", 320, 45, 30, 20)
GUISetState()
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
If BitShift($wParam, 16) = $CBN_DROPDOWN Then
$count += 1
ToolTip($count & ' ' & GUICtrlRead($combo))
EndIf
Switch BitAND($wParam, 0xFFFF)
Case $inp1
GUICtrlSetData($label1, StringLen(GUICtrlRead($inp1)))
Case $inp2
GUICtrlSetData($label2, StringLen(GUICtrlRead($inp2)))
Case $inp3
GUICtrlSetData($label3, StringLen(GUICtrlRead($inp3)))
EndSwitch
EndFunc ;==>MY_WM_COMMAND
Ob es eine Liste gibt, kann ich nicht sagen. Entzieht sich meiner Kenntnis, aber auf den msdn-Seiten (msdn.microsoft.com) findet man eine ganze Menge dazu. Google ist auch immer wieder Dein Freund.
Bei "IsHWnd" wird geprüft, ob die Variable ein Handle enthält. Wenn nicht wird mit GUICtrlGetHandle das Handle der Combobox geholt und der Variablen zugewiesen. Das ist oft bei den ganzen UDFs (beginnen mit einem Unterstrich) nötig. Die funktionieren oft nur, wenn das Handle angegeben wird. Die "normalen" Befehle geben ja immer "nur" eine Control-ID zurück. Im Gegensatz zu den meisten UDFs reicht denen die ID aber auch aus.
okay... ja auf msdn hatte ich auch schon geschaut (in letzter zeit treibe ich mich da oft rum ) Aber irgendwie hatte ich nix zu diesen variablen gefunden aber mir ist da grade son gedanke gekommen
Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
Switch BitAND($wParam, 0xFFFF)
Case $inp1
ConsoleWrite(BitShift($wParam, 16)&@LF)
EndSwitch
EndFunc
Und dann mal gucken und sich selbst ne liste erstellen, funktioniert sowas? Also ich meine wird da dann irgendein wert (ich hab keinerlei schimmer was für ein wert^^) in die console geschrieben wenn man eine bestimmte aktion ausführt? Also ich nehme jetzt mal das Input:
Wenn man reinklickt (focused) kommt dann z.b. der wert 1
Wenn man schreibt bzw. den inhalt ändert 2 usw usw?
Klar dass das jetzt nich 1 & 2 sind sondern was anderes aber so in der art halt?
Zum erstellen der Liste, dann aber eher so:
[autoit]
Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
ConsoleWrite(BitShift($wParam, 16)&@LF)
EndFunc ;==>MY_WM_COMMAND
Dann musst Du Dir "nur" noch eine GUI basteln mit allen GUI-Elementen und diese dann alle anklicken, und...
Ich meinte wenn man jetzt nur eine Liste z.b. für ein Input haben möchte... sonst kommt man ja ganz durcheinander
Ich handhabe das eigentlich so, dass ich die Funktion erstelle, wenn ich sie brauche.
Jetzt so eine Liste zu erstellen, welcher Wert wann wo angezeigt wird, finde ich zu mühsam.
Zitatwelcher Wert wann wo angezeigt wird, finde ich zu mühsam
Naja das WO ist schonmal einfach :D: da wo du ihn ausgiebst *sichinsfäustchenlacht*
OK,
danke Oscar für die super Erklärung