|
forums.silverfrost.com Welcome to the Silverfrost forums
|
View previous topic :: View next topic |
Author |
Message |
DanRRight
Joined: 10 Mar 2008 Posts: 2863 Location: South Pole, Antarctica
|
Posted: Sat May 08, 2021 10:18 pm Post subject: Off limits %~fl warning |
|
|
Paul,
We discussed this already and I think after some time you have mentioned somewhere last year that similar code like below now shows the warning red dot when code starts or when some other part of program will try to change the value of A to be out of limits (0-1 like in our case).
Code: | real*8 A
A=1.1
i=winio@('%~fl%rf%`fl',0d0, 1d0, A)
end |
Unfortunately, the behavior is still the same: this dot only appears if you manually try to type value larger than 1.
Similar demo showing that if the code will try to change variable A with the value 1.1 no warning is appearing
Code: | real*8 A
common /aaaa/A
integer, external :: Run
A=1.1
i=winio@('%~fl%rf%`fl%ff&',0d0, 1d0, A)
i=winio@('%^bt[Change A]%es', Run)
end
integer function Run()
A=1.1
call window_update@(A)
Run=2
end function
|
The importance of showing warning is because %rf is used not only for manual entering the values but also when the code itself changing this variable i.e. doing opposite - writing - as if it will be used like with %wf if update A with "call window_update@(A)". As i wrote in this case though there is still no warning. %rf/%rd are even more convenient than %wf/%wd by the way. Latter ones i almost never use because it is out of style with %rf/%rd. To use %wf its background has to be changeable, but it is just gray.
We need such dynamically changed warnings ! For example i use warnings like changeable background under the number field, or the font color, or %si! and $si#, or popup windows. Otherwise it is easy to miss something wrong. Unfortunately it is not easy to do (need some efforts in the code) and some of these controls are not dynamically changeable.
For example %si! and %si# signs are very good to warn users but are not dynamically changeable to appear/disappear and not size changeable so i use their smaller visual analog instead, callable as a bitmap fitting into one text line i=winio@(' %bm[exclm_sm] Error!&'), see the example below. Though the size of image now is convenient for inline warnings, the appearance/disappearance is also not dynamically changeable. The %~fl would be great easiest way to get the warnings which do not require any additional efforts besides just adding one single sign of tilde to the code !!! Rozy background in the picture below by the way is also warning sign telling user to pay attention, this one i can dynamically update, but that requires 2-3 orders of magnitude more symbols to add to the code than just one tilde
|
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8011 Location: Salford, UK
|
Posted: Mon May 10, 2021 9:25 am Post subject: |
|
|
Dan
I am not clear about what you are asking for but the following sample may help.
1) In your code there is a missing "common /aaaa/A" in the function Run.
2) Maybe you should be using CONTROL_UPDATE@ rather than WINDOW_UPDATE@ (see cwplus.enh). It depends on what you want.
3) From the sample you can dig out a way to add your own icon that can be shown/hidden under program control. You will need to provide your own 16x16 icon.
Code: | winapp
program main
real*8 A
common /aaaa/A
integer, external :: Run,Switch
integer(7) hctrl
common /bbbb/hctrl
A=1.1
i=winio@('%~fl%rf%`fl&',0d0, 1d0, A)
i=winio@('%ic[error]%lc&', hctrl)
i=winio@('%sc&', Switch)
i=winio@('%ff%^bt[Change A]%es', Run)
end
integer function Run()
include <windows.ins>
real*8 A
common /aaaa/A
integer,external::Switch
A = 1.1
call CONTROL_UPDATE@(A)
i = Switch()
Run = 2
end function
integer function Switch()
include <windows.ins>
logical, save:: show
integer(7) hctrl
integer ishow
common /bbbb/hctrl
logical L
data show/.false./
ishow = SW_HIDE
if(show) ishow = SW_SHOW
L = ShowWindow(hctrl, ishow)
show = .not.show
Switch = 2
end function
resources
error ICON error.ico |
|
|
Back to top |
|
|
DanRRight
Joined: 10 Mar 2008 Posts: 2863 Location: South Pole, Antarctica
|
Posted: Tue May 11, 2021 5:30 am Post subject: |
|
|
Thanks, Paul, i have not got how you have done this trickery, but i will look twenty seventh time again
My code indeed missed common block and also "use clearwin". When i added them and control_update@ which i did not know about i got this
If tilde %~fl will plot this image instead of red cross i still would use it (lazy or often no time to do perfect solutions) but something with red color would be move visible as warning It is very simple to add 1 symbol to the text and is much better than do not have such functionality at all. Lost uncountable amount of days due to missing one small parameter in settings |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8011 Location: Salford, UK
|
Posted: Tue May 11, 2021 8:33 am Post subject: |
|
|
Dan
I added the icon to the code in case the %~fl with CONTROL_UPDATE@ does not work in the way you want.
The following sample may do all that you want. If not then please describe the behaviour that you are looking for.
Code: | winapp
program main
real*8 A
common /aaaa/A
integer, external :: Run
i=winio@('%~fl%rf%`fl&',0d0, 1d0, A)
i=winio@('%ff%^bt[Change A]%es&', Run)
i=winio@('%sc', Run)
end
integer function Run()
include <windows.ins>
real*8 A
common /aaaa/A
A = 1.1
call CONTROL_UPDATE@(A)
Run = 2
end function
|
|
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 709 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Tue May 11, 2021 10:57 am Post subject: |
|
|
I have not used CONTROL_UPDATE@. However, reading this post and the earlier discussion last year, at present:-
CONTROL_UPDATE@ behaves exactly like WINDOW_UPDATE@ but if the variable relates to %rd or %rf then any limits (%il or %fl) are not applied and any out-of-range alert icon (%~il or %~fl) is removed.
Perhaps what is required is:
CONTROL_UPDATE_SHOWERROR@ behaves exactly like WINDOW_UPDATE@ but if the variable relates to %rd or %rf then any limits (%il or %fl) are not applied and any out-of-range alert icon (%~il or %~fl) is not removed.
Ken |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8011 Location: Salford, UK
|
Posted: Tue May 11, 2021 12:06 pm Post subject: |
|
|
Ken
I get more and more confused. We would then have 3 scenarios.
1) The user goes out of range so an error icon appears.
2) The programmer displays an out-of-range value without an error icon.
3) The programmer displays an out-of_range value with an error icon.
Maybe Dan's initial request (some time back) was for (3) and not (2). |
|
Back to top |
|
|
Kenneth_Smith
Joined: 18 May 2012 Posts: 709 Location: Hamilton, Lanarkshire, Scotland.
|
Posted: Tue May 11, 2021 12:48 pm Post subject: |
|
|
Paul,
Apologies for confusing you further, I was hoping to provide some clarity, but I failed.
In the first line of this post/topic Dan writes:
�you have mentioned somewhere last year that similar code like below now shows the warning red dot when code starts or when some other part of program will try to change the value of A to be out of limits�
So it looks like Dan�s initial request was for (3) and not (2).
Hopefully Dan will confirm.
Ken |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8011 Location: Salford, UK
|
Posted: Tue May 11, 2021 1:18 pm Post subject: |
|
|
Ken
On the contrary, my confusion was not with your post. As usual your insight is welcome and valuable. |
|
Back to top |
|
|
DanRRight
Joined: 10 Mar 2008 Posts: 2863 Location: South Pole, Antarctica
|
Posted: Tue May 11, 2021 7:52 pm Post subject: |
|
|
My request with tilde finctionality was simple : to keep all %il/%fl behavior like it was before and just to inform user with warning that there was an attempt to go out of limits not only when user doing that manually but at any other attempts the code made by itself
Again, let's keep all what was done (if manually change variable out of limits - make the red sign flashing) but just add that when the code itself changing variable out of limits to inform user too
It's like you come home and the smart door lock informs you that there was an attempt to robe your house which failed - this is manual way currently implemented. What i ask is that if somebody from the internet tried to unlock your lock remotely - inform me too |
|
Back to top |
|
|
DanRRight
Joined: 10 Mar 2008 Posts: 2863 Location: South Pole, Antarctica
|
Posted: Tue May 11, 2021 9:08 pm Post subject: |
|
|
Paul, your code above is not showing any warning signs |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8011 Location: Salford, UK
|
Posted: Tue May 11, 2021 9:31 pm Post subject: |
|
|
Dan
I might be getting near to understanding what you want. That is, a control with the limits applied but a warning icon appearing when an attempt is made to go beyond the limits. With the basic %fl, the feedback is that the control refuses to implement or corrects the change. You would like to have that but to accentuate the error with a warning flag. Presumably such a flag would have a limited time duration.
I don't know how that would work out in the ClearWin+ code but I will put it on the wish list.
Presumably the other context is when the user has provided the name of a data file and where this data contains values that are then displayed on screen. The data has been read in by the user but not directly by typing. Such values could be corrected to be within limits but marked with a warning icon to show the change.
Again I can put this on the wish list.
In my first sample above I have added elements of code for an icon that can be shown and hidden under program control. It could be made to flash by using a gif image instead of an icon. Perhaps one way forward would be for someone to develop those elements into one or two general purpose Fortran functions based on ClearWin+. |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8011 Location: Salford, UK
|
Posted: Wed May 12, 2021 7:34 am Post subject: |
|
|
Here is my first offering of what you might call ClearWin++ where the user adds their own functionality to standard ClearWin+. It is just a starter. At the moment it is not quite right and could be made more versatile (to allow many similar %rf controls). I have used %si for now.
Code: | module dmod
use mswin
type rf
real(2) lower,upper,val
integer(7) hIcon
end type
type(rf)::x
contains
integer function rfcb()
integer show
logical L
show = SW_HIDE
if(x%val < x%lower)then
x%val = x%lower
show = SW_SHOW
else if(x%val > x%upper)then
x%val = x%upper
show = SW_SHOW
endif
L = ShowWindow(x%hIcon,show)
rfcb = 1
end function
subroutine winrf(x)
type(rf)::x
iw = winio@("%^rf&", x%val, rfcb)
iw = winio@("%si#&")
iw = winio@("%lc&", x%hIcon)
end subroutine
integer function change()
x%val = 1.1d0
change = rfcb()
end function
end module
winapp
program main
use dmod
x = rf(0.0d0,1.0d0,1.1d0,0)
call winrf(x)
iw = winio@("%ff%cn%^bt[Change]&", change)
iw = winio@("%es&")
iw = winio@("%sc", rfcb)
end program
|
|
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8011 Location: Salford, UK
|
Posted: Wed May 12, 2021 10:51 am Post subject: |
|
|
This sample illustrates how to make the above user adaptation available to multiple %rf controls. The extension is not trivial. It comes under the heading "no pain no gain". I will add a couple of 16x16 icons to ClearWin+ for use with or maybe instead of %si.
Code: | module dmod
use mswin
type rf
real(2) val,lower,upper !val must be first to match "LATEST_VARIABLE"
integer(7) hIcon
end type
type(rf),pointer::this
contains
integer function filter(x) !filter the %rf input and show/hide the icon.
type(rf)::x
integer show
logical L
show = SW_HIDE
if(x%val < x%lower)then
x%val = x%lower
show = SW_SHOW
else if(x%val > x%upper)then
x%val = x%upper
show = SW_SHOW
endif
L = ShowWindow(x%hIcon,show)
filter = 1
end function
integer function rfcb()
type(rf),allocatable::x
integer(7) addr
rfcb = 2
if(clearwin_string@("CALLBACK_REASON")=="DATA_ALTERATION")then
addr = clearwin_info@("LATEST_VARIABLE")
allocate(x,absolute_address=addr)
rfcb = filter(x)
endif
end function
subroutine winrf(x)
type(rf)::x
iw = winio@("%^rf&", x%val, rfcb)
iw = winio@("%si#&")
iw = winio@("%lc&", x%hIcon)
end subroutine
integer function reset()
this%val = 1.5d0 !Test by changing to out-of-range value.
reset = filter(this)
end function
end module
winapp
program main
use dmod
type(rf),target::x
this=>x
x = rf(0d0,0d0,1d0,0) !Initialise upper and lower.
call winrf(x) !User extension of %rf.
iw = winio@("%ff%cn%^bt[Reset]&", reset)
iw = winio@("%es&")
iw = winio@("%sc", reset)
end program
|
|
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 8011 Location: Salford, UK
|
Posted: Wed May 12, 2021 2:37 pm Post subject: |
|
|
For the next release of ClearWin+ %si has been extended to provide 16x16 icons. %siX is an error icon, %siI is an information icon, %siQ is a question icon and %siW is a warning icon. |
|
Back to top |
|
|
DanRRight
Joined: 10 Mar 2008 Posts: 2863 Location: South Pole, Antarctica
|
Posted: Wed May 12, 2021 6:18 pm Post subject: |
|
|
Thanks, interesting. We definitely need warning system in Clearwin to be versatile and convenient. Missed that from day 1 for a quarter of century
Question related to this: suppose we will need to make 100 %~fl%rf%`fl controls for 100 different variables.
Code: | i=winio@('Variable 1 %fl%rf%`fl&',A1)
i=winio@('Variable 2 %fl%rf%`fl&',A2)
................. |
That will be total approximately 100 lines of user code.
Now using your examples above, which are about 50 lines long, do we need to write 100*50 = 5000 lines of code ? Or we need one 50 lines setup which will be used by each of our 100 variables, so the source code total length will be 50+100=150 lines ? |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|