BBC BASIC for Windows
« Combobox: removing last blank entries »

Welcome Guest. Please Login or Register.
Apr 5th, 2018, 10:26pm



ATTENTION MEMBERS: Conforums will be closing it doors and discontinuing its service on April 15, 2018.
Ad-Free has been deactivated. Outstanding Ad-Free credits will be reimbursed to respective payment methods.

If you require a dump of the post on your message board, please come to the support board and request it.


Thank you Conforums members.

BBC BASIC for Windows Resources
Online BBC BASIC for Windows documentation
BBC BASIC for Windows Beginners' Tutorial
BBC BASIC Home Page
BBC BASIC on Rosetta Code
BBC BASIC discussion group
BBC BASIC for Windows Programmers' Reference

« Previous Topic | Next Topic »
Pages: 1  Notify Send Topic Print
 thread  Author  Topic: Combobox: removing last blank entries  (Read 904 times)
g3nrw
Junior Member
ImageImage


member is offline

Avatar




PM


Posts: 74
xx Combobox: removing last blank entries
« Thread started on: Jul 12th, 2014, 9:57pm »

I have a combobox where I dynamically change the list items. Whenever I want to update the list, I first clear the existing list with:

SYS "SendDlgItemMessage", !dlg%, comboBox%, CB_RESETCONTENT

then repopulate the list with multiple CB_ADDSTRING calls.

This works fine if the new list contains exactly the same number of items as the old list (or more items than the old list), but if the new list has fewer items than the old, the new list then contains one or more blank entries at the end.

For example, if old list contains 4 entries:
~~~~~~~~~~~~~~~~~~~~~~~~
A
B
C
D
~~~~~~~~~~~~~~~~~~~~~~~~

and new list contains just 2 entries:
~~~~~~~~~~~~~~~~~~~~~~~~
E
F
~~~~~~~~~~~~~~~~~~~~~~~~

the new list is actually diplayed as:
~~~~~~~~~~~~~~~~~~~~~~~~
E
F
<blank entry>
<blank entry>
~~~~~~~~~~~~~~~~~~~~~~~~

By themselves, the blank entries don't do any harm, but they don't look good, and can confuse the user.

How do I remove these blank entries? I have Googled for hours for a solution without success!

--
Ian



User IP Logged

rtr
Guest
xx Re: Combobox: removing last blank entries
« Reply #1 on: Jul 13th, 2014, 06:43am »

on Jul 12th, 2014, 9:57pm, g3nrw wrote:
if the new list has fewer items than the old, the new list then contains one or more blank entries at the end.

I cannot reproduce that effect. I modified DLGDEMO.BBC (supplied with BB4W) by adding to the combobox initialisation code as follows:

Code:
      SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "Combobox 1"
      SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "Combobox 2"
      SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "Combobox 3"
      SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "Combobox 4"
      SYS "SendDlgItemMessage", !dlg%, 103, CB_RESETCONTENT, 0, 0
      SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "Combobox 1"
      SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "Combobox 2" 

The resulting combobox has only two items in its list box, with no blank entries (Windows 8.1).

Richard.
User IP Logged

g3nrw
Junior Member
ImageImage


member is offline

Avatar




PM


Posts: 74
xx Re: Combobox: removing last blank entries
« Reply #2 on: Jul 13th, 2014, 8:22pm »

Richard

That piece of code works as expected. However, the code below is closer to my app.

I use the EVENT library to detect a click on the combobox. When you click on the box, the code deletes the 4 old item values and displays 2 new values, plus the 2 blank entries I am complaining about. If you click on the combobox a second time, only the 2 new entries are displayed:

Code:
      REM. Modified Program to demonstrate combobox event handling
      INSTALL @lib$+"WINLIB"

      INSTALL @lib$+"WINLIB2"
      INSTALL @lib$+"WINLIB3"

      INSTALL @lib$+"WINLIB5"
      INSTALL @lib$+"WINLIB5A"
      INSTALL @lib$+"NOWAIT"
      INSTALL @lib$+"EVENTLIB"

      CBN_DROPDOWN = 7

      BS_DEFPUSHBUTTON = &1
      CB_ADDSTRING = &143
      CB_SETCURSEL = &14E
      CB_RESETCONTENT = &14B
      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
      WM_COMMAND = 273

      dlg%=FN_newdialog("Dialogue box", 20, 20, 160, 128, 8, 560)
      PROC_groupbox(dlg%, "Group box", 0, 4, 4, 152, 96, WS_GROUP)

      PROC_editbox(dlg%, "Text box", 101, 12, 20, 64, 12, ES_AUTOHSCROLL)
      PROC_editbox(dlg%, "123456", 102, 82, 20, 64, 12, ES_NUMBER)
      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)
      PROC_listbox(dlg%, "", 104, 82, 40, 64, 48, 0)

      PROC_radiobutton(dlg%, "Radiobutton 1", 105, 12, 64, 64, 10, 0)
      PROC_radiobutton(dlg%, "Radiobutton 2", 106, 12, 82, 64, 10, 0)
      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)

      PROC_showdialog(dlg%)
      ON CLOSE PROC_closedialog(dlg%):QUIT
      ON ERROR PROC_closedialog(dlg%):PRINT'REPORT$:END

      SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "Combobox 1"
      SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "Combobox 2"
      SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "Combobox 3"
      SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "Combobox 4"
      SYS "SendDlgItemMessage", !dlg%, 103, CB_SETCURSEL, 0, 0

      SYS "SendDlgItemMessage", !dlg%, 104, LB_ADDSTRING, 0, "Listbox item 0"
      SYS "SendDlgItemMessage", !dlg%, 104, LB_ADDSTRING, 0, "Listbox item 1"
      SYS "SendDlgItemMessage", !dlg%, 104, LB_ADDSTRING, 0, "Listbox item 2"
      SYS "SendDlgItemMessage", !dlg%, 104, LB_ADDSTRING, 0, "Listbox item 3"

      SYS "CheckRadioButton", !dlg%, 105, 106, 105
      SYS "SendDlgItemMessage", !dlg%, 109, UDM_SETRANGE, 0, 999


      PROC_eventinit

      PROC_eventregister(WM_COMMAND, PROCcontrolclick())

      REPEAT
        PROC_eventpoll
        WAIT 1
      UNTIL FALSE

      DEF PROCcontrolclick(M%, W%, L%)
      LOCAL controlID%, notificationCode%

      controlID% = W% AND &FFFF
      notificationCode% = W% >> 16

      CASE controlID% OF
        WHEN 103 :
          IF notificationCode% = CBN_DROPDOWN THEN
            SYS "SendDlgItemMessage", !dlg%, 103, CB_RESETCONTENT, 0, 0
            SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "Combobox 5"
            SYS "SendDlgItemMessage", !dlg%, 103, CB_ADDSTRING, 0, "Combobox 6"
            SYS "SendDlgItemMessage", !dlg%, 103, CB_SETCURSEL, 0, 0
          ENDIF
      ENDCASE
      ENDPROC


      END
 



So why does it display the 2 blank entries when you click on the box the first time, but no blank entries on subsequent clicks?

--
Ian


User IP Logged

rtr
Guest
xx Re: Combobox: removing last blank entries
« Reply #3 on: Jul 13th, 2014, 9:46pm »

on Jul 13th, 2014, 8:22pm, g3nrw wrote:
So why does it display the 2 blank entries when you click on the box the first time, but no blank entries on subsequent clicks?

Presumably because you're updating the contents whilst it's dropped down. The combobox has something of a dilemma if you try to reduce the number of items from 4 to 2 whilst the listbox is displayed; it could choose to dynamically resize the box, or it could choose to blank the now 'unused' (but still displayed) lines. It seems that it uses the second strategy, probably because that minimises undesirable side effects.

If it worries you, update the combobox whilst it's not dropped down. Alternatively first close up the list, update its contents, and then drop it down again (but that will require some care to avoid repeatedly triggering the CBN_DROPDOWN event).

I find it hard to imagine in what circumstances it would be appropriate to change the contents of a combobox as a result of the user clicking on it, as you are doing. Surely if a user action changes the number of items, that action must be associated with a different control?

Richard.

« Last Edit: Jul 13th, 2014, 9:54pm by rtr » User IP Logged

rtr
Guest
xx Re: Combobox: removing last blank entries
« Reply #4 on: Jul 18th, 2014, 10:46pm »

on Jul 13th, 2014, 9:46pm, Richard Russell wrote:
Surely if a user action changes the number of items, that action must be associated with a different control?

Perhaps I can clarify by means of an example. Consider the supplied program DLGDEMO.BBC, which displays a dialogue box containing two edit controls (one numeric), a combobox, a listbox, a checkbox and a pair of radio buttons.

Suppose that the combobox displays the contents of a disk directory, whilst the other controls modify what information is included. It might work something like this:
  • The contents of the textbox might specify the path to the directory to be listed. In that case changing the contents of the textbox would affect the contents of the combobox.

  • The value in the numeric edit control might specify the maximum number of files to be listed. So changing the value might affect the contents of the combobox.

  • The listbox might contain a set of filters which control which files are listed (e.g. *.BBC) so if they were changed it would affect the contents of the combobox.

  • The checkbox might select whether hidden files are listed or not, so changing the state of the checkbox might affect the contents of the combobox.

  • The radio buttons might select whether the file's creation date or its last-modified date is listed, so changing the state of the radio buttons would affect the contents of the combobox.
I'm sure you can see where this is leading. The one control which you can be confident does not affect the contents of the combobox is the combobox itself! So the issue which is the subject of this thread shouldn't arise.

Richard.
« Last Edit: Jul 19th, 2014, 07:08am by rtr » User IP Logged

g3nrw
Junior Member
ImageImage


member is offline

Avatar




PM


Posts: 74
xx Re: Combobox: removing last blank entries
« Reply #5 on: Jul 20th, 2014, 10:22am »

Quote:
I'm sure you can see where this is leading.
Richard.


Yes indeed I can.

I have restructured my program so that it now polls for new external conditions once per second, and only updates the combox if any previous conditions have changed. Everything now works as wanted.

Thanks for all the feedback.

--
Ian
User IP Logged

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

| |

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