MLISTBOX.VBX MLISTBOX.VBX is a custom control for Microsoft Visual Basic which provides support for extended- and multiple-selection listboxes as well as the standard single-selection listboxes that are built into Visual Basic. This product is (pseudo) shareware. Information on distribution rights is provided at the end of this file. I welcome any comments, criticisms, suggestions, etc. I can be reached via e-mail at: warninm@xanth.cs.orst.edu (I would also be interested to know where you obtained your copy of MLISTBOX.) Mike Warning Oct 25, 1992 HOW TO USE CUSTOM CONTROLS For those of you unfamiliar with using custom controls in Visual Basic, it is really easy. First, copy the file ending with .VBX to your windows directory. The start up Visual Basic and select 'Add File...' from the 'File' menu. Locate the custom control file (.VBX file) that you wish to use and select it, then click 'OK'. The icon representing the custom control should appear in the toolbox window and may be used just like any of the standard controls. If you then save your project, the custom control will be reloaded automatically the next time you open your project. REFERENCE Since I have made every effort to preserve the functionality of the original single-selection listbox in my version, I will only address those properties that are new or that I have expanded. For information on the standard properties not covered here, refer to the Visual Basic documentation. A number in parenthesis after the name of the property specifies what version of MListbox first supported it. Note that when I refer to 'multiple-selection listboxes' below, I really mean 'multiple- or extended-selection listboxes'. AutoRedraw - (1.1) Controls how the listbox is updated when an item is added or removed. The default is TRUE. If AutoRedraw is TRUE, the listbox acts just like the standard single- selection VB listbox - the entire box is redrawn at the end of an event procedure (or during a DoEvents() call) if an item has been added or removed. If AutoRedraw is FALSE, then the listbox will not get redrawn until you change it back to TRUE. This is useful when you need to add a a lot of items in a loop with a DoEvents() call and want to avoid flashing. Example: ... mlistbox1.AutoRedraw = FALSE For i = 1 to 50 mlistbox1.AddItem Format$(i) e = DoEvents() Next i mlistbox1.AutoRedraw = TRUE ... Empty - When reading this property, a TRUE will be returned if the listbox is empty, otherwise a FALSE will be returned. Writing any value to this property will force the listbox to reset, discarding any items that it contains. Example: ... mlistbox1.Empty = TRUE ' Clear listbox ... FindString - This property is used to find strings in a listbox. When this property is set, the 'FindIndex' property may then be checked to find the index of the first string in the listbox matching the FindString. After a string is found, this property will reset to the value of the string in the listbox. FindString will reset to null ("") if there is no string in the listbox matching the value that you gave it. Example: ... mlistbox1.FindString = "J" ' Find an item beginning with "J" If mlistbox1.FindString = "John" Then ... See Also: FindIndex FindIndex - This property hold the index of the string found using FindString. It will be set to -1 if there is no matching string. Example: ... mlistbox1.FindString = "J" ' Find an item beginning with "J" If mlistbox1.FindIndex = -1 then ' There isn't any ... See Also: FindString hWnd - This property is the window handle associated with the listbox and is exactly like the 'hWnd' property that forms have. This function is useful when a window handle must be passed to a Windows API function or other DLL function. Example: ... word = GetWindowWord(mlistbox1.hWnd, GWW_ID) ... ItemData - This property associates a long-integer value with an item in the listbox. For example, if you have a listbox containing names, you could put there ages (or whatever) in the ItemData for a particular item. This property is similar to the standard 'Tag' property, except that it is numeric, and each item in the control can have it's own data. Example: ... mlistbox.ItemData(3) = 34 ... ListIndex - For single-selection listboxes, ListIndex returns the index of the currently selected item. For multiple-selection listboxes, ListIndex returns the index of the last item that the user clicked on, the 'Selected' property may then be used to find out if that item is currently selected or not. If there is no current selection, single-selection listboxes will return -1. If no selection has ever been made, multiple-selection listboxes will return 0. NOTE: The Windows SDK says that this should not work for multiple- selection listboxes; however, it seems to work fine under Windows 3.0 and 3.1. Therefore, I cannot guarantee that this property will work correctly for multiple-selection listboxes under future versions of Windows. Example: ... If mlistbox1.ListIndex = -1 then ... SelCount - Returns the number of selected items in the listbox. Example: ... For i=1 to mlistbox1.SelCount - 1 ... See Also: SelCount, Selected Selected - When read, this property returns a TRUE if the item is selected, otherwise a FALSE is returned. When writing, this property may be used to select (or deselect) an item in the listbox. For single-selection listboxes, if another item is currently selected, the selection will change to a new item. Also, an item cannot be deselected in a single-selection listbox using this property (use ListIndex instead). Example: ... for i=0 to mlistbox1.SelCount - 1 mlistbox1.Selected = TRUE ' select every item next ... See Also: SelCount, SelList, ListIndex SelList - The property is an array that contains the indexes of the currently selected items in the listbox. The first selected item is SelList(0), etc. Example: ... For i=0 to mlistbox1.SelCount - 1 if mlistbox1.list(mlistbox1.SelList(i)) = "John" then ... See Also: SelCount, Selected Style - This property sets the style of the listbox (single-, extended-, or multiple-selection). Style = 0: single-selection. This type of listbox may only have one item selected at a time. Style = 1: extended-selection. This type of listbox may have more than one item selected. The user must hold down the 'CTRL' or 'SHIFT' keys while clicking the mouse to select more than one item Style = 2: multiple-selection. This type of listbox may have more than one item selected. The user does not need to hold down any keys while selecting items. You should probably set the Style property at design time. While you may change the Style at run-time, doing so clears out the contents of the listbox. Example: CONST EXTENDED_SELECTION = 1 ... mlistbox1.Style = EXTENDED_SELECTION ... Tabs - (1.1) A string that contains the location of tabs within the listbox. If you do not specify any tab locations (i.e. Tabs = ""), Windows will automatically set a tab every 32 dialog units. If you specify only one tab, the listbox will have a tab at every 'n' dialog units. For example: Tabs = "10" will set a tab every 10 dialog units. For more than one tab, There will be a tab set at just the positions that you specified, and then every 32 positions from then on. For example: Tabs = "10 20" will set a tab at 10, then at 20, then at 32, 64, etc. Example: ... t$ = Chr$(9) ' Chr$(9) is a tab character mlistbox1.additem "John" + t$ + "Doe" ... Text - For single-selection listboxes, Text returns the currently selected item in the listbox. For multiple-selection listboxes the item that was most recently clicked is returned, you can then use the 'Selected', and 'ListIndex' properties to determine if the item is selected or not. NOTE: The Windows SDK says that this should not work for multiple- selection listboxes; however, it seems to work fine under Windows 3.0. Therefore, I cannot guarantee that this property will work correctly for multiple-selection listboxes under future versions of Windows. Example: ... if (mlistbox1.text = "John") then ... See Also: ListIndex, Selected TopIndex - Sets the index of the item that is at the top of the listbox. If you try to set the top index to an item number less than 0, the listbox will start from item 0. If you try to use an index that is to high the listbox will not change. Example: ... mlistbox1.TopIndex = mlistbox1.TopIndex + 1 ' Scroll by one line ... Version - (1.1) Version is a read-only property that returns the version of the MListbox custom control file. Any attempt to write to this property is simply ignored. NOTE: This property was not supported in version 1.0 of MListbox. Example: ... If mlistbox1.Version = 1.1 then ... PROPERTIES This is a comprehensive list of all properties supported by the control: CtlName Index BackColor ForeColor Left Top Width Height MousePointer TabIndex TabStop DragIcon DragMode Enabled Parent Tag Visible FontName FontBold FontItalic FontStrikethru FontSize FontUnder ListCount SelCount ListIndex TopIndex List Empty SelList Style Text Sorted Selected FindString FindIndex ItemData hWnd AutoRedraw Tabs Version EVENTS Click DblClick DragDrop DragOver GotFocus KeyDown KeyPress KeyUp LostFocus MouseDown MouseMove MouseUp METHODS AddItem RemoveItem Refresh Load Unload VERSION HISTORY 1.1 - Oct 25, 1992 Fixed a bug relating to the Windows message WM_SETREDRAW. Fixed a bug relating to the background color while in design mode. Added the AutoRedraw, Tabs, and Version properties. Verified compatibility with Windows 3.1 Converted from MS QC/Win 1.0 to MS C 7.00 1.0 - February 16, 1992 Initial release DISTRIBUTION RIGHTS You are free to distribute this product separately from a product of your own, as long as you distribute both this file, and the custom control file (MLISTBOX.VBX). If you wish to use this product in one of your own products, your rights depend on what sort of product it is: Public Domain: i.e. not for profit, you ask no monetary fee for someone to use your product. In this case, you are free to distribute this control as much as you wish. Shareware: i.e. requesting that the user send you some money if they like/use your product. In this case, please send me a postcard of your home town or some feature thereabouts. Commercial: i.e. for profit. In this case, please contact me (see below), and we can arrange some mutually beneficial agreement. I may be reached either through e-mail at: warninm@xanth.cs.orst.edu or through regular mail at: Mike Warning 6015 202nd St. S.W. #14 Lynnwood, WA 98036 If you wish a prompt reply, please use e-mail. I do not actually live at the mailing address above, and it may take weeks/months to get anything to me that is sent there.