LB Booster
« Grid of Textboxes using Windows API »

Welcome Guest. Please Login or Register.
Apr 1st, 2018, 05:04am



ATTENTION MEMBERS: Conforums will be closing it doors and discontinuing its service on April 15, 2018.
We apologize Conforums does not have any export functions to migrate data.
Ad-Free has been deactivated. Outstanding Ad-Free credits will be reimbursed to respective payment methods.

Thank you Conforums members.
Speed up Liberty BASIC programs by up to ten times!
Compile Liberty BASIC programs to compact, standalone executables!
Overcome many of Liberty BASIC's bugs and limitations!
LB Booster Resources
LB Booster documentation
LB Booster Home Page
LB Booster technical Wiki
Just BASIC forum
BBC BASIC Home Page
Liberty BASIC forum (the original)

« Previous Topic | Next Topic »
Pages: 1 2 3  Notify Send Topic Print
 veryhotthread  Author  Topic: Grid of Textboxes using Windows API  (Read 86 times)
Alincon
Full Member
ImageImageImage


member is offline

Avatar




PM


Posts: 147
xx Re: Grid of Textboxes using Windows API
« Reply #20 on: Aug 19th, 2016, 12:37am »

Please look at this code. (It is a complete program.)
r.m.

Code:
    nomainwin
    WindowWidth = 380 :     WindowHeight = 450 
'putting the two commands in this locations works    
    call tbNumberCG "#cogs.tb", 6,185,40,10,60,25  
    maphandle #dmy, #cogs
    
    statictext #cogs.statictext3, "Starting Inventory", 65,  50, 102,  20
    statictext #cogs.statictext9, "Purchases", 100, 90,  64,  20
    statictext #cogs.statictext12, "Cost of Labor", 80, 130,  99,  20
    statictext #cogs.statictext15, "Materials, Supplies", 40, 170, 123,  20
    statictext #cogs.statictext18, "Other Costs", 90, 210,  90,  20    
    statictext #cogs.statictext21, "Ending Inventory", 65, 250,  120,  20    
    statictext #cogs.statictext8, "C O G S", 105,  290,  99,  20
    statictext #cogs.cogs, "0", 185, 290, 60,  25
    
'putting the two commands in this location, the statictexts do not show up   
   ' call tbNumberCG "#cogs.tb", 6,185,40,10,60,25  
   ' maphandle #dmy, #cogs   
    
    button #cogs.buOkay, " Accept ",[cogsAccept],UL,185,330
    button #cogs.buExit, "  End  ",[cogsEnd],UL,185,370
    Stylebits #cogs.buClear, 0, _WS_TABSTOP, 0, 0
    stylebits #cogs, _DS_CENTER,0,0,0
    open "COST OF GOODS SOLD: " + businessPropName$ for dialog_modal as #cogs
    #cogs, "trapclose [cogsClose]" 
    #cogs, "font ms_sans_serif 10"
    
'putting this command here does not work - the textboxes do not show up    
   ' maphandle #dmy, #cogs     
   
    #cogs.tb01, "!setfocus"
    wait
    
 sub tbNumberCG x$,lmt,j,k,l,m,n      
    for x = 1 to lmt
      var$ = x$ + "0"+right$(str$(x),2)     
      textbox #dmy.tmp, j, (k*x)+l0, m, n     
      stylebits #dmy.tmp, _ES_NUMBER, 0, 0, 0
      maphandle #dmy.tmp, var$
    next x 
    end sub 
    
 [cogsClose]
    close #cogs
    end  
    

 
User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 1348
xx Re: Grid of Textboxes using Windows API
« Reply #21 on: Aug 19th, 2016, 08:57am »

on Aug 19th, 2016, 12:37am, Alincon wrote:
Please look at this code.

You have put the window's MAPHANDLE before the OPEN (I explicitly told you that it must go after the OPEN). If it works it's only 'by accident' and I don't guarantee it will be reliable (LBB was not designed to support that method, and it won't work at all in LB).

I presume the reason you did it that way is that by doing so you save a lot of MAPHANDLE statements. I can see why that would be tempting, but by using undocumented features of the language you risk your code failing in the future.

So obviously it's up to you how you write your own programs but here is the code modified to work the way my example showed and the way LBB was designed to support (it uses more MAPHANDLEs than yours):

Code:
    nomainwin
    WindowWidth = 380 :     WindowHeight = 450 

' it makes no difference whether you call the sub before the other controls:
    call tbNumberCG "#cogs.tb", 6,185,40,10,60,25  
    
    statictext #dmy.statictext3, "Starting Inventory", 65,  50, 102,  20
    statictext #dmy.statictext9, "Purchases", 100, 90,  64,  20
    statictext #dmy.statictext12, "Cost of Labor", 80, 130,  99,  20
    statictext #dmy.statictext15, "Materials, Supplies", 40, 170, 123,  20
    statictext #dmy.statictext18, "Other Costs", 90, 210,  90,  20    
    statictext #dmy.statictext21, "Ending Inventory", 65, 250,  120,  20    
    statictext #dmy.statictext8, "C O G S", 105,  290,  99,  20
    statictext #dmy.cogs, "0", 185, 290, 60,  25

' or whether you call the sub after the other controls:
'    call tbNumberCG "#cogs.tb", 6,185,40,10,60,25  
    
    button #dmy.buOkay, " Accept ",[cogsAccept],UL,185,330
    button #dmy.buExit, "  End  ",[cogsEnd],UL,185,370
    Stylebits #dmy.buClear, 0, _WS_TABSTOP, 0, 0
    stylebits #dmy, _DS_CENTER,0,0,0
    
    open "COST OF GOODS SOLD: " + businessPropName$ for dialog_modal as #dmy
    
' In LBB you need one MAPHANDLE per control:
    maphandle #dmy.statictext3, #cogs.statictext3
    maphandle #dmy.statictext9, #cogs.statictext9
    maphandle #dmy.statictext12, #cogs.statictext12
    maphandle #dmy.statictext15, #cogs.statictext15
    maphandle #dmy.statictext18, #cogs.statictext18
    maphandle #dmy.statictext21, #cogs.statictext21
    maphandle #dmy.statictext8, #cogs.statictext8
    maphandle #dmy.buOkay, #cogs.buOkay
    maphandle #dmy.buExit, #cogs.buExit
    maphandle #dmy.cogs, #cogs.cogs

' The window's MAPHANDLE goes after the OPEN:
    maphandle #dmy, #cogs    
    
    #cogs, "trapclose [cogsClose]" 
    #cogs, "font ms_sans_serif 10"
    
    #cogs.tb01, "!setfocus"
    wait
    
 sub tbNumberCG x$,lmt,j,k,l,m,n      
    for x = 1 to lmt
      var$ = x$ + "0"+right$(str$(x),2)     
      textbox #dmy.tmp, j, (k*x)+l0, m, n     
      stylebits #dmy.tmp, _ES_NUMBER, 0, 0, 0
      maphandle #dmy.tmp, var$
    next x 
    end sub 
    
 [cogsClose]
    close #cogs
    end 

Richard.
User IP Logged

tsh73
Full Member
ImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 210
xx Re: Grid of Textboxes using Windows API
« Reply #22 on: Aug 19th, 2016, 09:25am »

Alincon,
please ask your question.
I have looked your code; so what?

Now how I understand it: (I could be wrong of cource)
problem to be solved:
need to create controls in a loop. This needs some window handle.

Richard's way in Rep#18:
you use #tmp everythere creating all the controls
and it doesn't matter where you create controls in a loop - before or after statictext creted manually
you use maphandle on controls created in a loop
after opening window, you MAPHANDLE it too
Afther you happily use new handle(s).

Now what you've done:
you create controls (in a loop ) for #dmy window,
and MAPHANDLE them to #cogs
then maphandle #dmy, #cogs (without #dmy existing!)
then keep adding controls to #cogs
And it seems working.
Ok, great - it works so use it.

But then it happens that something breaks if your move "maphandle #dmy, #cogs" to different place
- well, noone promised you it will work. Supported approach is in reply #18, use it, and MAPHANDLE window after opening.

Just my 0.02$

EDIT of course ninja'd by Richard ;)

EDIT2
I think if you are not going to change statictext you don't need any of
Code:
maphandle #dmy.statictext3 
« Last Edit: Aug 19th, 2016, 09:30am by tsh73 » User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 1348
xx Re: Grid of Textboxes using Windows API
« Reply #23 on: Aug 19th, 2016, 2:43pm »

on Aug 19th, 2016, 09:25am, tsh73 wrote:
I think if you are not going to change statictext you don't need any of
Code:
maphandle #dmy.statictext3 

Very good point! Indeed (and this is true in LB as well) if you don't need to access the control after the window is created you don't even need to give it an 'extension':

Code:
    statictext #w, "Static, unchanging, text", 10, 10, 200, 25
    open "Test" for window as #w
    wait 

Richard.
User IP Logged

Alincon
Full Member
ImageImageImage


member is offline

Avatar




PM


Posts: 147
xx Re: Grid of Textboxes using Windows API
« Reply #24 on: Aug 19th, 2016, 4:20pm »

I am not trying to break any rules or use undocumented features.
Certainly Richard, as the creator of LBB, knows more about it than I.
tsh73 is also a respected programmer in both LB and LBB.
I do not wish to argue with or upset either one.

Nevertheless, the code I showed earlier works as the included comments state, at least on my machine.

I understood Richard's insistence that the 'window' maphandle instruction should be placed AFTER the open statement.
But, in my code, on my machine, that just does not work.

The only combination that does work on my machine is to place the call to the sub, and the 'windows' maphandle command BEFORE the statictext items, and BEFORE the 'open' statement.

"Your results may differ"

r.m.




User IP Logged

tsh73
Full Member
ImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 210
xx Re: Grid of Textboxes using Windows API
« Reply #25 on: Aug 19th, 2016, 5:57pm »

Alincon,
line by line:
Quote:
I am not trying to break any rules or use undocumented features.

I myself see nothing bad in using undocumented features. If they work, that is.

Quote:
I do not wish to argue with or upset either one.

LOL
This is programmer's forum. People come not to quarrel, but to help. (ideally it is)

Quote:
I understood Richard's insistence that the 'window' maphandle instruction should be placed AFTER the open statement.
But, in my code, on my machine, that just does not work.

You agree that Richard likely "knows more about it"
But following his advice "just does not work."
I see two possible reasons:
1) somewhere you made a mistake in coding. It happens. You might find it. If you post more code, we might help you (or might not).
2) your code is correct but there is an error in LBB. In this case, Richard probably very interested in finding it out wink. But he would needs an example that shows this error - that is, your code.

Now, if you interested in finding things out, post your code that didn't work.

If you found a way around it and don't mind leaving this mystery - use your workaround.
User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 1348
xx Re: Grid of Textboxes using Windows API
« Reply #26 on: Aug 19th, 2016, 6:44pm »

on Aug 19th, 2016, 4:20pm, Alincon wrote:
The only combination that does work on my machine is to place the call to the sub, and the 'windows' maphandle command BEFORE the statictext items, and BEFORE the 'open' statement.

So, are you saying that the code I most recently listed (which follows all my recommendations, including putting the 'maphandle' AFTER the 'open') does not work on your PC? If so in what way doesn't it work? What precisely happens?

Richard.
User IP Logged

Alincon
Full Member
ImageImageImage


member is offline

Avatar




PM


Posts: 147
xx Re: Grid of Textboxes using Windows API
« Reply #27 on: Aug 21st, 2016, 01:35am »

Richard's code works on my machine and produces the same result as my code, which works and is shorter.

My whole reason for using maphandle is to avoid coding a stylebits command for every textbox to limit characters to numbers since LBB cannot do this: (it works in LB)
Code:
    for x = 1 to lmt
        var$ = pfx$+right$("0"+str$(x),2)
        stylebits #var$, _ES_NUMBER, 0, 0, 0
    next
 

I'm thinking now that requiring so many commands to use maphandle is more trouble than coding all the stylebits commands.

regards, r.m.

User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 1348
xx Re: Grid of Textboxes using Windows API
« Reply #28 on: Aug 21st, 2016, 09:28am »

on Aug 21st, 2016, 01:35am, Alincon wrote:
Richard's code works on my machine and produces the same result as my code, which works and is shorter.

Yours may be a little shorter, but it relies on undocumented behavior. It's up to you whether you want to take the risk.

Quote:
LBB cannot do this: (it works in LB)

Hmm, interesting! That's an incompatibility I was unaware of: I didn't know that LB 4 would accept a handle variable in a STYLEBITS statement. I'll try to fix this in a future release of LBB (it could only work if the STYLEBITS comes after the TEXTBOX).

Quote:
I'm thinking now that requiring so many commands to use maphandle is more trouble than coding all the stylebits commands.

I would still expect the LBB solution to be shorter, because you can create the controls in a loop (and put the STYLEBITS in the loop), something that you cannot do in LB:

LB solution (STYLEBITS in a loop) Code:
    textbox #w.tb01, 10,  10, 100, 25
    textbox #w.tb02, 10,  40, 100, 25
    textbox #w.tb03, 10,  70, 100, 25
    textbox #w.tb04, 10, 100, 100, 25
    textbox #w.tb05, 10, 130, 100, 25
    textbox #w.tb06, 10, 160, 100, 25

    for x = 1 to 6
      var$ = "#w.tb0" + right$(str$(x),2)
      stylebits #var$, _ES_NUMBER, 0, 0, 0
    next x

    open "Test" for dialog as #w
    wait 

LBB solution (using MAPHANDLE) Code:
    for x = 1 to 6
      textbox #w.tb, 10, x*30-20, 100, 25    
      stylebits #w.tb, _ES_NUMBER, 0, 0, 0
      var$ = "#w.tb0" + right$(str$(x),2)
      maphandle #w.tb, var$
    next x

    open "Test" for dialog as #w
    wait 

Richard.
User IP Logged

CryptoMan
New Member
Image


member is offline

Avatar




PM

Gender: Male
Posts: 46
xx Re: Grid of Textboxes using Windows API
« Reply #29 on: Aug 21st, 2016, 4:34pm »

Richard,

What I am missing in LB and LBB is using arrays on these and also passing arrays and structs to SUBs and FUNCTIONs and returning ARRAYSs or STRUCTs. And ARRAYS of STRUCTS. And STRUCTS like PASCAL and C.

Is this too difficult to implement in LBB?

Ofcourse, it will not be compatible with LBB but if anybody wants to use a SUPER LB can use it with LBB.

What stops us from

textbox #w.tb[i], 10, x*30-20, 100, 25 ?

I realize that this MAPHANDLE emulates this objective quite elegantly but why not arrays?

Or, like create a syntax like this but hidden in the BBC conversion translate it into MAPHANDLEs behind the scene.

Maybe, too much stunt?

But, I really liked the MAPHANDLE trick. Quite awesome.

« Last Edit: Aug 21st, 2016, 4:38pm by CryptoMan » User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 1348
xx Re: Grid of Textboxes using Windows API
« Reply #30 on: Aug 21st, 2016, 5:24pm »

on Aug 21st, 2016, 4:34pm, CryptoMan wrote:
Is this too difficult to implement in LBB?

Two of the features you asked for are already implemented (and documented) in LBB: passing arrays into SUBs and FUNCTIONs, and arrays of STRUCTS:

Passing Arrays Code:
    dim MyArray$(100)
    MyArray$(50) = "Fifty"
    call MySub MyArray$()
    dummy = MyFunc(MyArray$())
    end
    
sub MySub localarray1$()
    print localarray1$(50)
end sub

function MyFunc(localarray2$())
    print localarray2$(50)
end function 

Array of Structures Code:
    struct MyStructArray(100) one as long, two as ptr, three as char[13]
    MyStructArray(50).three.struct = "Hello world!"
    print MyStructArray(50).three.struct 

Richard.
User IP Logged

Pages: 1 2 3  Notify Send Topic Print
« Previous Topic | Next Topic »


This forum powered for FREE by Conforums ©
Terms of Service | Privacy Policy | Conforums Support | Parental Controls