Deutsch
Forum

Eingabe-Maske

 

rquindt
Hallo

Gibt es eine Möglichkeit, bei der Eingabe eine Vorgabe-Maske zu verwenden?

Ich möchte z.B. bei einer Datumseingabe "12.05.2016" vorgeben.
Bei der Eingabe sollen nur Zahlen erlaubt sein und an den Stellen, an denen der "." ist, soll der Kursor diesen automatisch überspringen.

Eine zweite Version währe "2X". dh. an der ersten Stelle darf nur "0-9" eingegeben werden, an der zweiten nur "A-Z"
 
01.05.2016  
 




H.Brill
Zur Datumseingabe würde ich das DateEdit verwenden.
Da kannst du ein Datum vorgeben.
Siehe Kapitel 20.5 in der Hilfe.

Zur Version 2 :
Da könnte man das Editfeld subclassen und
mit den regulären Ausdrücken arbeiten.
Suchmuster der ersten Stelle : "[0-9]"
Suchmuster der zweiten Stelle : "[A-Z]"
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
01.05.2016  
 




rquindt
Hallo H.Brill

Danke für den Tip mit dem DateEdit.
Ich habe es mal getestet, funktioniert prima.

Gibt es die Möglichkeit, auch ein leeres Datumsfeld zu übergeben ohne
das das aktuelle Datum erscheint? (00.00.0000)

Da ich mich so langsam in XProfan einarbeite (habe vorher in DOS Powerbasic programmiert)
ist mir das mit dem SubClassen noch nicht ganz klar.
Hättest Du da ein Beispiel für mich?
 
01.05.2016  
 




H.Brill
Für das SubClassen mal ein Anfang :
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
01.05.2016  
 




rquindt
Hallo H.Brill

Ich habe Deinen Code mal ein bisschen umgebaut.
Damit kann ich jetzt per SubClassing das Edit-Feld bearbeiten.
Den Code habe ich als Datei abgespeichert.

Ich habe versucht den Code hier einzufügen,
aber dabei geht die Formatierung verloren.
Gibt es eine Anleitung,wie man das umgeht?

Kannst Du Dir meinen Code mal ansehen?
Kann man noch was optimieren?

$H Messages.ph
$H Windows.ph
Def GetSysColor(1) !"USER32","GetSysColor"

cls GetSysColor(15)
UseFont "Arial",15,0,0,0,0
SETDIALOGFONT 1

Declare Handle Edit1, Btn1
Declare Int ende, String edittext, ErlaubteZeichen
Window 400, 200
Edit1 = Create("Edit", %HWnd, "", 10, 50, 80, 20)
SetStyle Edit1, GetStyle(Edit1) | ~ES_UPPERCASE '--- Buchstaben nur als Großbuchstaben ausgeben
@SendMessage(Edit1,$00C5,2,0) '--- Parameter 3 erlaubt Anzahl max. Stellen

btn1 = Create("Button", %HWnd, "Fertig", 10, 80, 60, 25)

ende = 0

UserMessages $10
SetFocus(Edit1)
SubClass Edit1, 1

WhileNot ende

WaitInput
If Clicked(btn1)
edittext = GetText$(Edit1)
Messagebox(edittext, "", 0)
SetFocus(Edit1)
EndIf

Case %UMessage = $10 : ende = 1 '--- Fenster schließen angeclickt

EndWhile

SubClass Edit1, 0

End

SubclassProc

Declare p&, ch$, s$

if &sWnd = Edit1
if %sMessage=258//wm_char
p& = Hiword(sendMessage(Edit1,$B0,0,0))//em_getSel '--- aktuelle Cursor-Position (nur Spalte) imEditfeld
s$ = getText$(Edit1) '--- bisheriger Text in Edit
ch$ = upper$(chr$(&swParam)) '--- letztes eingegebenes Zeichen, Asci-Code, in Großbuchstaben gewandelt

If p& = 1
ErlaubteZeichen = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Else
ErlaubteZeichen = "0123456789"
EndIf

ifnot instr(ch$,ErlaubteZeichen) '--- wenn das letzte gedrückte Zeichen nicht der Liste entspricht
If &swParam = 8 '--- Backspace / löschen
if p&
s$ = Del$(s$,p&,1) '--- Feld an Cursorposition löschen
dec p&,1
endif
EndIf
SetText Edit1,s$ '--- String an Edit-Feld übergeben
sendMessage(Edit1,$B1,p&,p&)//em_setSel '--- neue Cursor-Position festlegen
else
s$ = ins$(ch$,s$,p& + 1) '--- Eingabe an Cursor+1 einfügen
s$=Mid$(s$,1,2) '--- nur die ersten 2 Zeichen übernehmen, wenn Eingabe länger sein sollte durch einfügen
setText Edit1,s$ '--- String an Edit-Feld übergeben
sendMessage(Edit1,$B1,p&+1,p&+1)//em_setSel '--- neue Cursor-Position festlegen
endif
set("winproc",0)
endif
EndIf

EndProc

 
05.05.2016  
 




Michael
W.
Ich war mal so frei...

Beachte das Ausrufezeichen hinter dem CODE-Tag.

Das doppelte If kann ersetzt werden durch
If SubClassMessage(Edit1, 258)//wm_char

 
System: Windows 8/10, XProfan X4
Programmieren, das spannendste Detektivspiel der Welt.
05.05.2016  
 




rquindt
Hallo Michael

Danke für den Tip
Ich habs geändert.

Wie bekommt man denn den Code lesbar ins Forum?
 
05.05.2016  
 




Michael
W.
Über dem Editfeld steht "Beitrag|Schrift|Smilies|ein Pfeil". Bei letzterem wählst Du einfach Quelltext und fügst da Deinen Quellcode ein. Wenn das erste Zeichen direkt hinter der öffnenden Klammer ein "!" ist, dann wird der Code belassen wie er ist.
 
Alle Sprachen
System: Windows 8/10, XProfan X4
Programmieren, das spannendste Detektivspiel der Welt.
05.05.2016  
 




rquindt
Danke für den Tip.
Ich habs gleich mal getestet. Sollte beim nächsten mal keine
Probleme mehr geben.

Kann mann eigentlich mehrere SubClassing Routinen nutzen ( je Editfeld natürlich nur eine) oder kann vom XProfan nur eine verwaltet werden?
 
06.05.2016  
 




Jörg
Sellmeyer
"Es kann nur einen geben!"

Aber der ist vielseitig. Du kannst in deiner SubClassProc ja verschiedene Contols adressieren und die auch noch je nach Message unterschiedlich behandeln.
if &sWnd = Edit1

    if %sMessage=258//wm_char

        SetMenuItem 4000

    elseif %sMessage=xxx//wm_...

        SetMenuItem 4001

    Endif

Elseif &sWnd = Edit2

    if %sMessage=258//wm_char

        SetMenuItem 4001

    Elseif %sMessage=xxx//wm_...

        SetMenuItem 4003

    Endif

EndIf


Kleiner Tipp noch: Die Hilfe hat dazu auch ausführliche Erläuterungen von Roland.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
06.05.2016  
 




p.specht

Hab´ mir´s nach XProfan11 portiert - ich hoffe, das ist OK für Euch:
'SubclassProc zur Festlegung von Eingabemöglichkeiten
'2016-05 von rquint mit wichtigen Beiträgen von H.Brill, Michael W.
'und Jörg Sellmeyer, 2018-12 auf XProfan11 zurückgequält von p.specht
 $H Messages.ph
 $H Windows.ph
Def GetSysColor(1) !"USER32","GetSysColor"
Cls GetSysColor(15)
UseFont "Arial",15,0,0,0,0
SETDIALOGFONT 1
Declare Edit1&, Btn1&
Declare ende&, edittext$, ErlaubteZeichen$
Window 400, 200
Edit1& = Create("Edit", %HWnd, "", 10, 50, 80, 20)
'--- Buchstaben nur als Großbuchstaben ausgeben
SetStyle Edit1&, GetStyle(Edit1&) | ~ES_UPPERCASE
'--- Parameter 3 erlaubt Anzahl max. Stellen:
@SendMessage(Edit1&,$00C5,2,0)
Btn1& = Create("Button",  %HWnd, "Fertig", 10, 80, 60, 25)
ende& = 0
UserMessages $10
SetFocus(Edit1&)
SubClass Edit1&, 1

WhileNot ende&

    WaitInput

    If Clicked(Btn1&)

        edittext$ = GetText$(Edit1&)
        Messagebox(edittext$, "", 0)
        SetFocus(Edit1&)

    EndIf

    Case %UMessage = $10 : ende& = 1
    '--- Fenster schließen angeclickt

EndWhile

Main:
SubClass Edit1&, 0
End

SubclassProc

    Declare p&, ch$, s$
    ' Vorschlag von J. Sellmeyer für Verwendung in mehreren Editcontrol-Feldern:
    'if &sWnd = Edit1&
    '    if %sMessage=258//wm_char
    '        SetMenuItem 4000
    '    elseif %sMessage=xxx//wm_...
    '        SetMenuItem 4001
    '    Endif
    'Elseif &sWnd = Edit2&
    '    if %sMessage=258//wm_char
    '        SetMenuItem 4001
    '    Elseif %sMessage=xxx//wm_...
    '        SetMenuItem 4003
    '    Endif
    'EndIf

    if &sWnd = Edit1&

        if %sMessage=258//wm_char

            '--- aktuelle Cursor-Position (nur Spalte) im Editfeld:
            p& = Hiword(sendMessage(Edit1&,$B0,0,0))//em_getSel
            s$ = getText$(Edit1&)'--- bisheriger Text in Edit
            '--- letztes eingegebenes Zeichen, Asci-Code, in Großbuchstaben gewandelt
            ch$ = upper$(chr$(&swParam))

            If p& = 1

                ErlaubteZeichen$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

            Else

                ErlaubteZeichen$ = "0123456789"

            EndIf

            '--- Wenn das letzte gedrückte Zeichen nicht der Liste entspricht:

            ifnot instr(ch$,ErlaubteZeichen$)

                If &swParam = 8'--- Backspace / löschen

                    if p&

                        s$ = Del$(s$,p&,1)'--- Feld an Cursorposition löschen
                        dec p&,1

                    endif

                EndIf

                SetText Edit1&,s$'--- String an Edit-Feld übergeben
                sendMessage(Edit1&,$B1,p&,p&)//em_setSel '--- neue Cursor-Position

            else

                s$ = ins$(ch$,s$,p& + 1)'--- Eingabe an Cursor+1 einfügen
                '--- nur die ersten 2 Zeichen übernehmen, wenn Eingabe durch einfügen länger sein sollte:
                s$=Mid$(s$,1,2)
                setText Edit1&,s$'--- String an Edit-Feld übergeben
                sendMessage(Edit1&,$B1,p&+1,p&+1)//em_setSel '--- neue Cursor-Position

            endif

            set("winproc",0)

        endif

    EndIf

EndProc

 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
09.12.2018  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

12.941 Betrachtungen

Unbenanntvor 0 min.
Detlef Jagolski17.05.2021
iF31.10.2020
Alibre21.10.2020
rafl29.06.2020
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie