barry@world.std.com (Barry L Wolman) (04/24/91)
I need to replace the contents of a menu with a new set of choices WITHOUT changing either the ID or the handle of the menu. The logical thing would be to just use a new menu with a different ID and handle. The problem is that I'm using the menu with a CDEF that squirrels away the handle to the menu and there doesn't seem to be a way to tell the CDEF to switch to a new menu. I wrote the following subroutine, but it doesn't work reliably. For example, when replacing a two-item menu by a one-item menu, sometimes the altered menu has one item in it, and sometimes it has three items! Is there a correct/better way to modify menus? The flaky subroutine is ... ------------------------------------------------ typedef struct { /* Structure description of STR# */ int numstrings; /* resource. */ unsigned char thestrings[]; } stringlist,**STRlist; /* Load the strings contained in STR# with handle in sh into the menu whose handle is mh */ make_menu(MenuHandle mh,STRlist sh) { int i,n,oldsize,newsize; unsigned char *p; HLock(mh); HLock(sh); p = (*sh)->thestrings; oldsize = CountMItems(mh); newsize = (*sh)->numstrings; n = min(oldsize,newsize); for(i=1;i <= n;i++) { SetItem(mh,i,p); p += (*p)+1; } if (oldsize < newsize) { /* New menu is bigger, put remaining items at end */ for(; i <= newsize; i++) { AppendMenu(mh,p); p += (*p)+1; } } else { /* New menu is same size or smaller */ for (; i <= oldsize; i++) { DelMenuItem(mh,i); } } HUnlock(mh); HUnlock(sh); } --------------------------------------------- Thanks, Barry Wolman -- Barry Wolman 159 Oxbow Road Needham, MA 02192 617-449-3874