| |
|
|
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" |
|
|
| |
|
|
|
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? |
|
|
| |
|
|
|
H.Brill | Für das SubClassen mal ein Anfang :
$H Messages.ph
Declare Handle Edit1
Declare Int ende, String edittext
Window 400, 200
Edit1 = Create("Edit", %HWnd, "", 10, 10, 80, 20)
ende = 0
UserMessages $10
SubClass Edit1, 1
WhileNot ende
WaitInput
Case %UMessage = $10 : ende = 1
EndWhile
SubClass Edit1, 0
SubClassProc
If SubClassMessage(Edit1, ~wm_KeyUp)
edittext = GetText$(Edit1)
Messagebox(edittext, "", 0)
SetFocus(Edit1)
Set("WinProc", 0)
EndIf
EndProc
End
|
|
|
| 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
|
|
|
| |
|
|
|
Michael W. | Ich war mal so frei...
Beachte das Ausrufezeichen hinter dem CODE-Tag.
Das doppelte If kann ersetzt werden durch
|
|
|
| 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? |
|
|
| |
|
|
|
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. |
|
|
| |
|
|
|
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? |
|
|
| |
|
|
|
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.
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 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 09.12.2018 ▲ |
|
|
|