|
Post by regoroxford on Mar 9, 2023 17:38:08 GMT -5
Ths runs on lbx32-353 on the RPi 4B. If the mouse is on the square with the clock, it runs otherwise no. sorta like lazy employee. Is there a way to make it "stick" in order that you can do other things with the mouse?
UpperLeftX=250:UpperLeftY=50 'X & Y dist from upper left of MAIN screen WindowWidth = 200 : WindowHeight = 100 'X & Y dist added to the upper numbers to define win print #2 x2=1040 y2=330 options$(0) = " " options$(1) = str$(time$("secoonds")) options$(2) = " " BackgrounColor$ ="green":ForegroundColor$ ="blue" 'must preceed listbox! ListboxColor$ = "cyan" 'must preceed listbox! listbox #2.listOptions, options$(), [selectionMade],10,30,175,55 open "Select line style" for window as #2 #2 "trapclose [quit]" #2.listOptions font("times_new_roman", 12) 'must come after open #2.listOptions "singleclickselect" [selectionMade] #2.listOptions "selection? selection$" if selection$ = "DASHED" then dashed$ = "Y" 'dashed$ last until figure$ stored as "linedashed" if selection$ = "And then left click one or both ends of the line" then close #2 : goto [dashedline] if selection$ = "SOLID" then dashed$ = "N" print dashed$ [top] timer 2000, [tick] wait [tick] options$(1) = str$(time$("secoonds")) #2.listOptions "reload" goto [top] [quit] close #2 end
|
|
|
Post by Chris Iverson on Mar 9, 2023 19:02:18 GMT -5
I think this is an artifact of the windowing toolkit used by LB5. It doesn't visually update the list unless the window containing the list has focus, or the mouse moves over it(causing it to get repainted). This is consistent in both Windows and Linux.
The timer IS running. You can confirm this by adding a 'print "tick"' statement just after you issue the reload to the list. You'll see the main window constantly gets new ticks, but the list doesn't update unless the list window is in focus.
|
|
|
Post by regoroxford on Mar 9, 2023 20:39:05 GMT -5
Chris, I copied the code to LB 4.5 and with three modifications it ran without mouse oversight. I moved your original code to LB5 on the Pi and it ran only with mouse in listbox. The listbox disappears if screen is clicked. Listbox will not "stick" in the manner that "flush" functions in graphics.
|
|
|
Post by Chris Iverson on Mar 9, 2023 23:52:12 GMT -5
Because it's a different windowing toolkit under the hood.
This is one of the things that depends on low-level details that most people don't need to concern themselves with, but makes a big difference if you start doing unusual stuff, like constantly updating a listbox.
LB4 doesn't use a windowing toolkit. All of the controls it uses are natively provided and managed by Windows1. It's behavior is (generally) the default behavior Windows itself provides.
This CAN'T be the case for LB5, because, for obvious reasons, you can't use Windows Win32 controls on other systems. And the same is true of controls provided by the GUIs of other OS's. You can't use them on Windows.2 So for LB5 to work, and to work on ALL OSes, it has to do ALL of it's own window work. That's why all of the controls look slightly different to what you'd get with native controls: they're not native. They're completely handled by the toolset used to make LB5. And if you're redesigning an entire GUI system from scratch, you might make some changes to how some things behave in edge cases, intentional or not.
And the person making the GUI framework might have had different ideas in mind for how different controls are used. For example, they may have assumed that a listbox's contents only really visually matter if the user is directly interacting with the window that contains the listbox, since they have to interact with it for the listbox to be useful. So they make it so that the listbox doesn't bother redrawing itself if the user isn't paying direct attention to it.
After all, a listbox is intended to be used to present a choice to the user to select. It's not like someone's going to be updating a listbox's contents every other second, right?
And then someone comes along and does exactly that, and we get another edge case where two different GUI systems behave differently.
There's not really any way to change this behavior, as it's written into the underlying windowing toolkit. If you use a different control, intended for rapidly displaying and changing data, like a TEXTBOX or a STATICTEXT, it seems to work fine. The control updates whether or not the window has focus.
1 Well, strictly speaking, this isn't completely true. There are specific controls, like the texteditor, that are custom widgets provided by the toolset used to write LB4. But those cases aren't relevant to what's being discussed here.
2 Again, this isn't (strictly speaking) true if you're coming from Linux, because many of the windowing systems used in Linux(GTK, Qt, etc.) have Windows versions. The point is you have to go out of your way to use it on a different system, it's not what's built in.
|
|
|
Post by Rod on Mar 10, 2023 7:28:24 GMT -5
You have a couple of issues. First of is misspelling secoonds. Also I dont think you realise that the timer repeats. You dont need to set it each time but you do need to switch it off if you are finished with it particularly at [quit] So timer 0 needed. A simple setfocus seems to get it to do what you want but I am not sure it is the fix you need. Setfocus may interfere with other program flow when the program gets bigger. Listboxes usually display static text and change occasionally or with user interaction. So you are doing something unusual. But you are learning and having fun!
UpperLeftX=250:UpperLeftY=50 'X & Y dist from upper left of MAIN screen WindowWidth = 200 : WindowHeight = 100 'X & Y dist added to the upper numbers to define win print #2 x2=1040 y2=330 options$(0) = " 1 " options$(1) = str$(time$("seconds")) options$(2) = " 2 " BackgrounColor$ ="green":ForegroundColor$ ="blue" 'must preceed listbox! ListboxColor$ = "cyan" 'must preceed listbox! listbox #2.listOptions, options$(), [selectionMade],10,30,175,55 open "Select line style" for window as #2 #2 "trapclose [quit]" #2.listOptions font("times_new_roman", 12) 'must come after open #2.listOptions "singleclickselect" [selectionMade] #2.listOptions "selection? selection$" if selection$ = "DASHED" then dashed$ = "Y" 'dashed$ last until figure$ stored as "linedashed" if selection$ = "And then left click one or both ends of the line" then close #2 : goto [dashedline] if selection$ = "SOLID" then dashed$ = "N" print dashed$ [top] timer 200, [tick] wait [tick] options$(1) = str$(time$("seconds")) #2.listOptions "reload" #2.listOptions "setfocus" goto [top] [quit] timer 0 close #2 end
|
|
|
Post by regoroxford on Mar 10, 2023 10:09:55 GMT -5
Setfocus in right place & spelling seconds correctly made it show seconds vs HH:MM:SECS without mouse being in the count window. Going to move this operation to textbox . Thanks
|
|
|
Post by regoroxford on Mar 10, 2023 21:44:12 GMT -5
This code runs on LB4.5 on WIN 10. I was trying to setup timing loop much like I used to collect data from 4 gas chromatograph detectors simultaneously each second and log to file for automatic graphing and integration back in 1993 to 2001. The only thing I cheated on was a call to read data from the A to D converters on the Omega boards in the Radio Shack computers. Had 10 of those computers using QB45. I could not make such calls then or now. To make this run, you need to provide a text file for pgm to open and simulate reading A to D converters. Lastly, the big question is how to keep the text window open when mouse is clicked anywhere on screen? I can't make graphics screen scroll when it gets full. Neither window, text, or textbox will stay on screen. I'm missing something. The details escape me now but I also used batch files to download completed data files with the system running.
My Timer.bas 3/10/2023
nomainwin
WindowWidth= 1600 :WindowHeight = 600
open "big screen" for graphics as #1
'textbox #3.txt, 10, 10, 60, 25 'small print area in textbox
'button #3, "OK", [titleGraph], LR, 5, 0
WindowWidth = 200 : WindowHeight = 150 'big text box frame
open "My Timer" for text as #3 'will not stay on screen if mouse is clicked!!
#3 "trapclose [quit3]"
start = time$("seconds")
#1 "down;color black;line 20 20 500 500;place 400 50"
#1 "trapclose [quit]"
#1 "font arial, 20"
#1 "\10 second intervals"
timer 1000, [tick]
wait 'anything between timer and wait is ignored
[tick]
#3 "!cls"
t=time$("seconds")
#3 t
gosub [readdata]'any task between print and wait adds to overhead in time; otherwise timer is pretty accurate.
wait
[readdata] 'simulate reading 4 A to D converters every second
open "c:\rightclick_project\jobs.txt" for input as #2
line input #2, a$,b$,c$,d$
#1 "\";a$;" ";b$;" ";c$;" ";d$
close #2
if t - start >=10 then print #1, "\";t : start = t
return
[quit]
timer 0
close #1
close #3
end
|
|
|
Post by tsh73 on Mar 11, 2023 6:23:02 GMT -5
Hello regoroxford I can't quite get what are you trying to do - have a look at my fantazy guess Why do you need it separate window, at all? Make it part of your "main" (base, big one) window. See how I show time in separate textbox top right. Is there a reason you print it to graphic window? If you use texteditor it will scroll itself (and then paused, you can copy that text and use it somewhere else - say charting in Excel) If you need you can scroll graphics - manually (grab screen, redraw it one line above, print on freed las line, repeat) (in my example I do nothing then chart gets to end of graphicbox. But I could scroll it like this, or just start it over) Graphics in LB needs command "flush" to stay. Only thing is that you do a lot of flushes your program will take a lot of memory and finally die But that could be helped too (read on graphic segments) ' Form created with the help of Freeform-J v.261006 ' Generated on Mar 11, 2023 at 13:25:55
nomainwin
WindowWidth = 840 WindowHeight = 535
UpperLeftX=int((DisplayWidth-WindowWidth)/2) UpperLeftY=int((DisplayHeight-WindowHeight)/2)
textbox #main.txtTime, 46, 6, 100, 25 statictext #main.statictext2, "time", 14, 11, 30, 15 button #main.start, "Start", [button3Click], UL, 166, 6, 122, 25 button #main.stop, "Stop", [button4Click], UL, 302, 6, 122, 25 statictext #main.statictext5, "add to bottom", 14, 35, 144, 20 statictext #main.statictext6, "add to top", 246, 35, 144, 20 texteditor #main.toTop, 246, 56, 216, 400 texteditor #main.toBottom, 14, 56, 216, 400 graphicbox #main.gr, 478, 55, 336, 405 statictext #main.statictext10, "chart", 478, 35, 144, 20 menu #main, "Edit" '<--- Texteditor Menu can be moved but not removed.
open "logging stuff demo" for window_nf as #main print #main.gr,"down; fill white; flush" print #main, "trapclose [quit.main]"
print #main, "font ms_sans_serif 10"
#main.gr "down; home; posxy cx cy" 'now cx cy is coords of center, 2*cx 2*cy is size #main.gr "size 2" graphX=0
'timer 1000, [tick] timer 250, [tick] timerOn=0 wait
[tick] if timerOn=0 then wait 'if timer is off #main.txtTime time$() 'pretend to get these digits somewhere 'make it change randomly but slowly (up to +/- 5) and fit in (0..100) maxVal=100 a = a+int(rnd(0)*10)-5: if a<0 then a=0: if a>maxVal then a=maxVal b = b+int(rnd(0)*10)-5: if b<0 then b=0: if b>maxVal then b=maxVal c = c+int(rnd(0)*10)-5: if c<0 then c=0: if c>maxVal then c=maxVal d = d+int(rnd(0)*10)-5: if d<0 then d=0: if d>maxVal then d=maxVal
t = (time$("ms")/1000) mod 60
'make a line aStr$=using("##.##",t);"> ";a;" ";b;" ";c;" ";d
'adding it to bottom of the log is simple - just print there #main.toBottom aStr$
'adding to the top is a bit trikier '#main.toTop, ' get text - insert text - write it back 'probably not very good idea to keep BIG amount of text in editor #main.toTop "!contents? txt$" txt$ = aStr$+chr$(10)+txt$ #main.toTop "!contents txt$"
'some graphing graphX=graphX+1 for i = 0 to 3 #main.gr "color "; word$("red green blue cyan", i+1) band = (2*cy)*.9 /4 '90% of space divided in 4 bands y = (2*cy)*.05+(i+1)*band '0.05 is 5% before first band select case i case 0: dy=a case 1: dy=b case 2: dy=c case 3: dy=d end select #main.gr "set ";graphX;" ";y-dy*band/maxVal 'y on screen is inverted hence (-) next #main.gr "flush" 'makes graphic "stick". 'Eventually consume all memory and die/ 'read on "segment" in a help file wait
[button3Click] 'Perform action for the button named 'start' timerOn=1 wait
[button4Click] 'Perform action for the button named 'stop' timerOn=0 wait
[quit.main] Close #main END
|
|
|
Post by regoroxford on Mar 11, 2023 10:27:40 GMT -5
Anatoly I appreciate your detail and response. Thank you. Your code behaves exactly the same as mine did. If you click on the screen area that is not covered by the window created in the code, the window disappears . There are 2 "flush" commands and they have no effect weather in or out. I will be digging into the example.
Edit: this the solution to keeping window ON TOP.
stylebits #w, 0, _WS_BORDER,_WS_EX_TOPMOST,0
open "" for window_popup as #w
|
|
|
Post by Rod on Mar 12, 2023 5:03:19 GMT -5
Yes, you can hold the window on top. But that isn't how windows is supposed to work. When a user changes focus with the mouse the window he clicks on moves top most. Thats a Windows thing. Your thinking about FLUSH a little bit wrong. What it is designed to do is to make graphic drawing stick. If you draw something on a graphicbox or graphic window it will not stay visible if the graphicbox or graphic window gets covered or is slid off screen by the user. It will be wiped clean. However if you use FLUSH, as you see many of us do, then the graphics will be redrawn when the window is uncovered or slid back into view. Thats what we mean by making graphics stick, it is the drawing on the window not the window itself.
|
|