If I understood Haim correctly he was looking for a control like this.
REM Masked EditBox
REM by Guilect
' define a window variable
DEF w1 as WINDOW
' Editbox Constants
Const EM_SETPASSWORDCHAR = 0xCC
Const ES_PASSWORD = 0x20
Const ES_CENTER = 0x1
Const WS_BORDER = 0x800000
Const WS_CHILD = 0x40000000
Const WS_VISIBLE = 0x10000000
' open the window
OPENWINDOW w1,0,0,450,250,@MINBOX|@MAXBOX|@SIZE,NULL,"Simple Password Example - Type in the Editbox",&main
' create and editbox and set its style to password(masked)
CONTROL w1,@EDIT,"",56,100,80,20,WS_VISIBLE | WS_CHILD | WS_BORDER | ES_PASSWORD | ES_CENTER, 1
SETFOCUS w1, 1
' set its control event
OnControl w1,1,@ENCHANGE,&DoEditChanged
' when w1 = 0 the window has been closed
WAITUNTIL w1 = 0
END
' every time there is a message for our window
' the operating system will GOSUB here
SUB main
IF @MESSAGE = @IDCLOSEWINDOW
REM closes the window and sets w1 = 0
CLOSEWINDOW w1
ENDIF
RETURN
ENDSUB
SUB DoEditChanged(),INT
Move w1, 0,0
print w1," "
Move w1, 0,0
print w1,GetControlText(w1,1),
Return 0
ENDSUB
Actually no, and you can set the password style (ES_PASSWORD) of an edit control to do what your showing automatically. And you can also set the character the edit control uses instead of the typed password with EM_SETPASSWORDCHAR
What haim is asking for is a custom control where the user can supply a mask to restrict character input to conform to the mask itself. Such as a date entry where you would supply a mask of "##/##/##" and the edit control with automatically jump to the next field upon proper entry. More complex would be to provide a range for each field of the mask.
Which requires subclassing the control, and redefining the default behavior of the window process of the control.
They don't usually ask me to create something that's easy to do Guilect, and your reply should have gone in the thread where it was asked.
Thanks,
Paul.
Paul took his nasty pills today :(
Guilect was just trying to help.
I don't see anything that appears "nasty" ;)
Larry
Not nasty at all lol. Just factual, haim might not be looking here so it's polite to post the reply in the thread where the question was asked. Or at least ask to clarify.
Jeex, I am not always in a bad mood Brice, just 47.593% of the time ;)
QuoteThey don't usually ask me to create something that's easy to do Guilect, and your reply should have gone in the thread where it was asked.
^ That is the line I was referring to ^
A case of something not being taken the way it was intended ;)
I know Guilect from outside this community. Was just sticking up for him the same way I stick up for Paul on other forums, even when it leads to me being banned.
Don't really see how you could take that the wrong way, but whatever ::)
Later,
Paul.
Thanks to all for your responses.
The conrol i referred to is, as Paul understood, a general purpose masked edit control, to allow for input of dates, telephone numbers and various other formatted input strings.
I think that additional control would be welcome by the users and make the languages even more attractive.
Haim
Sorry,
I just figured that code for an Emergence Basic GUI control would go in the Emergence Basic GUI section of the forum.
It is good for this code to be properly categorized here for others to see it, even when they are not logged in, and to be able to find it again in the future.
I did not ask for any further explaination of the control at the time because I believed that this was what was being looked for.
I see now I was mistaken and apologize.
The control that Paul describes would indeed be very useful.
Here's some code I saved way back when (Paul's?).
' Subclass the edit control an process @IDCHAR messages yourself, only allowing the ones allowed to be passed on to the default handler...
' This should get you started
' Edit Box check entry
DEF txt as string
DIALOG d1
CREATEDIALOG d1,0,0,280,150,@CAPTION|@SYSMENU|@BORDER,0,"Type in Amount $",&diaghandler
CONTROL d1,@STATIC,"Amount $",44,30,70,20,0x5000010B,2
CONTROL d1,@EDIT,"",100,26,97,20,0x50800000,3
CONTROL d1,@BUTTON,"Accept",91,75,70,20,0x50000000,4
DOMODAL d1
END
SUB diaghandler
SELECT @MESSAGE
CASE @IDINITDIALOG
CENTERWINDOW d1
SubclassNumEdit(d1,3)
CASE @IDCONTROL
SELECT @CONTROLID
CASE 3
IF @NOTIFYCODE = @ENCHANGE
' check if the char entered in 3 is a number or a full stop
' otherwise drop the entry
txt = getcontroltext(d1,3)
' examine each char in txt for a digit or a '.'
ENDIF
CASE 4
UnSubclassNumEdit(d1,3)
CLOSEDIALOG d1,@IDOK
ENDSELECT
CASE @IDCLOSEWINDOW
UnSubclassNumEdit(d1,3)
CLOSEDIALOG d1,@IDOK
ENDSELECT
RETURN
ENDSUB
DECLARE IMPORT,CallWindowProcA(lpPrevWndFunc:int,hWnd:int,Msg:int,wParam:int,lParam:int),int
DECLARE IMPORT,SetWindowLongA(hWnd:int,nIndex:int,dwNewLong:int),int
DECLARE IMPORT,SetPropA(hwnd as UINT,lpString as STRING,hData as UINT),INT
DECLARE IMPORT,GetPropA(hwnd as UINT,lpString as STRING),UINT
DECLARE IMPORT,RemovePropA(hwnd as UINT,lpString as STRING),UINT
CONST GWL_WNDPROC=-4
SUB SubclassNumEdit(parent as WINDOW,id as INT)
hEdit = GETCONTROLHANDLE(parent,id)
lpfn = SetWindowLongA(hEdit,-4,&numEditHandler)
'save the old handler as a property in the edit control
'this way we don't need any global variables
SetPropA(hEdit,"edit_handler",lpfn)
RETURN
ENDSUB
SUB UnSubclassNumEdit(parent as WINDOW,id as INT)
'restore the old handler and remove the property
hEdit = GETCONTROLHANDLE(parent,id)
SetWindowLongA(hEdit,-4,GetPropA(hEdit,"edit_handler"))
RemovePropA(hEdit,"edit_handler")
RETURN
ENDSUB
SUB numEditHandler(hwnd:int,uMsg:int,wParam:int,lParam:pointer),int
SELECT uMsg
CASE @IDCHAR
IF ((wParam < 0x30) OR (wParam > 0x39)) AND (wParam <> ASC(".")) AND (wParam <> 0x08) THEN RETURN 1
ENDSELECT
RETURN CallWindowProcA(GetPropA(hwnd,"edit_handler"),hwnd,uMsg,wParam,lParam)
ENDSUB
Close Mike, but only a very small portion of a masked edit control. That is just an example of how to subclass a control and restrict characters entered.
For an example of about 1/3 of what is needed see the example program CFilterEdit.eba that comes with Emergence BASIC. Which will be my starting point for the masked edit.
Paul.