1. How to make TextBox read only but look normal

Gday to all,

At the moment in my program, when a record is in display mode I set the TextBox's to setEnabled(TXTBox,False) but this makes everything grey & looks yuk.

How might I better display the fields and prevent people from changing the contents. But then enable the fields after clicking the edit button.

Using win32lib of course.

Thanks Tony

new topic     » topic index » view message » categorize

2. Re: How to make TextBox read only but look normal

lockiedownunder said...

At the moment in my program, when a record is in display mode I set the TextBox's to setEnabled(TXTBox,False) but this makes everything grey & looks yuk.

How might I better display the fields and prevent people from changing the contents. But then enable the fields after clicking the edit button.

Firstly, the user interface needs to give the user a visual clue when a field is enabled or not. If you don't like the default disabled colours, you can set the background color for it. With the current win342lib in the sourceforge respository, you can call ...

setDisableBg( TXTBox,  Brown) -- or any other color you like. 

This is the background colour that the text control gets when it is disabled. By default, it is the Windows default backgrond, which is usually grey. If you don't like the foreground color, you can always set that when enabling/disabling it.

procedure enable_textbox(integer id, integer state) 
  if state = False then 
     setTextColor(id, BrightWhite) -- White text when disabled. 
  else 
     setTextCoor(id, Black) -- Black text when enabled. 
  end if 
  setEnable(id, state) 
end procedure 

Then instead of using setEnable(TxtBox, False) use enable_textbox(TxtBox, False)

new topic     » goto parent     » topic index » view message » categorize

3. Re: How to make TextBox read only but look normal

lockiedownunder said...

Gday to all,

At the moment in my program, when a record is in display mode I set the TextBox's to setEnabled(TXTBox,False) but this makes everything grey & looks yuk.

How might I better display the fields and prevent people from changing the contents. But then enable the fields after clicking the edit button.

Using win32lib of course.

Thanks Tony

I thought the following would work, but it doesn't,
maybe someone can fix it or provide a different way that works?

--  code generated by Win32Lib IDE v1.0.4 Build July-06-2008 
 
constant TheProgramType="exw"  
  
include Win32Lib.ew 
without warning 
 
-------------------------------------------------------------------------------- 
--  Window Window1 
constant Window1 = createEx( Window, "Window1", 0, Default, Default, 400, 300, 0, 0 ) 
constant StatusBar5 = createEx( StatusBar, "StatusBar5", Window1, 0, 0, 0, 0, 0, 0 ) 
constant EditText3 = create( EditText, "EditText3", Window1, 16, 56, 140, 20, ES_READONLY ) 
constant PushButton4 = createEx( PushButton, "Enable Edit", Window1, 40, 24, 88, 28, 0, 0 ) 
--------------------------------------------------------- 
-------------------------------------------------------------------------------- 
procedure PushButton4_onClick (integer self, integer event, sequence params)--params is () 
  sequence lflags1, lflags2 
 
    lflags1 = getStyleFlags(EditText3) 
        removeStyle(EditText3,  ES_READONLY    )  -- only important part, rest is debug 
    lflags2 = getStyleFlags(EditText3) 
 
    setText(StatusBar5, sprint(lflags1) & "   " & sprint(lflags2) ) 
end procedure 
setHandler( PushButton4, w32HClick, routine_id("PushButton4_onClick")) 
--------------------------------------------------------- 
 
 
WinMain( Window1,Normal ) 
 
new topic     » goto parent     » topic index » view message » categorize

4. Re: How to make TextBox read only but look normal

If you use setEnable(), then you have to adjust the background color afterwards...

setWindowBackColor( ctrl, getSysColor(COLOR_WINDOW) )

You could wrap it into one whole function...

global procedure setEnable2( integer edit, integer state )
 
    setEnable( edit, state ) 
    setWindowBackColor( edit, getSysColor(COLOR_WINDOW) ) 
 
end procedure 

-Greg

new topic     » goto parent     » topic index » view message » categorize

5. Re: How to make TextBox read only but look normal

wouldn't removeStyle be a more "direct" approach? (if it worked!)
since the idea is to make the edit control either be editable or not, making it "readonly" or not readonly would seem to be reasonable, if it worked, though it didn't in my test.

dan

new topic     » goto parent     » topic index » view message » categorize

6. Re: How to make TextBox read only but look normal

I think the easiest way is to put in handlers for the text box for w32HkeyDown and w32HkeyPress, and in both cases call returnValue(w32True) to tell Win32Lib not to pass on keypresses, whether control keys or printable keys, onto the text box itself. I don't have the time to test this but IMHO it should work OK.

Andy

new topic     » goto parent     » topic index » view message » categorize

7. Re: How to make TextBox read only but look normal

AndyDrummond said...

I think the easiest way is to put in handlers for the text box for w32HkeyDown and w32HkeyPress, and in both cases call returnValue(w32True) to tell Win32Lib not to pass on keypresses, whether control keys or printable keys, onto the text box itself. I don't have the time to test this but IMHO it should work OK.

Andy

but in this method, couldn't app user still PASTE into the text box?

dan

new topic     » goto parent     » topic index » view message » categorize

8. Re: How to make TextBox read only but look normal

Dan_M said...

but in this method, couldn't app user still PASTE into the text box?

dan

You're probably right. I wasn't thinking that way. I'm not sure how you could intercept this process; maybe w32HChange would be a better one. I'm not sure if it would be called prior to the change being executed. I suppose I shall have to try it myself now! Back later if I have any answers...

Andy

new topic     » goto parent     » topic index » view message » categorize

9. Re: How to make TextBox read only but look normal

Yes, that is OK, Dan. I have an edit box with text in and I can't change it any way I can think of. Maybe the w32HChange is the only control necessary to intercept. but with those three doing a returnValue(w32True) it was just as you ask...

Andy

new topic     » goto parent     » topic index » view message » categorize

10. Re: How to make TextBox read only but look normal

AndyDrummond said...
Dan_M said...

but in this method, couldn't app user still PASTE into the text box?

dan

You're probably right. I wasn't thinking that way. I'm not sure how you could intercept this process; maybe w32HChange would be a better one. I'm not sure if it would be called prior to the change being executed. I suppose I shall have to try it myself now! Back later if I have any answers...

Andy

That's why I thought it would be best to just initially make the edit text a "read only", and then use "removeStyle(EditId,ES_READONLY) to allow editing. Only problem (!) is that it doesn't seem to work, though I can't see why not.

dan

new topic     » goto parent     » topic index » view message » categorize

11. Re: How to make TextBox read only but look normal

Dan_M said...

That's why I thought it would be best to just initially make the edit text a "read only", and then use "removeStyle(EditId,ES_READONLY) to allow editing. Only problem (!) is that it doesn't seem to work, though I can't see why not.

dan

Yes, I can see that looks OK. Also I find that right-button and Paste still tramples on the text. I'll play some more but I can't see why it should. This task should be easier that it seems to be!

Andy

new topic     » goto parent     » topic index » view message » categorize

12. Re: How to make TextBox read only but look normal

OK, this works. If you have a flag - I called it ROflag - which is True to make the control RO, and false to allow RW. You intercept the w32HEvent flag, and you test ROflag. If true do a returnValue(). This stops everything. But that includes painting. So you would need to leave ROflag false until the control is painted, setting it again afterwards to make the control inviolate.

You would probably be best to save the flag value in the main window onPaint handler, clearing it to allow the text to be painted, and restoring it after to the RO or RW state.

Does this make sense? It isn't terribly hygienic but it works. You can't do ANYTHING to the text box if the w32HEvent returnValue()'s.

Now we wait for Derek to tell us how it SHOULD be done...

Andy

new topic     » goto parent     » topic index » view message » categorize

13. Re: How to make TextBox read only but look normal

AndyDrummond said...

OK, this works. If you have a flag - I called it ROflag - which is True to make the control RO, and false to allow RW. You intercept the w32HEvent flag, and you test ROflag. If true do a returnValue(). This stops everything. But that includes painting. So you would need to leave ROflag false until the control is painted, setting it again afterwards to make the control inviolate.

You would probably be best to save the flag value in the main window onPaint handler, clearing it to allow the text to be painted, and restoring it after to the RO or RW state.

Does this make sense? It isn't terribly hygienic but it works. You can't do ANYTHING to the text box if the w32HEvent returnValue()'s.

Now we wait for Derek to tell us how it SHOULD be done...

Andy

. smile Does seem rather..Rube Goldberg!

Derek (and Greg) did earlier suggest to Tony to make the disabled edit more "presentable", by altering the background color of the disabled edit, which probably works just fine, I just thought that making the edit readonly and then altering that style as needed was a more elegant(?) approach, but then it didn't work, & I don't see why not.

Your way, though I guess it works, seems more like using an Elephant gun to shoot a mouse smile

Dan

new topic     » goto parent     » topic index » view message » categorize

14. Re: How to make TextBox read only but look normal

Dan_M said...

Your way, though I guess it works, seems more like using an Elephant gun to shoot a mouse smile

Dan

True enough. I have a general principle. If I can't do it the "proper" way, I do it another way till I CAN do it. Mind you, quite often the "proper" way is more long-winded and cumbersome than the elephant gun approach!

I'll look forward to seeing if we do find this "proper" way, though .... and seeing if it IS easier!

Andy :)

new topic     » goto parent     » topic index » view message » categorize

15. Re: How to make TextBox read only but look normal

AndyDrummond said...
Dan_M said...

Your way, though I guess it works, seems more like using an Elephant gun to shoot a mouse smile

Dan

<snip>

I'll look forward to seeing if we do find this "proper" way, though .... and seeing if it IS easier!

Andy :)

Hi, Try this code.

integer set, ok 
set = 0 
procedure PushButton4_onClick (integer self, integer event, sequence params) 
-- http://msdn.microsoft.com/en-us/library/bb761655%28VS.85%29.aspx 
    ok = sendMessage(EditText3, EM_SETREADONLY, set, 0) 
    set = not set 
end procedure 
setHandler( PushButton4, w32HClick, routine_id("PushButton4_onClick")) 
 
new topic     » goto parent     » topic index » view message » categorize

16. Re: How to make TextBox read only but look normal

Dan_M said...
AndyDrummond said...

OK, this works. If you have a flag - I called it ROflag - which is True to make the control RO, and false to allow RW. You intercept the w32HEvent flag, and you test ROflag. If true do a returnValue(). This stops everything. But that includes painting. So you would need to leave ROflag false until the control is painted, setting it again afterwards to make the control inviolate.

You would probably be best to save the flag value in the main window onPaint handler, clearing it to allow the text to be painted, and restoring it after to the RO or RW state.

Does this make sense? It isn't terribly hygienic but it works. You can't do ANYTHING to the text box if the w32HEvent returnValue()'s.

Now we wait for Derek to tell us how it SHOULD be done...

Andy

. smile Does seem rather..Rube Goldberg!

Derek (and Greg) did earlier suggest to Tony to make the disabled edit more "presentable", by altering the background color of the disabled edit, which probably works just fine, I just thought that making the edit readonly and then altering that style as needed was a more elegant(?) approach, but then it didn't work, & I don't see why not.

Your way, though I guess it works, seems more like using an Elephant gun to shoot a mouse smile

Dan

I don't get it ... I already did say how it is to be done.

The user must have a visual clue that the field is not editable. You cannot just stop accepting events in the field because the user will not know that the program has changed state. You really have to show the user that the field is a no-go area. This GUI 101.

The simpliest way is to use setEnable(..., 0) and have the background colour change from the normal input scheme. That is why I suggest that during the program's form creation step, it should call setDisableBg() to set which colour to show when it's been disabled. That is all that has to be done! No fancy footwork or behind ther scenes redirecting of events.

There are many ways you can give visual hints that the field is disabled, but this is by far the easiest. I also suggested that one can change the colour of the text itself, but you could change the font/border/whatever..., but you have to do something.

Any field that looks like an input field should be editable. If it's not editable then it should not look like an input field.

new topic     » goto parent     » topic index » view message » categorize

17. Re: How to make TextBox read only but look normal

DerekParnell said...

The user must have a visual clue that the field is not editable. You cannot just stop accepting events in the field because the user will not know that the program has changed state. You really have to show the user that the field is a no-go area. This GUI 101.

The simpliest way is to use setEnable(..., 0) and have the background colour change from the normal input scheme. That is why I suggest that during the program's form creation step, it should call setDisableBg() to set which colour to show when it's been disabled. That is all that has to be done! No fancy footwork or behind ther scenes redirecting of events.

There are many ways you can give visual hints that the field is disabled, but this is by far the easiest. I also suggested that one can change the colour of the text itself, but you could change the font/border/whatever..., but you have to do something.

Any field that looks like an input field should be editable. If it's not editable then it should not look like an input field.

Derek: Couldn't they just setup a tooltip that would warn the user
when the users mouse hovers over the text box ?

new topic     » goto parent     » topic index » view message » categorize

18. Re: How to make TextBox read only but look normal

bernie said...
DerekParnell said...

The user must have a visual clue that the field is not editable. You cannot just stop accepting events in the field because the user will not know that the program has changed state. You really have to show the user that the field is a no-go area. This GUI 101.

The simpliest way is to use setEnable(..., 0) and have the background colour change from the normal input scheme. That is why I suggest that during the program's form creation step, it should call setDisableBg() to set which colour to show when it's been disabled. That is all that has to be done! No fancy footwork or behind ther scenes redirecting of events.

There are many ways you can give visual hints that the field is disabled, but this is by far the easiest. I also suggested that one can change the colour of the text itself, but you could change the font/border/whatever..., but you have to do something.

Any field that looks like an input field should be editable. If it's not editable then it should not look like an input field.

Derek: Couldn't they just setup a tooltip that would warn the user
when the users mouse hovers over the text box ?

A good application does not rely on using a mouse. The user could attempt to use the TAB key to get to the field. If the cursor gets there and they can't type anything, then that is bad. If they can't TAB there but the field looks like an input field, then that is also bad.

No, there must be a visual clue that one can see just by looking at the form.

Can I recommend a book called "About Face" by Alan Cooper.

new topic     » goto parent     » topic index » view message » categorize

19. Re: How to make TextBox read only but look normal

This reply is not concerned with the colours of an EditText box but only with the differences between the two principle methods suggested for setting READONLY.

Disabling the box using setEnable will result in a box which will not receive focus. It is not then possible to read from the box, so it cannot really be described as "Read Only".

sendMessage(EditText3,EM_SETREADONLY,True,0)
as suggested by Thomas results in a box which cannot be altered but which can receive focus. It is possible to select a section of input and read from it, but not to delete any of it or alter it.

The question is: Which behaviour do you want?
As for colours; they may be altered if required, I don't care.

new topic     » goto parent     » topic index » view message » categorize

20. Re: How to make TextBox read only but look normal

DerekParnell said...
Dan_M said...
AndyDrummond said...

OK, this works. If you have a flag - I called it ROflag - which is True to make the control RO, and false to allow RW. You intercept the w32HEvent flag, and you test ROflag. If true do a returnValue(). This stops everything. But that includes painting. So you would need to leave ROflag false until the control is painted, setting it again afterwards to make the control inviolate.

You would probably be best to save the flag value in the main window onPaint handler, clearing it to allow the text to be painted, and restoring it after to the RO or RW state.

Does this make sense? It isn't terribly hygienic but it works. You can't do ANYTHING to the text box if the w32HEvent returnValue()'s.

Now we wait for Derek to tell us how it SHOULD be done...

Andy

. smile Does seem rather..Rube Goldberg!

Derek (and Greg) did earlier suggest to Tony to make the disabled edit more "presentable", by altering the background color of the disabled edit, which probably works just fine, I just thought that making the edit readonly and then altering that style as needed was a more elegant(?) approach, but then it didn't work, & I don't see why not.

Your way, though I guess it works, seems more like using an Elephant gun to shoot a mouse smile

Dan

I don't get it ... I already did say how it is to be done.

The user must have a visual clue that the field is not editable. You cannot just stop accepting events in the field because the user will not know that the program has changed state. You really have to show the user that the field is a no-go area. This GUI 101.

The simpliest way is to use setEnable(..., 0) and have the background colour change from the normal input scheme. That is why I suggest that during the program's form creation step, it should call setDisableBg() to set which colour to show when it's been disabled. That is all that has to be done! No fancy footwork or behind ther scenes redirecting of events.

There are many ways you can give visual hints that the field is disabled, but this is by far the easiest. I also suggested that one can change the colour of the text itself, but you could change the font/border/whatever..., but you have to do something.

Any field that looks like an input field should be editable. If it's not editable then it should not look like an input field.

Derek,

I did, above, mention that you and Greg had suggested a way to make edit box either editable or not, though I didn't go into any detail, since you already did. Maybe you thought you were responding to Andy's post, rather than my response to his post?

In any event, I continued to post regarding the matter because the method I thought to suggest, namely altering the STYLE of the edit box between read only and editable, with removeStyle( id, style ), DIDN'T ACTUALLY WORK, and I couldn't see why not.

So, the code stub demoing its not working is posted in a previous post in this thread, and I'm wondering if I somehow used the procedure wrong, or if there's a bug in it.

Dan

new topic     » goto parent     » topic index » view message » categorize

21. Re: How to make TextBox read only but look normal

Quoting just a little of Dan's last message:

"In any event, I continued to post regarding the matter because the method I thought to suggest, namely altering the STYLE of the edit box between read only and editable, with removeStyle( id, style ), DIDN'T ACTUALLY WORK, and I couldn't see why not." ... Dan

I have also tried removeStyle and found that it doesn't work. However, several posts ago, Thomas indicated how the style could be removed. I have tried this and it DOES WORK. I repeat:

w32VOID = sendMessage(Ebox,EM_SETREADONLY,True,0)

When the Edit box is READONLY, it can receive focus and a portion may be selected even though the contents cannot be changed.

If you prefer it to be genuinely disabled and unable to receive focus, have you tried putting it in a Group control and disabling the Group control instead of the Edit box?

new topic     » goto parent     » topic index » view message » categorize

22. Re: How to make TextBox read only but look normal

ArthurCrump said...

Quoting just a little of Dan's last message:

"In any event, I continued to post regarding the matter because the method I thought to suggest, namely altering the STYLE of the edit box between read only and editable, with removeStyle( id, style ), DIDN'T ACTUALLY WORK, and I couldn't see why not." ... Dan

I have also tried removeStyle and found that it doesn't work. However, several posts ago, Thomas indicated how the style could be removed. I have tried this and it DOES WORK. I repeat:

w32VOID = sendMessage(Ebox,EM_SETREADONLY,True,0)

When the Edit box is READONLY, it can receive focus and a portion may be selected even though the contents cannot be changed.

If you prefer it to be genuinely disabled and unable to receive focus, have you tried putting it in a Group control and disabling the Group control instead of the Edit box?

Thanks Arthur! Sorry I didn't notice Thomas' post showing how to remove the readonly style.

I think it's also possible to set readonly per your suggestion, AND make unable to receive focus, for tabbing only to fields which are supposed to be editable, by making an event for the readonly edit box, onGotFocus, & reseting focus to the NEXT appropriate field?

Dan

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu