Zahlen in Editfeld verhindern Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Filzfrosch
Posts: 42
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Zahlen in Editfeld verhindern

25 Jan 2021, 19:57

Moin,

sorry für eine eventuell etwas dumme Frage .....
Kann man für ein Edit-Steuerelement eigentlich auch irgendwie festlegen, dass dort keine Zahlen (Ziffern) eingegeben werden dürfen?
Ich finde nur die Option, dass nur Zahlen eingegeben werden dürfen.

Ich habe ein TAB-Steuerelement und im Script eine Möglichkeit eingebaut, dass die Namen der Tabs nachträglich frei gewählt werden können. Bei Buchstaben kein Problem.
Sowie aber ein Tab nachträglich mit einer einfachen Zahl benannt wird, kommt die ganze TAB Konstruktion ins schleudern.
Daher möchte ich das irgendwie abfangen, bzw. vermeiden, dass jemand als Tab-Namen eine Zahl wählen kann.

Grüße
BoBo
Posts: 4358
Joined: 13 May 2014, 17:15

Re: Zahlen in Editfeld verhindern

26 Jan 2021, 06:02

Ein gLabel zur Validierung gegen den Typ? If var is not <gewünschter typ> :?:
Stellt sich nur die Frage ob "frei gewählt" (sinngemäß) mit derartigen Einschränkungen vereinbar ist. Was, wenn der User gerne Tab1/Tab2/... wählen möchte??
daywalker
Posts: 23
Joined: 18 Jun 2019, 01:37

Re: Zahlen in Editfeld verhindern

26 Jan 2021, 08:38

Hatte ich auch schon länger gesucht und aufgegeben, da trotzdem über RMB->Einfügen alphanumerische Zeichen eingegeben werden können (wollte aber nicht auf die Funktionaltät RMB->Einfügen/STRG-V verzichten)
Filzfrosch
Posts: 42
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Re: Zahlen in Editfeld verhindern

26 Jan 2021, 09:15

Moin,

danke für die Antworten!
Ich habe inzwischen beim Tab-Namen herausgefunden, dass nur reine Zahlen das Gerüst durcheinander bringen. Wenn innerhalb des Tab-Namens eine Zahl steht, stört ihn das nicht (zB. Tab3 oder 3Tab sind problemlos). Von daher werde ich die von BoBo vorgeschlagene "If var is number" Variante mal einbauen und eine Message ausgeben, die den Nutzer darauf aufmerksam macht, dass nur Buchstaben+Zahlen Kombinationen erlaubt sind. Ist zwar kein abfangen des Problems, aber zumindest eine Hilfe.
Langfristig wäre es dann aber wohl doch besser, statische Tab-Namen zu verwenden ...
Oder ich müsste eine Prüfung bauen, die prüft, ob der Variablen Name des Tabs ein reiner Zahlenwert oder eine Buchstabe/Zahlen Kombi ist und ersteres dann verhindert. Wobei ich dann noch nicht wüsste, wie man das prüft.
Merry Crisis and a happy new fear
User avatar
haichen
Posts: 592
Joined: 09 Feb 2014, 08:24

Re: Zahlen in Editfeld verhindern

27 Jan 2021, 06:39

Ich habe mal eine Validierungsfunktion mit RegExp gemacht:

Code: Select all

teststr1:= "jhgvg 3A" 
teststr2:= "jhgvg     " 
teststr3:= "3355555" 
teststr4:= "jh44gcvg" 
teststr5:= "jhgvgscfd" 
teststr6:= "jh44 vg  " 

AFZ:=""""
loop, 6
{
   Input:= teststr%a_index%
   test.= AFZ Input AFZ "`tValidiert : " Validierung(Input) "`n"
}
   
Msgbox, % test


Validierung(Input){
   ; Nur Buchstaben und Zahlen oder nur Buchstaben
   Int:=RegExMatch(Input, "[0-9]") 
   Char:=RegExMatch(Input, "[a-zA-Z]")
   Other:=RegExMatch(Input, "[^a-zA-Z0-9]") 
   
   NurBuchstaben :=  !Int and !Other
   NurBuchstabenUndZahlen := Int and char and !Other
   
   Return NurBuchstabenUndZahlen or NurBuchstaben
}


/*
   NurZahlen:=   Int and !Char and !Other
   NurBuchstaben :=  !Int and !Other
   NurBuchstabenUndZahlen := Int and char and !Other  
*/
Filzfrosch
Posts: 42
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Re: Zahlen in Editfeld verhindern

27 Jan 2021, 06:57

Hey, das ist cool, auch wenn ich mir das erstmal genauer anschauen muss um es zu verstehen (mit RegEx habe ich immer so meine Problemchen ...).
Eine Frage schon mal:
Könnte man da auch noch mit reinnehmen, dass Leerzeichen auch erlaubt sind? Oder zumindest innerhalb des Namens (vorne und hinten Leerzeichen machen ja eh kaum Sinn bei der Namensvergabe)?
Auf jeden Fall schon mal vielen Dank, werde damit mal ein wenig rumtesten.
Merry Crisis and a happy new fear
Filzfrosch
Posts: 42
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Re: Zahlen in Editfeld verhindern

27 Jan 2021, 07:14

Ok, das mit den Leerzeichen habe ich gerade selber herausgefunden ... einfach ein Leerzeichen bei "Other" mit aufgenommen.
Und es ist auch eigentlich gar nicht so schwer zu verstehen.
Nochmals vielen Dank dafür, jetzt habe ich etwas zum rumtesten ...
Merry Crisis and a happy new fear
just me
Posts: 7747
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zahlen in Editfeld verhindern  Topic is solved

27 Jan 2021, 07:14

Moin,

für die Eingabeprüfung bei Editcontrols gibt es auch eine Lösung, die etwas tiefer in den Keller greift. Das Zauberwort heißt 'Subclassing'. Damit wird die Nachrichtenverarbeitung eines bestimmten Controls auf eine AHK-Funktion umgeleitet. Man kann so genau verfolgen, was dem Control alles mitgeteilt wird. Die Grundsätze des Subclassing habe ich hier erläutert (zumindest habe ich es versucht). Es bleibt allerdings in der Regel sehr technisch, weil man sich notgedrungen mit den Windows-Interna beschäftigen muss.

Für diesen konkreten Fall habe ich damit eine Lösung erstellt, die folgende Prüfungen durchführt:
  • Abweisung von führenden Ziffern.
  • Abweisung von Zeichen, die nicht Buchstaben, Ziffern oder der Unterstrich sind (das Leerzeichen wird in dieser Version auch abgewiesen).
  • Verhindern, das über die Zwischenablage eingefügt wird.
Man kann das Alles noch trefflich verfeinern, als Beispiel sollte es aber ausreichen.

Code: Select all

#NoEnv
SetBatchLines, -1
Gui, Margin, 100, 50
Gui, Add, Edit, w100 vNeuerTabName hwndHEDT
SubclassControl(HEDT, "CheckInput")
Gui, Show, , Edit Test
Return
; ----------------------------------------------------------------------------------------------------------------------
GuiClose:
ExitApp
; ======================================================================================================================
CheckInput(HWND, Msg, wParam, lParam, SubclassID, RefData) {
   Static Err1 := "Die Namen dürfen nicht mit einer Ziffer beginnen!"
        , Err2 := "Die Namen dürfen nur Buchstaben, Ziffern und den Unterstrich enthalten!"
        , Err3 := "Einfügen ist hier nicht erlaubt!"
   Switch Msg {
      Case 0x0102:   ; WM_CHAR -----------------------------------------------------------------------------------------
         If (wParam != 0x08) { ; BACKSPACE
            If (wParam < 0x40) && (wParam > 0x29) {
               DllCall("SendMessage", "Ptr", HWND, "UInt", 0x00B0, "IntP", Start, "Ptr", 0)
               If (Start = 0) {
                  EM_SHOWBALLOONTIP(HWND, "Ungültiges Zeichen!", Err1, 3)
                  Return 0
               }
            }
            If !RegExMatch(Chr(wParam), "[\wÄÖÜäöüß]") {
               EM_SHOWBALLOONTIP(HWND, "Ungültiges Zeichen!", Err2, 3)
               Return 0
            }
         }
      Case 0x0302:   ; WM_PASTE ----------------------------------------------------------------------------------------
            EM_SHOWBALLOONTIP(HWND, "Unzulässige Aktion!", Err3, 3)
            Return 0
      Case 0x0002:   ; WM_DESTROY --------------------------------------------------------------------------------------
         SubclassControl(HWND, "") ; remove the subclass procedure
   }
   Return DllCall("Comctl32.dll\DefSubclassProc", "Ptr", HWND, "UInt", Msg, "Ptr", wParam, "Ptr", lParam)
}
; ======================================================================================================================
; SubclassControl    Installs, updates, or removes the subclass callback for the specified control.
; Parameters:        HCTRL    -  Handle to the control.
;                    FuncName -  Name of the callback function as string.
;                                If you pass an empty string (""), the subclass callback will be removed.
;                    RefData  -  Optional integer value passed to the callback function.
; Return value:      Non-zero if the subclass callback was successfully installed, updated, or removed; otherwise False.
; Remarks:           The callback function must have exactly six parameters, see
;                    SUBCLASSPROC -> msdn.microsoft.com/en-us/library/bb776774(v=vs.85).aspx
; ======================================================================================================================
SubclassControl(HCTRL, FuncName, RefData := 0) {
   Static ControlCB := []
   If ControlCB.HasKey(HCTRL) {
      DllCall("RemoveWindowSubclass", "Ptr", HCTRL, "Ptr", ControlCB[HCTRL], "Ptr", HCTRL)
      DllCall("GlobalFree", "Ptr", ControlCB[HCTRL], "Ptr")
      ControlCB.Remove(HCTRL, "")
      If (FuncName = "")
         Return True
   }
   If !DllCall("IsWindow", "Ptr", HCTRL, "UInt")
   Or !IsFunc(FuncName) || (Func(FuncName).MaxParams <> 6)
   Or !(CB := RegisterCallback(FuncName, , 6))
      Return False
   If !DllCall("SetWindowSubclass", "Ptr", HCTRL, "Ptr", CB, "Ptr", HCTRL, "Ptr", RefData)
      Return (DllCall("GlobalFree", "Ptr", CB, "Ptr") & 0)
   Return (ControlCB[HCTRL] := CB)
}
; ======================================================================================================================
; Displays a balloon tip associated with an edit control.
; Title  -  the title of the balloon tip.
; Text   -  the balloon tip text.
; Icon   -  the icon to associate with the balloon tip, one of the keys defined in Icons.
; ======================================================================================================================
EM_SHOWBALLOONTIP(HWND, Title, Text, Icon := 0) {
   ; EM_SHOWBALLOONTIP = 0x1503 -> http://msdn.microsoft.com/en-us/library/bb761668(v=vs.85).aspx
   Static Icons := {0: 0, 1: 1, 2: 2, 3: 3, NONE: 0, INFO: 1, WARNING: 2, ERROR: 3}
   NumPut(VarSetCapacity(EBT, 4 * A_PtrSize, 0), EBT, 0, "UInt")
   If !(A_IsUnicode) {
      VarSetCapacity(WTitle, StrLen(Title) * 4, 0)
      VarSetCapacity(WText, StrLen(Text) * 4, 0)
      StrPut(Title, &WTitle, "UTF-16")
      StrPut(Text, &WText, "UTF-16")
   }
   If !Icons.HasKey(Icon)
      Icon := 0
   NumPut(A_IsUnicode ? &Title : &WTitle, EBT, A_PtrSize, "Ptr")
   NumPut(A_IsUnicode ? &Text : &WText, EBT, A_PtrSize * 2, "Ptr")
   NumPut(Icons[Icon], EBT, A_PtrSize * 3, "UInt")
   Return DllCall("SendMessage", "Ptr", HWND, "UInt", 0x1503, "Ptr", 0, "Ptr", &EBT, "Ptr")
}
User avatar
haichen
Posts: 592
Joined: 09 Feb 2014, 08:24

Re: Zahlen in Editfeld verhindern

27 Jan 2021, 07:54

Tja ... da fällt mir auch nix mehr zu ein .. außer :bravo: und :dance:

Dein Subclassing-Beitrag ist toll!
Da ist allerdings meine Grenze schon überschritten. Ob ich das noch lerne .. mal schauen.
Filzfrosch
Posts: 42
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Re: Zahlen in Editfeld verhindern

27 Jan 2021, 07:56

Alter Falter ..... :crazy:

@just me
Da hast Du ja echt wieder einen rausgehauen ....
Das werde ich zwar nie in Gänze verstehen, aber es funktioniert prächtig!
Möchte mich mal (ich denke im Namen von ganz vielen hier) bei Dir für Deine tollen Tipps, Funktionen, Hilfen usw. hier bedanken!
Ist nicht selbstverständlich, sein immenses Wissen selbstlos mit anderen zu teilen!
Wenn ich Dein Bürgermeister wäre, würdest Du von mir den Status "Gemeinnützig" bekommen und steuerlich begünstigt werden :D

Ich habe an dieser Stelle

Code: Select all

            If !RegExMatch(Chr(wParam), "[\wÄÖÜäöüß ]") {
               EM_SHOWBALLOONTIP(HWND, "Ungültiges Zeichen!", Err2, 3)
               Return 0
hinter dem "ß" ein Leerzeichen eingefügt, jetzt werden Leerzeichen auch akzeptiert.
Ich hoffe, dass es so richtig ist und das keine Auswirkungen woanders hat, die ich noch nicht gesehen habe ... ?!
Merry Crisis and a happy new fear
User avatar
jNizM
Posts: 2681
Joined: 30 Sep 2013, 01:33
GitHub: jNizM
Contact:

Re: Zahlen in Editfeld verhindern

27 Jan 2021, 08:33

Wieder ein vorzügliches Beispiel, warum uns "just me" noch sehr sehr lange erhalten bleiben sollte. ;)

\s sollte eigtl der richtige RegEx Ausdruck für das Leerzeichen sein.
https://www.autohotkey.com/docs/misc/RegEx-QuickRef.htm#Common
[AHK] 1.1.33.02 x64 Unicode | [WIN] 10 Pro (Version 20H2) x64 | [GitHub] Profile
Donations are appreciated if I could help you
User avatar
haichen
Posts: 592
Joined: 09 Feb 2014, 08:24

Re: Zahlen in Editfeld verhindern

27 Jan 2021, 10:06

Und hier noch die Arme-Leute-Version,
wobei copy und paste Umgehungen abgefangen werden:

Code: Select all

Gui, Add, Edit, r1 vTabname w135 gtest
Gui, Add, Button, gname, zeige 
Gui,show
SetTimer, RemoveToolTip, 5000
return

test:
Gui, Submit, NoHide
; Bei der Eingabe sind mit Zahlen startende Texte nicht möglich. Mit Backspace kann jedoch a1234Name zu 123Name werden.
if !Validierung(Tabname)
{
   send {Backspace}
   tooltip, % "|" trim(Tabname) "| Bitte nur Buchstaben ODER Buchstaben und Zahlen"
}
return


name:
Gui, Submit, NoHide
if (Tabname="")
   return
if !Validierung(Tabname) ; fängt copy und paste ab. Das ist der wichtige Unterschied zu just me. Dort ist copy und paste nicht möglich.
{
   GuiControl, ,Tabname,
   tooltip, % "|" trim(Tabname) "| Bitte nur Buchstaben ODER Buchstaben und Zahlen"
   return
}
Tabname:=trim(Tabname)
msgbox,% "|"  Tabname "|" 
return



Validierung(Input){
   ; Nur Buchstaben und Zahlen oder nur Buchstaben
   Int:=RegExMatch(Input, "[0-9]") 
   Char:=RegExMatch(Input, "[a-zA-ZäöüßÄÖÜ]") ; hier darf kein \s sein 
   Other:=RegExMatch(Input, "[^a-zA-Z0-9äöüßÄÖÜ\s]") 
   
   NurBuchstaben :=  !Int and !Other
   NurBuchstabenUndZahlen := Int and char and !Other
   
   Return NurBuchstabenUndZahlen or NurBuchstaben
}

RemoveToolTip:
ToolTip
return

GuiClose:
ExitApp
:D

Edit: Korrektur beim Char-Regexp und Abfangen von Copy und Paste bei der Anzeige (Weiterverarbeitung der Eingabe).
Last edited by haichen on 28 Jan 2021, 03:15, edited 2 times in total.
Filzfrosch
Posts: 42
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Re: Zahlen in Editfeld verhindern

27 Jan 2021, 11:50

@ haichen
Ich habe mir Eure beiden Funktionen in meinen "AHK-Schätzchen" Ordner gespeichert ;)
Außer das ich in Deinem Script noch den Tipp von jNizM (mit dem \s anstatt eines Leerzeichens) verwendet habe. Macht in der Funktion zwar keinen Unterschied, aber in ein paar Jahren habe ich dann beim eventuellen wieder benutzen den "korrekten" Weg.
Das habe ich sonst vergessen bis dahin :D
Merry Crisis and a happy new fear
User avatar
haichen
Posts: 592
Joined: 09 Feb 2014, 08:24

Re: Zahlen in Editfeld verhindern

28 Jan 2021, 03:17

@ Filzfrosch
Hab noch eine kleine Korrektur gemacht.
just me
Posts: 7747
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zahlen in Editfeld verhindern

28 Jan 2021, 04:39

Moin @Filzfrosch,

Wenn Leerzeichen zugelassen werden, sollten die wahrscheinlich nicht am Anfang des Namens stehen. Ich würde deshalb auch noch die erste Prüfung erweitern:

Code: Select all

...
   Static Err1 := "Die Namen dürfen nicht mit einer Ziffer oder einem Leerzeichen beginnen!"
   ...
            If (wParam = 0x20) || ((wParam < 0x40) && (wParam > 0x29)) {
            ...
Ansonsten würde ich mich eher als 'gemein eigennützig' bezeichnen. Ich war ja lange Zeit als Programmierer beschäftigt und habe in dieser Zeit einiges gelernt. Das kann ich heute kaum noch sinnvoll einsetzen. Hier im Forum ist eine der wenigen Gelegenheiten, mein Wissen zu teilen, und ich fühle mich gut damit. ;)
Filzfrosch
Posts: 42
Joined: 18 Feb 2017, 08:39
Location: Hamburg / Germany

Re: Zahlen in Editfeld verhindern

28 Jan 2021, 07:18

Moin,
jo, Leerzeichen am Anfang sind wirklich etwas sinnfrei. Habe die Änderung mit aufgenommen und mir jetzt auch mal eine Unicode Zeichentabelle besorgt, damit ich die 0x... Codes generell mal nachvollziehen kann.
Insofern ist dieses Thema wirklich weit mehr als erwartet und äußerst befriedigend gelöst.
Mein Dank an alle, die sich beteiligt haben!

Habe die Prüfung jetzt in mein Tab-Script eingebaut und es läuft super. Sogar besser, als ich es vorher geplant hatte mit der Prüfung jetzt.
Wobei ich das "Problem" mit den Tab-Namen natürlich anfangs gar nicht auf dem Schirm hatte. Aber genau das reizt mich an AHK, man stößt beim "entwickeln" auf Probleme, die man vorher gar nicht hatte :D Und lernt dann durch Eure Hilfe hier immer dazu und zumindest für mich ist das auch eine Art Motivation. Nix ist ja nerviger, als wenn man sich was schickes ausgedacht hat und dann stundenlang vergeblich versucht, einen Bug zu fixen. Wobei das immer mein Ziel ist, erstmal selber versuchen, bevor man hier Fragen stellt, die man sich mit ein wenig Gehirnschmalz selbst beantworten kann. Trotzdem steht man manchmal wie der Ochs vor´m Berg oder sieht den Wald vor lauter Bäumen nicht (ok, ich lege 3 Euro in die Phrasenkasse ...).
Wenn man dann hier so fundierte Hilfe bekommt, ist das immer auch ein Ansporn, weiter zu machen oder sich sogar sich an Dinge zu trauen, die man sonst gar nicht anfangen würde. Außerdem gefällt es mir in diesem Forum echt gut, dass sich die Großen hier nicht zu schade sind, auch Anfängern auf die Sprünge zu helfen und das in einem echt angenehmen "Ton". Da gibt es ganz andere Foren ...

Ich möchte in das Tab-Script auch noch Deine "Watch Folder"-Funktion implementieren und bin gerade dabei, mir diese genauer anzuschauen. Da werde ich bestimmt die Tage auch noch die ein oder andere Frage zu haben. Aber dann mache ich einen neuen Thread auf. Also nicht das Dir Lockdown-langweilig wird oder so :D
Merry Crisis and a happy new fear
just me
Posts: 7747
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zahlen in Editfeld verhindern

28 Jan 2021, 09:28

Na dann, viel Spaß und Erfolg weiterhin!
BoBo
Posts: 4358
Joined: 13 May 2014, 17:15

Re: Zahlen in Editfeld verhindern

28 Jan 2021, 10:53

Ich war ja lange Zeit als Programmierer beschäftigt und habe in dieser Zeit einiges gelernt. Das kann ich heute kaum noch sinnvoll einsetzen. Hier im Forum ist eine der wenigen Gelegenheiten, mein Wissen zu teilen, und ich fühle mich gut damit. ;)
Na, das ruft doch förmlich danach dein Wissen (und ggf. dessen AHK related Neu-Erwerb ;)) in Form von Tutorials zu teilen! :mrgreen:
Bei (d)einer "RegEx-Tagebuch"-Serie (also known as: "Der Tag als ich RegEx lieben lernte”) wäre ich der erste Abonnent ;)

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 5 guests