Author |
Topic: A Better Way? (Read 824 times) |
|
CharlesB
New Member
member is offline


Gender: 
Posts: 46
|
 |
A Better Way?
« Thread started on: Mar 13th, 2015, 8:24pm » |
|
I have a menu of sorts in my program and the user must pick one option.
I looked at the tutorial and think that this "pick the number" method is the best, for I have two many options for the "hit an alpha key."
Yet, I think that you'll agree that this is awkward. Does anyone have a better suggestion for me?
I think that this explains itself; the user is working a quotation program for tubing with cutting options. Thanks. I know that for even intermediate programmers this will seem very crude.
DEF PROC_AskForFeetOrPieces PRINT COLOUR(12) PRINT "This quotation is for 1) Normal uncut tubing footage?" PRINT " 2) Saw-Cut Tubing in inch lengths?" PRINT " 3) Saw-Cut Tubing in foot lengths?" PRINT " 4) Core-Cut Tubing in inch lengths?" PRINT " 5) Core-Cut Tubing in foot lengths?" PRINT " 6) Lathe-Cut Tubing in inch lengths?" PRINT " 7) Lathe-Cut Tubing in foot lengths?" PRINT " 8) Other type of fabrication?" INPUT: COLOUR(0) FeetOrPieces$ = GET$ FeetPieces% = VAL(FeetOrPieces$) IF FeetPieces%=0 THEN PRINT "Oops . . . try again" ENDIF ENDPROC
|
« Last Edit: Mar 13th, 2015, 8:25pm by CharlesB » |
Logged
|
|
|
|
Richey
New Member
member is offline


Gender: 
Posts: 35
|
 |
Re: A Better Way?
« Reply #1 on: Mar 13th, 2015, 9:31pm » |
|
on Mar 13th, 2015, 8:24pm, CharlesB wrote:I have a menu of sorts in my program and the user must pick one option.
I looked at the tutorial and think that this "pick the number" method is the best, for I have two many options for the "hit an alpha key."
Yet, I think that you'll agree that this is awkward. Does anyone have a better suggestion for me?
I think that this explains itself; the user is working a quotation program for tubing with cutting options. Thanks. I know that for even intermediate programmers this will seem very crude.
DEF PROC_AskForFeetOrPieces PRINT COLOUR(12) PRINT "This quotation is for 1) Normal uncut tubing footage?" PRINT " 2) Saw-Cut Tubing in inch lengths?" PRINT " 3) Saw-Cut Tubing in foot lengths?" PRINT " 4) Core-Cut Tubing in inch lengths?" PRINT " 5) Core-Cut Tubing in foot lengths?" PRINT " 6) Lathe-Cut Tubing in inch lengths?" PRINT " 7) Lathe-Cut Tubing in foot lengths?" PRINT " 8) Other type of fabrication?" INPUT: COLOUR(0) FeetOrPieces$ = GET$ FeetPieces% = VAL(FeetOrPieces$) IF FeetPieces%=0 THEN PRINT "Oops . . . try again" ENDIF ENDPROC
|
|
Hi Charles
I'm a beginner myself but I think the CASE statement is probably an appropriate alternative for you to use when presenting a menu of different options:
See this chapter in the beginners tutorial -
http://bbcbasic.co.uk/bbcwin/tutorial/chapter10.html
|
|
Logged
|
|
|
|
CharlesB
New Member
member is offline


Gender: 
Posts: 46
|
 |
Re: A Better Way?
« Reply #2 on: Mar 14th, 2015, 03:08am » |
|
Thanks Richey
|
|
Logged
|
|
|
|
sveinioslo
Developer
member is offline


Posts: 64
|
 |
Re: A Better Way?
« Reply #3 on: Mar 18th, 2015, 11:41am » |
|
It is a good investment to spend a few days into learning about dialog boxes.
From the manual: "The WINLIB2 library contains a set of procedures and functions for creating and controlling custom dialogue boxes. These allow you to adopt the preferred Windows™ method of requesting input from the user."
Here you have three runnable examples, just to get you started.
Svein
Using listbox: Code: LB_GETCURSEL = 392
LB_ADDSTRING = 384
INSTALL @lib$+"winlib2"
REM create dialogbox ----------------------------------------
dlg% = FN_newdialog("Select cutting",100,100,180,120,8,500)
PROC_listbox(dlg%,"",100,10,10,160,90,0)
PROC_pushbutton(dlg%,"Ok",1,20,95,50,16,0)
PROC_pushbutton(dlg%,"Cancel",2,110,95,50,16,0)
PROC_showdialog(dlg%)
REM create dialogbox ----------------------------------------
REM fill listbox --------------------------------------------
READ text$
REPEAT
SYS "SendDlgItemMessage", !dlg%, 100, LB_ADDSTRING, 0, text$
READ text$
UNTIL text$=".."
REM fill listbox --------------------------------------------
REM read user selection -------------------------------------
Click% = 0
ON SYS Click% = @wparam% : RETURN
REPEAT WAIT 1
click% = 0
SWAP click%,Click%
IF click% = 1 THEN
SYS "SendDlgItemMessage", !dlg%, 100, LB_GETCURSEL, 0, 0 TO FeetPieces%
PRINT "User selected ";FeetPieces%
ENDIF
IF click% = 2 THEN PROC_closedialog(dlg%) : END
UNTIL !dlg% = 0
END
REM read user selection -------------------------------------
DATA " This quotation is for:"
DATA " 1) Normal uncut tubing footage?"
DATA " 2) Saw-Cut Tubing in inch lengths?"
DATA " 3) Saw-Cut Tubing in foot lengths?"
DATA " 4) Core-Cut Tubing in inch lengths?"
DATA " 5) Core-Cut Tubing in foot lengths?"
DATA " 6) Lathe-Cut Tubing in inch lengths?"
DATA " 7) Lathe-Cut Tubing in foot lengths?"
DATA " 8) Other type of fabrication?"
DATA ".."
Using combobox: Code: CB_SETCURSEL = 334
CB_ADDSTRING = 323
CB_GETCURSEL = 327
CBS_DROPDOWNLIST = 3
INSTALL @lib$+"winlib2"
REM create dialogbox ----------------------------------------
dlg% = FN_newdialog("Select cutting",100,100,180,120,8,500)
PROC_combobox(dlg%,"",100,10,10,160,90,CBS_DROPDOWNLIST)
PROC_pushbutton(dlg%,"Ok",1,20,95,50,16,0)
PROC_pushbutton(dlg%,"Cancel",2,110,95,50,16,0)
PROC_showdialog(dlg%)
REM create dialogbox ----------------------------------------
REM fill combobox --------------------------------------------
READ text$
REPEAT
SYS "SendDlgItemMessage", !dlg%, 100, CB_ADDSTRING, 0, text$
READ text$
UNTIL text$=".."
SYS "SendDlgItemMessage", !dlg%, 100, CB_SETCURSEL, 0, 0
REM fill combobox --------------------------------------------
REM read user selection -------------------------------------
Click% = 0
ON SYS Click% = @wparam% : RETURN
REPEAT WAIT 1
click% = 0
SWAP click%,Click%
IF click% = 1 THEN
SYS "SendDlgItemMessage", !dlg%, 100, CB_GETCURSEL, 0, 0 TO FeetPieces%
PRINT "User selected ";FeetPieces%
ENDIF
IF click% = 2 THEN PROC_closedialog(dlg%) : END
UNTIL !dlg% = 0
END
REM read user selection -------------------------------------
DATA " This quotation is for:"
DATA " 1) Normal uncut tubing footage?"
DATA " 2) Saw-Cut Tubing in inch lengths?"
DATA " 3) Saw-Cut Tubing in foot lengths?"
DATA " 4) Core-Cut Tubing in inch lengths?"
DATA " 5) Core-Cut Tubing in foot lengths?"
DATA " 6) Lathe-Cut Tubing in inch lengths?"
DATA " 7) Lathe-Cut Tubing in foot lengths?"
DATA " 8) Other type of fabrication?"
DATA ".."
Using radiobuttons: Code: INSTALL @lib$+"winlib2"
REM create dialogbox ----------------------------------------
dlg% = FN_newdialog("Select cutting",100,100,180,140,8,1100)
READ text$
PROC_static(dlg%,text$,100,10,10,160,10,0)
Y%=1
READ text$
REPEAT
PROC_radiobutton(dlg%,text$,100+Y%,20,10+Y%*10,160,10,0)
Y%+=1
READ text$
UNTIL text$=".."
PROC_pushbutton(dlg%,"Ok",1,20,110,50,16,0)
PROC_pushbutton(dlg%,"Cancel",2,110,110,50,16,0)
PROC_showdialog(dlg%)
REM create dialogbox ----------------------------------------
REM read user selection -------------------------------------
Click% = 0
ON SYS Click% = @wparam% : RETURN
REPEAT WAIT 1
click% = 0
SWAP click%,Click%
IF click% = 1 THEN
FeetPieces%=0
FOR I%=1 TO 8
SYS "IsDlgButtonChecked", !dlg%, 100+I% TO state%
IF state%=1 THEN FeetPieces%=I%
NEXT I%
PRINT "User selected ";FeetPieces%
ENDIF
IF click% = 2 THEN PROC_closedialog(dlg%) : END
UNTIL !dlg% = 0
END
REM read user selection -------------------------------------
DATA " This quotation is for:"
DATA " 1) Normal uncut tubing footage?"
DATA " 2) Saw-Cut Tubing in inch lengths?"
DATA " 3) Saw-Cut Tubing in foot lengths?"
DATA " 4) Core-Cut Tubing in inch lengths?"
DATA " 5) Core-Cut Tubing in foot lengths?"
DATA " 6) Lathe-Cut Tubing in inch lengths?"
DATA " 7) Lathe-Cut Tubing in foot lengths?"
DATA " 8) Other type of fabrication?"
DATA ".."
|
|
Logged
|
|
|
|
CharlesB
New Member
member is offline


Gender: 
Posts: 46
|
 |
Re: A Better Way?
« Reply #4 on: Mar 19th, 2015, 04:32am » |
|
Svein - - - Thanks for guiding me to the Windows section for dialogue boxes. I read all, and digested some of the document. I also found that Richard had written an example program for dialogue boxes.
I had, several times, looked for such a program, but somehow missed it. I think the problem is that I did not know that what I wanted was called a "dialogue box."
The example program did have a slightly different name than the manual name and I am learning from observing it.
In any event, as for your examples, I really liked your third example with the radio buttons. I'm trying to find out how I can extend the menu to allow a 9th and 10th line. As yet, I have not found the number to change, but I'm looking and reading.
Many thanks. I certainly will invest a few days here. Especially I thank you for the examples.
This is exactly what I was looking for and I was searching under "menu boxes" and came up with nothing. This was a lot of work, so again, thank you.
|
« Last Edit: Mar 20th, 2015, 02:08am by CharlesB » |
Logged
|
|
|
|
sveinioslo
Developer
member is offline


Posts: 64
|
 |
Re: A Better Way?
« Reply #5 on: Mar 20th, 2015, 10:13pm » |
|
The downside of constructing the dialogbox manually (as in the example), is that even a small change in the design, may require a lot of editing. Consider using one of the dialogue editors.There is one in the bbc/examples/tools folder named dlgedit.bbc.
To add lines to the radiobutton example, you need to increase the dialog size, reserve more memory for it and move the ok/cancel buttons down. In FN_newdialog increase the cy% value and for each new line, add 50 (bytes) to last value. In PROC_pushbutton increase the y% values. You need to experiment a little with the values. Then just add one or more DATA lines.
Good luck Svein
|
|
Logged
|
|
|
|
CharlesB
New Member
member is offline


Gender: 
Posts: 46
|
 |
Re: A Better Way?
« Reply #6 on: Mar 21st, 2015, 10:46pm » |
|
Thanks. After you first showed me the dialog boxes I did find the example program. I am fascinated with it for what it can do. I have been able to DIM string arrays for over 50 strings and the text just scrolls down in the Combo Box.
The below is an example. I am uploading an array THE_NAME$() from a data file With a FOR - NEXT Loop, it works great in the combo box. I disabled this for the example that I'm sending you.
I wanted a second combo box, and I seem to have managed! I am so happy. I feel that I am the remedial child of BBC BASIC, but I did manage to pull this off.
The only thing that I seemed to have messed up is the arrow keys; they should be with the "VAL" box. But, rather, they are with my second Combo Box. Any suggestions as how I can fix this?
I have tried to find the solution, but no luck yet as to what I did. I did save files along the way with my steps though.
I did figure out, with your help, and trial and error to enlarge my dialogue box.
I tired to move down the pushbuttons, but with moderate success. I just need to read the dialogue instructions again and again to get a better handle on them.
In the meantime, this is a new world, and I'm very happy to be learning about these dialog boxes.
Here is what I have as I have modified the Example Program.
Thanks so much!!
REM. Program to demonstrate a Dialogue Box INSTALL @lib$+"WINLIB2"
REM PROC_OPEN_BENDNAME_FIL
BS_DEFPUSHBUTTON = &1 CB_ADDSTRING = &143 CB_SETCURSEL = &14E CBS_DROPDOWNLIST = &3 ES_AUTOHSCROLL = &80 ES_NUMBER = &2000 LB_ADDSTRING = &180 LB_GETCURSEL = &188 UDM_SETRANGE = &465 UDS_ALIGNRIGHT = &4 UDS_AUTOBUDDY = &10 UDS_SETBUDDYINT = &2 WS_CHILD = &40000000 WS_GROUP = &20000 WS_VISIBLE = &10000000
REM These are the old values dlg%=FN_newdialog("Bends Quote", 20, 20, 160, 128, 8, 560)
dlg%=FN_newdialog("Bends Quote", 20, 20, 175, 128, 10, 600) PROC_groupbox(dlg%, "Enter Degree Enter Number", 0, 4, 4, 152, 96, WS_GROUP) REM PROC_editbox(dlg%, "Enter Degree", 101, 12, 20, 64, 12, ES_AUTOHSCROLL) PROC_editbox(dlg%, "QTY", 102, 82, 20, 64, 12, ES_NUMBER)
PROC_combobox(dlg%, "Degree", 101, 12, 20, 64, 12, CBS_DROPDOWNLIST)
PROC_dlgctrl(dlg%, "", 109, 0, 0, 12, 12, WS_VISIBLE OR WS_CHILD OR \ \ UDS_AUTOBUDDY OR UDS_ALIGNRIGHT OR UDS_SETBUDDYINT, "msctls_updown32")
PROC_combobox(dlg%, "", 103, 12, 40, 64, 60, CBS_DROPDOWNLIST) REM Would like another combo box here.
PROC_listbox(dlg%, "", 104, 82, 40, 64, 48, 0)
PROC_radiobutton(dlg%, "Std Tangents", 105, 12, 64, 64, 10, 0) PROC_radiobutton(dlg%, "Extd Tangents", 106, 12, 82, 64, 10, 0) REM Tried this but with no success yet PROC_radiobutton(dlg%, "Third", 107, 13, 83, 64, 10, 0) REM proc_checkbox(dlg%, "Checkbox", 107, 82, 82, 64, 10, 0)
PROC_pushbutton(dlg%, "OK", 1, 12, 108, 56, 14, WS_GROUP OR BS_DEFPUSHBUTTON) PROC_pushbutton(dlg%, "Cancel", 2, 92, 108, 56, 14, 0) REM experiment with new values . . . not good PROC_pushbutton(dlg%, "OK", 2, 14, 112, 62, 18, WS_GROUP OR BS_DEFPUSHBUTTON) REM experiment with new values . . . not good PROC_pushbutton(dlg%, "Cancel", 6, 100, 115, 60, 18, 2)
PROC_showdialog(dlg%) ON CLOSE PROC_closedialog(dlg%):QUIT ON ERROR PROC_closedialog(dlg%) RINT'REPORT$:END
DIM Bendsize$(50)
REM FOR X = 1 TO 45 SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "String example 1" SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "String example 2" SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "String example 3" SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "String example 4" SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "String example 5"
REM NEXT X
REM FOR X = 1 TO 45 REM SYS "SendDlgItemMessage", !dlg%, 101, CB_ADDSTRING, 0, THE_NAME$(X)
SYS "SendDlgItemMessage", !dlg%, 101, CB_ADDSTRING, 0, "String example x1" SYS "SendDlgItemMessage", !dlg%, 101, CB_ADDSTRING, 0, "String example x2" SYS "SendDlgItemMessage", !dlg%, 101, CB_ADDSTRING, 0, "String example x3" SYS "SendDlgItemMessage", !dlg%, 101, CB_ADDSTRING, 0, "String example x4"
REM NEXT X
SYS "SendDlgItemMessage", !dlg%, 103, CB_SETCURSEL, 0, 0 SYS "SendDlgItemMessage", !dlg%, 101, CB_SETCURSEL, 0, 0 SYS "SendDlgItemMessage", !dlg%, 104, LB_ADDSTRING, 0, "12 Rad" SYS "SendDlgItemMessage", !dlg%, 104, LB_ADDSTRING, 0, "18 Rad" SYS "SendDlgItemMessage", !dlg%, 104, LB_ADDSTRING, 0, "24 Rad" SYS "SendDlgItemMessage", !dlg%, 104, LB_ADDSTRING, 0, "30 Rad" SYS "SendDlgItemMessage", !dlg%, 104, LB_ADDSTRING, 0, "36 Rad" SYS "SendDlgItemMessage", !dlg%, 104, LB_ADDSTRING, 0, "48 Rad" SYS "SendDlgItemMessage", !dlg%, 104, LB_ADDSTRING, 0, "60 Rad" SYS "SendDlgItemMessage", !dlg%, 104, LB_ADDSTRING, 0, "72 Rad"
SYS "CheckRadioButton", !dlg%, 105, 106, 105 SYS "SendDlgItemMessage", !dlg%, 109, UDM_SETRANGE, 0, 999
Click%=0 ON SYS Click% = @wparam% : RETURN REPEAT WAIT 1 click%=0 SWAP Click%, click% UNTIL click%=1 OR click%=2 OR !dlg%=0
IF click%=1 THEN PRINT "OK pressed, settings were:"' DIM text% 255 SYS "GetDlgItemText", !dlg%, 101, text%, 255 PRINT "Text box contained """$$text%"""" SYS "GetDlgItemInt", !dlg%, 102, 0, 1 TO Val% SYS "GetDlgItemText", !dlg%, 103, text%, 255 SYS "SendDlgItemMessage", !dlg%, 104, LB_GETCURSEL, 0, 0 TO sel% PRINT "Listbox selection index was ";sel% SYS "IsDlgButtonChecked", !dlg%, 105 TO rb1% IF rb1% PRINT "Radiobutton 1 was checked" ELSE PRINT "Radiobutton 2 was checked" SYS "IsDlgButtonChecked", !dlg%, 107 TO cb% IF cb% PRINT "Checkbox was checked" ELSE PRINT "Checkbox was not checked" ELSE PRINT "Cancel pressed" ENDIF PRINT Val%;" - "; $$text%; '"ID Bends"; PROC_closedialog(dlg%) PRINT "Combobox selection was """$$text%"""" END
DEF PROC_OPEN_BENDNAME_FIL REM Program automatically translated from QBASIC to BBC BASIC REM using QB2BBC utility ver 0.36 on Fri.20 Mar 2015,18:02:22 REM!Embed @lib$+"QBLIB" REM INSTALL @lib$+"QBlib" : PROC_QBinit
REM Initialise string variables: Title1$ = "" : Title2$ = "" DIM THELINE$(45) DIM THE_NAME$(45) DIM THE_WEIGHT(45) DIM THE_BASIC_PARTNUMBER$(45)
f& = OPENIN("Bends Data Files\bendname.fil") : IF f&=0 ERROR 53, "Cannot open file" SWAP @hfile%(f&), @hfile%(5) INPUT #5, Title1$ : WHILE ASCTitle1$=10 Title1$ = MID$(Title1$,2) : ENDWHILE INPUT #5, Title2$ : WHILE ASCTitle2$=10 Title2$ = MID$(Title2$,2) : ENDWHILE REPEAT : WHILE EOF #5 EXIT REPEAT : ENDWHILE X = X + 1 INPUT #5, THELINE$(X) : WHILE ASCTHELINE$(X)=10 THELINE$(X) = MID$(THELINE$(X),2) : ENDWHILE REM OSCLI "OUTPUT 15" : PRINT THELINE$(X) : OSCLI "OUTPUT 0" THE_NAME$(X) = MID$(THELINE$(X),5,7) THE_WEIGHT(X) = VAL(MID$(THELINE$(X),17,7)) THE_BASIC_PARTNUMBER$(X) =(MID$(THELINE$(X),38,4)) REM PRINT THE_NAME$(X), THE_WEIGHT(X), " ", THE_BASIC_PARTNUMBER$(X) REM PRINT THELINE$(X) UNTIL FALSE CLOSE #5 ENDPROC
END
|
« Last Edit: Mar 21st, 2015, 11:31pm by CharlesB » |
Logged
|
|
|
|
sveinioslo
Developer
member is offline


Posts: 64
|
 |
Re: A Better Way?
« Reply #7 on: Mar 22nd, 2015, 10:09am » |
|
Good work.
Quote:I seemed to have messed up is the arrow keys; they should be with the "VAL" box |
|
They will automatically merge with the lastly created item. Just move the PROC_dlgctrl up one line, and see the magic.
Svein
PS. Use the 'code' tags when posting code to avoid corruption of the code. In this case there is a smiley instead of PRINT. Which becomes 'tongueRINT' when pasted into the IDE. Hint: press the # button and put your code in between the 'code' and '/code' .
|
|
Logged
|
|
|
|
CharlesB
New Member
member is offline


Gender: 
Posts: 46
|
 |
Re: A Better Way?
« Reply #8 on: Mar 22nd, 2015, 9:06pm » |
|
Love the magic!
Thanks for the advice; I was wondering where that smiley face came from.
|
|
Logged
|
|
|
|
CharlesB
New Member
member is offline


Gender: 
Posts: 46
|
 |
Re: A Better Way?
« Reply #9 on: Mar 29th, 2015, 02:22am » |
|
Svein, Your advice was profitable! I have spent two weeks or so really getting to see how dialogue boxes work and they have really cleaned up my program.
Some of the boxes allow users to provide lots of information, and this is so much better than the old BASIC "INPUT" command that I was using.
Now, for a simple question (I hope). Can you direct me, or give me a simple example of how a simple window text box would work.
I would like to put some printing-to-screen information (to the user) into a window. She can keep the window until she no longer requires the information. Also, with a "Snagit Utility" she can grab a window and directly copy it into an email.
Again, I thank you so much for your help. To see the dialogue box work was sort of a "lightbulb moment" for me. Thanks, Charles
|
|
Logged
|
|
|
|
sveinioslo
Developer
member is offline


Posts: 64
|
 |
Re: A Better Way?
« Reply #10 on: Mar 30th, 2015, 08:45am » |
|
Great work !
Quote:simple window text box would work. and directly copy it into an email. |
|
You could make a separate dialogbox with an editbox in it, n-lines tall. And add ES_MULTILINE to the editbox_style% value. Then the user can copy/paste the text as usual. Can't remember how to fill it with text 'line by line' but all text at once (in one string), will work.
https://msdn.microsoft.com/en-us/library/windows/desktop/bb775464%28v=vs.85%29.aspx
Svein
|
« Last Edit: Mar 30th, 2015, 08:49am by sveinioslo » |
Logged
|
|
|
|
|