Title: Wrong Default Path After Drive Error, VB Open/Add File Dialog Document Number: Q72878 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When you choose the Open Project or Add File option from the File menu in the VB.EXE environment, and you get an error accessing a disk drive, Visual Basic incorrectly stays logged onto the failed drive path (even though the previous path is displayed), unless you explicitly change the drive. (This behavior differs from the Open command from the File menu in standard Windows applications, such as Microsoft Word for Windows and Microsoft Excel for Windows.) Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. Microsoft is researching this problem and will post new information here as it becomes available. To work around this problem, just change to a valid drive by typing a path preceded by a valid drive letter, or by selecting a valid drive letter with the mouse. More Information: To duplicate this problem, follow these steps: 1. Start Visual Basic (such as from the C:\VB\ subdirectory for the following example). 2. From the File menu, choose Open Project or Add File. (The Open Project or Add File dialog box lets you search for and select the file you want.) 3. Make sure drive A is empty and open. 4. Select [-a-| from the dialog box. A message box will correctly appear with the error message "Path Not Found:'' ". (What appears to be one double quotation mark is really two single quotation marks with nothing between them.) 5. Choose the OK button. Note that the current path, such as C:\VB (displayed above the Directories box), is correctly shown to be the same as before drive A was selected. The Files and Directories boxes also correctly show the same files as before drive A was selected. (So far, this behavior is the same as for the files dialog box in standard Windows applications.) 6. Erase the information in the File Name field, and type the following: *.* 7. Choose the OK button. 8. The problem is that Visual Basic now incorrectly gives you the "Path Not Found:'' " error message, which demonstrates that the actual current drive fails to match the displayed path (C:\VB), and Visual Basic is incorrectly attempting to access drive A again. This behavior differs from standard Windows applications, such as Microsoft Word for Windows and Excel for Windows, which don't give an error at this point, and instead correctly show all (*.*) files in the path (C:\VB) displayed in the dialog box. To work around this problem, just change to a valid drive by typing a path preceded by a valid drive letter, such as C:\VB\*.*, or by selecting a valid drive letter, such as [-c-| with the mouse. Title: Settings Box Is Hidden When Properties Bar at Bottom of Screen Document Number: Q72881 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When the Properties bar is positioned at the bottom of the screen and an enumerated property, such as FontName, is selected from the Settings box, the FontName list is still displayed beneath the Properties bar, instead of above the Properties bar, making the FontName list essentially invisible. Because of this behavior, Microsoft recommends leaving the Properties bar at the top of the screen. Note: The Properties bar's entry field is not a combo box, and does not react as a combo box. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: When you open a combo box and the space below is insufficient to display the drop-down list, the list will be displayed above the combo box window. This is exactly how the combo box "Properties list box" displays when the Properties bar is moved to the bottom of the screen. Although the Settings box resembles a combo box, the Settings box is actually an edit box and a push button. This window is not a combo box because the push button can take on several functions. In some cases the Settings box is disabled, and in some cases it invokes a pop-up dialog box (for example, when you select the Picture property of the Picture control). In other cases, such as for the FontName property, the Settings box displays a Windows list box just under the Properties bar. The location of the list box is determined by Visual Basic and will always be displayed below the Properties bar. Microsoft recommends leaving the Properties bar at the top of the screen. Reference: Please refer to pages 38-39 of the "Microsoft Visual Basic: Programmer's Guide" for version 1.0 for definitions of Properties bar, Properties list box, and Settings box. Title: Why VB Sub Might Stay in Proc: List Even After Code Deleted Document Number: Q73270 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: In a Visual Basic code window, if you want to delete the code for a Sub...End Sub procedure (or Function...End Function procedure), you must also delete the two or more blank lines (if any) following that procedure, or else that procedure will still exist (in a blank code window and in the Proc: box). Microsoft has confirmed this to be a problem in Microsoft Visual Basic version 1.0 programming system for Windows. We are researching this problem and will post new information here as it becomes available. To work around this problem, make sure to delete all blank lines in the code window for the procedure that you want to delete. More Information: Steps to Reproduce Problem -------------------------- 1. Start Visual Basic (or select New Project from Visual Basic's File menu if you are already in Visual Basic). 2. Double-click Form1, or press F7, to display the form's Code window. 3. Choose (general) from the Object: box, and enter the statement Sub Sub1 in the (general) (declarations) code window, and press the ENTER key. This causes Visual Basic to display the following Sub procedure: Sub Sub1() End Sub 4. Press CTRL+END, or click to the blank line after the End Sub statement. 5. Press the ENTER key to add a few blank lines after the End Sub statement. 6. Using the mouse, select (highlight) from the Sub Sub1() statement to the End Sub statement (but to duplicate the problem, don't highlight the blank lines after the End Sub statement). From the Edit menu, choose Delete, or press the DEL key, to delete the selected text. 7. Now the Proc: box still indicates that Sub1 exists as a procedure, even though you just tried to delete it. This problem is caused by the blank lines that were added after the End Sub statement. To work around the problem, highlight and delete the blank lines in the Sub1 code window, and the Sub1 procedure will be properly deleted. Additional reference words: 1.00 Title: Can't Get Help Within Any VB Dialog Box After an Error Document Number: Q73119 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: MS-DOS Summary: If you are in any Visual Basic dialog box and an error occurs, after you dismiss the error message, pressing F1 to get help for the dialog box will result in getting help on the previous error message, not help on the dialog box. Microsoft has confirmed this problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: The following steps reproduce the error: 1. From the File menu, choose Save Project. 2. Enter an invalid filename for saving the project. 3. An error message will pop up telling you that the filename is incorrect. 4. Press ENTER or double-click the OK button to dismiss the error message. 5. Press the F1 key to get help on the Save Project dialog box. 6. The help message for the error will pop up, instead of help for the dialog box. This behavior is incorrect. The above steps should give you help for the Save Project dialog box. To work around the problem and get correct help on this dialog box, dismiss the incorrect error message by double-clicking the control button, and click CANCEL to get rid of the Save Project dialog box. Now, choose Save Project from the File menu and press F1; the correct help should display. To get help on the error message, press F1 while the error message is displayed. Title: "Method Not Applicable..." with IsHidden Method in VB Document Number: Q73154 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: "IsHidden" was a method implemented in prerelease versions of Visual Basic, but IsHidden was removed in the released version (because it was no longer needed). However, using IsHidden as the name for a variable, Sub, Function, or object can still give the following error at run time: Method not applicable with this Object To work around this problem, avoid using the name IsHidden. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: The following example demonstrates the problem: 1. Within any event procedure, try the following: Sub Form_Click() print ishidden End Sub 2. This gives a syntax error asking you to add a "(" to the method, so continue by adding "()": Sub Form_Click() print ishidden() End Sub 3. This results in the following format after pressing ENTER after ishidden(): Sub Form_Click() Print IsHidden() Sub End This is the format for a predefined method called IsHidden(). After following the steps above, you will receive a run-time error "Method not applicable with this Object." This error results because this particular method was not completely unimplemented from the beta version. Microsoft will consider completely removing this behavior of the IsHidden name in a future version of Visual Basic. Title: Make EXE with 40-Byte Title Displays Only 39 in Task List Document Number: Q73155 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. The following steps demonstrate a problem with Microsoft Windows 3.0; the problem is not caused by Microsoft Visual Basic version 1.0: 1. Start Visual Basic. 2. From Visual Basic's File Menu, choose the Make EXE File command. 3. A Make EXE File dialog box will display. Enter a 40-character filename in the File Name box. 4. Double-click the OK command button to exit the dialog box. 5. Minimize Visual Basic, go to the Windows Program Manager menu, and choose File. 6. From the File menu, choose the Run option; the Run dialog box will display. 7. Now enter that 40-character .EXE filename or path to the .EXE filename in the Command Line box, and double-click OK when done. 8. The .EXE file will run correctly, but if you press CTRL+ESC to bring up the Task List box, you will see that your .EXE filename has been truncated to 39 characters (it no longer is 40 characters). Microsoft has confirmed this problem in the Microsoft Windows version 3.0 operating system (buglist3.00). We are researching this problem and will post new information here as it becomes available. Additional reference words: 3.00 Title: Removing Disk During VB Setup Terminates SETUP, Missing Files Document Number: Q73157 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: While running SETUP.EXE for Visual Basic, you may fail to copy all files (or experience other problems) if you try to remove the disk while the SETUP.EXE program is in progress. Microsoft has confirmed this problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. To work around this problem, wait until SETUP indicates that 100 percent of the files are copied before removing the Visual Basic floppy disk. More Information: Below is an example of one specific problem: When running SETUP.EXE on Disk 1 of Visual Basic (using 1.2 MB 5.25- inch disks), you can choose the option to install Visual Basic only. SETUP's bar graph will start by displaying 4 percent done, and while the large file C:\VB\VB.EXE is being copied, the disk drive light may go off and you might assume that Visual Basic is finished running SETUP. At this point you might (mistakenly) remove Disk 1. Then a message tells you that SETUP is complete, and you can exit SETUP. You have now installed VB.EXE, but you did not install some of the other important files, such as VBRUN100.DLL, which is needed to run your compiled applications under Windows version 3.0. If you want to install Visual Basic by selecting Visual Basic only, then you need to let Disk 1 complete its processing by waiting until the bar displays 100 percent. If you let Disk 1 run to completion, then the installed directory C:\VB should correctly contain the following files: VB.EXE VB.HLP VBRUN100.DLL README.TXT PACKING.LST SETUP.EXE DECOMP.DLL CONSTANT.TXT Additional reference words: 1.00 3.00 Title: Memory Limits in Visual Basic for Windows Document Number: Q72879 Publ Date: 26-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The following memory limitations apply to Microsoft Visual Basic programming system version 1.0 for Windows. Note: This information only applies when running the retail version of Microsoft Windows version 3.0. Different memory limitations may apply when running Visual Basic under the debug version of Windows provided with the Microsoft Windows Software Development Kit (SDK). More Information: Each Function or Sub procedure can have up to 64K of pseudo code (pcode). Each Form, Module, and Global Module gets its own data segment (up to 64K in size) for the allocation of all static data, strings, and simple variables (declared in the General section and Sub and Function procedures). Each array of any data type gets its own data segment, up to 64K in size. Arrays larger than 64K cause a "subscript out of range" error. Huge arrays (arrays larger than 64K) are not directly supported in Visual Basic, but you can support huge arrays through the use of a Windows dynamic-link library (DLL). A separate article discussing support for huge arrays can be found by querying on the following words: huge and array and DLL The properties for all controls on a form and the properties of the form itself go into a single data segment limited to 64K bytes, except the following: The List() property of a List Box The List() property of a Combo Box The Text property of a Text Box The List() property gets its own data segment, limited to 64K bytes, for each List Box and Combo Box. The Text property of a Text Box has a default size limit of 32K, which can be increased to 64K with a call to a Windows API function. For more information on how to increase the amount of text (from 32K to 64K) that can be entered into a Text Box, query on the following words: windows and api and sendmessage and textlimit Other memory limits relating to the properties of Controls and Forms include: 1. Each item in the List() property can be up to 1K in size, any item over this limit is truncated. 2. The Caption property of a control can be up to 1K in size, any Caption over this limit is truncated. 3. The Tag property of a control can be up to 32K in size, any Tag over 32K causes an "out of memory" error. There is one name-and-symbol table up to 32K in size per Form, Module, or Global Module. A name-and-symbol table contains the actual text of Sub function and Sub procedure names, variable names, line numbers, line labels, and an additional 4 bytes overhead for each of these names and symbols. If the 32K size limit is exceeded for a name-and-symbol table, an "out of memory" error will occur. To solve this, break up the Form or Module into multiple Forms or Modules. Note, this cannot be done with the Global Module. Only one Global Module is allowed; if you exhaust the Global Module's name-and-symbol table, there is no workaround, other than to use shorter variable names. The stack is 16K in size, with just one stack per application. The 16K stack size cannot be changed. Note that an "out of stack space" error can easily occur when your program uses uncontrolled recursion. If you run Visual Basic on the debug version of Microsoft Windows provided with the Microsoft Windows SDK, all properties (including List() and Text properties) go into a single segment, up to 64K in size per Form or Module. Other memory management limits may also differ under the debug version of Microsoft Windows. The debug version of Windows is created by copying a set of dynamic-link library (DLL) files from the Windows SDK into your \WINDOWS\SYSTEM subdirectory. These special DLLs perform additional error checking, including a check for stack overflow. Title: Code Causing Run-Time Error Can Be Hidden If in Split Window Document Number: Q73156 Publ Date: 26-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Under certain circumstances, using a split window in the Visual Basic environment can hide the code, which results in a run-time error. Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. To work around the problem, use step 8 shown below. More Information: The following example demonstrates a problem using split screens in Microsoft Visual Basic programming system version 1.0 for Windows: 1. Start Visual Basic, and from the File menu choose New Project. 2. Using the mouse, double-click on Form1; the Code window will display. 3. From the Code window, press the Maximize button so the entire screen displays Form1's Code window. 4. Select the split window bar, and click and drag the split window down to about two inches from the bottom of the screen. 5. The Sub Form_Click() should be displayed in the lower half of the split window. Enter the following code: Sub Form_Click() Print 1/0 'enter this line End Sub 6. Now run the sample code by choosing Start from the Run menu or by pressing the F5 function key. 7. After choosing Start from the Run Menu, click the Form1 window; a "Division by zero" error will display. The error occurs because of the "Print 1/0" statement coded above, but you cannot see the line of code where the error occurred. 8. If you click on the Maximize button for FORM1.FRM, you will see that the error occurs on the Print 1/0 statement. Use this method to work around the problem. Title: VB Replace Command Using Verify Can Incorrectly Repeat Replace Document Number: Q73271 Publ Date: 26-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: This article discusses a problem with the Verify option of the Code menu's Replace command in the Microsoft Visual Basic version 1.0 editor. If the search string is a subset of the replacement string, and if the Visual Basic syntax parser automatically inserts a space in the replacement string, then the Replace command with Verify incorrectly repeats the Replace on text that was part of the replacement string itself. Microsoft has confirmed this to be a problem in Microsoft Visual Basic version 1.0 programming system for Windows. Microsoft is researching this problem and will post new information here as it becomes available. To work around the problem, you can manually put space that would be inserted by the syntax parser in the replacement string (as described below). The problem does not occur with the Replace All option. More Information: Steps to Reproduce Problem -------------------------- 1. Start Visual Basic (or select New Project from Visual Basic's File menu). 2. From the Project1 window, double-click GLOBAL.BAS. This displays the Global module window. (Note that this Replace problem can occur in any code window.) 3. In the Global module window, enter the following code: Global A(2) [Or enter Dim A(2) in the code window of any non-Global module.| 4. Now choose the Replace command from the Code menu. 5. The Replace window contains two text boxes named "Find What:" and "Replace With:". In the Find What text box, enter a ")" and then tab to the Replace With text box and enter ",2)". 6. Choose the Verify command button. 7. The Verify window prompts you with "Replace Selected Text" [Yes| or [No|. If you choose the Yes command button, the replacement occurs correctly. The problem doesn't occur until you choose the Yes command button for a second time (and third, and so on), which will incorrectly add another string of text at the same location. The problem is caused by the space that the Visual Basic parser automatically inserts after the comma. This causes Visual Basic to effectively start the next search one character too early, causing the search to find the ")" that was just inserted. The problem can be avoided by changing the Replace string to ", 2)" (with a space after the comma). You can also avoid the problem by choosing the "Replace All" command button instead of the Verify command button (mentioned in step 6 above). This correctly does the Replace and displays the "Search complete" window. You can also avoid the problem by selecting the No command button the second time the Verify window is displayed (in step 7) (and then choose the OK command button when the "Search complete" window displays). Title: Can't Use Multiple & (for Access Keys) in a VB Menu Control Document Number: Q73372 Publ Date: 26-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When creating a menu control that has multiple & (ampersand) characters to mark the access keys in the caption (for example, &a&b&c&d), the menu will appear with an underline under the character after the last &. However, the access key will respond to the character following the first &. This is not a problem with Visual Basic, but rather with the Windows operating environment. This information applies to the Microsoft Visual Basic programming system version 1.0 for Windows. To work around this problem, do not put multiple & characters in the menu caption; just use one & character per caption. More Information: Steps to Reproduce Problem -------------------------- 1. From the File menu, choose New Project (ALT+F+N). 2. From the Window menu, choose Menu Design Window (ALT+W+M). 3. Enter "&A&B&C&D" (without the quotation marks) for the Caption. 4. Enter "ABCD" (without the quotation marks) for the CtlName. 5. Choose the Done button. 6. Click on the menu item ABCD on Form1. 7. Enter the statement Print "ABCD" in the click event for the menu item ABCD as follows: Sub ABCD_Click () Print "ABCD" End Sub 8. Run the program. When the program is run, the D in the menu caption will be underlined, but the menu responds to ALT+A, not ALT+D. Title: UAE Placing More than 64K in VB List Box or Combo Box Document Number: Q73374 Publ Date: 26-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Attempting to add more than 64K of data into a Visual Basic list box or combo box will result in a Windows UAE (unrecoverable application error). Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. Microsoft is researching this problem and will post new information here as it becomes available. More Information: Each item of a list box or combo box can contain a string up to 1K in length; however, if the total of all items exceeds 64K, a UAE will be generated. The .List() property for list boxes and combo boxes is given its own segment up to 64K in size. If an attempt to exceed this limit is made, an "Out of memory" or "Out of string space" error message should result, but instead a UAE occurs and the program terminates. Steps to Reproduce Problem -------------------------- 1. Create a New Project. 2. Draw a list box on Form1. 3. Add the following code to Form1's Click() event procedure: Sub Form_Click() Do List1.Additem String$(1024, "X") I = I + 1 Debug.Print I Loop End Sub When the UAE occurs, note that the value of the variable "I" displayed in the Immediate window will be 63. The UAE occurred when adding the 64th item, which caused the total size of the data in the list box to exceed 64K. The actual limit is slightly under 64K due to a small amount of overhead to manage the .List() property because it is a property array. Title: VB Cls Method on Thin and Wide Picture Control May Give UAE Document Number: Q73375 Publ Date: 26-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: MS-DOS Summary: Performing a Cls method on a picture control can generate a UAE (unrecoverable application error) message under the following conditions: 1. AutoRedraw = TRUE for the picture control. 2. The .Width property for the picture control is very large (approximately 20 times the width of the screen if running Windows with a 256-color video driver, or approximately 40 times the width of the screen if running Windows with a 16-color video driver.) Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. Microsoft is researching this problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. Start Windows using a 256-color driver and run Visual Basic (VB.EXE). 2. Create a New Project and place a picture control on the form. 3. Add the following code to the Form_Click procedure: Sub Form_Click() Form1.ScaleMode = 3 ' PIXEL's Picture1.AutoRedraw = -1 Picture1.Height = 34 ' 64 for 16 color video driver For i% = 380 To 390 Picture1.Width = Picture1.Height * i% Picture1.Cls Debug.Print Picture1.Width Next i% End Sub 4. Press F5 to run the program. You will now receive a Windows UAE message. Note the value of Picture1.Width at the time of the UAE. It should be approximately 20 times the width of your current screen resolution. Title: Clicking on Toolbox/Color Palette Menu Doesn't Leave Menu Open Document Number: Q73418 Publ Date: 1-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When you single click in the System menu (the Control menu in the upper left corner) of the Toolbox or the Color Palette in the Visual Basic environment, the menu flashes on the screen but does not stay visible like normal Windows System menus. This is by design. To keep the Toolbox or Color Palette system menu pulled down, you must hold down the mouse button. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: On a normal Windows System menu, a single mouse click pulls down the menu and keeps the menu down without having to hold down the mouse button. Even though the System menus of the Toolbox and Color Palette may look like normal System menus, they do not act like them, and are not "normal" Windows System menus. They were not designed to stay open with a single mouse click; therefore, the menu will flash briefly on the screen on a single mouse click and then disappear, unless you keep the mouse button held down. Title: VB Repaint Problem at Design Time with > 50 Controls on Form Document Number: Q73505 Publ Date: 1-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: If a combination of more than 50 text boxes and text labels are placed on a form, the form may be repainted incorrectly. The usual result is that the grid points are lost, the title bar and border are missing, and portions of the controls are missing. This is a problem that occurs at design time in the Visual Basic development environment. The problem does not apply to a program that is run in the Visual Basic environment or run as a .EXE program. Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. This problem has only been observed with text boxes and labels. Other controls on the form (command buttons, picture boxes, and so on) repaint correctly. More Information: The following steps may reproduce the error on some machine configurations: 1. Create a new form and place 50 text boxes and/or labels on the form. 2. Double-click on one of the controls to bring up its code window. 3. Make sure the code window covers most of the form, then close the code window by double-clicking on its control box. 4. The grid points, title bar, and border may be missing on the repainted form. To repaint the form correctly, position the mouse pointer above where the title bar should be, hold down the left button, and move the form window. This will bring back the title bar and border. To get the grid points back, choose Grid Settings from the Edit menu, make sure the Show Grid option is enabled, then choose OK. Your form should now be repainted correctly. Title: Large Grid Settings Can Make Moving Controls Difficult Document Number: Q73506 Publ Date: 1-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The Align to Grid feature in the Edit menu in the Microsoft Visual Basic environment can sometimes prevent you from moving a text box control. Microsoft has confirmed this problem in Microsoft Visual Basic programming system version 1.0 for Windows. Microsoft is researching this problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. From the Edit menu, choose Grid Settings. Set the grid settings as follows: Width: 1485 Height: 1485 Show Grid ON Align to Grid ON 2. Add a text box control and move it so that the top of the text box is even with the second row of the grid (the first row is even with the top of the form). 3. Select the top half of the text box and try to move it up to the row above. In most instances, you will not be able to move the text box to the desired location. Title: Overlapping Controls Not Supported in Visual Basic Document Number: Q73651 Publ Date: 2-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Overlapping Visual Basic controls may not respond as expected to mouse events. For example, the bottom control will receive the mouse event even when it appears that you have selected the top control. The use of overlapping Controls is not supported in Microsoft Visual Basic version 1.0. This information applies to the Microsoft Visual Basic programming system version 1.0 for Windows. More Information: Although the Visual Basic design editor allows you to overlap controls, when you run the application the region of the controls that overlap may not function as you would expect. For example, if two Command buttons, Command1 and Command2, overlap so that Command1 is partially on top of Command2, when you select Command1 within the region of overlap you would expect a Click event to be issued for Command1. However, the Click event may occur on Command2 even though it is underneath Command1 in the overlapping region. Title: UAE Exiting Windows when VB Form1 Unload Event Unloads Form2 Document Number: Q73656 Publ Date: 2-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: A Windows "Unrecoverable Application Error" (UAE) message will occur if you terminate Microsoft Windows 3.0 under the following conditions: 1. A Visual Basic version 1.0 application is resident (running in the background or foreground). 2. The Visual Basic application contains multiple forms. 3. The Unload event procedure of one form unloads another form. 4. The Visual Basic application is compiled and run as an .EXE program. This problem does not occur when you run the program from the Visual Basic development environment. Microsoft has confirmed this problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. Start Visual Basic, and Form1 will automatically be created by default. (If you already have a project loaded in the Visual Basic environment, you can select New Project from the File menu [ALT+F, N|.) 2. From the File menu, choose New Form. This will create Form2. 3. Add the following code to Form1's Load event procedure: Sub Form_Load () Form2.Show End Sub 4. Add the following code to Form1's Unload event procedure: Sub Form_Unload (Cancel As Integer) Unload Form2 End Sub 5. From the File menu, choose Make EXE File (ALT+F, K) to create an .EXE file. 6. From the Windows Program Manager's File menu, choose the Run option, and run the Visual Basic .EXE program that you just created. 7. Terminate Windows (ALT+F, X from the Windows Program Manager). The Windows UAE message occurs. The computer may hang after you click on the OK button of the UAE dialog box. The UAE message incorrectly occurs because of the attempt to unload Form2 from Form1's Unload event procedure. This is a known problem when attempting to use the Unload method for one form from within the Unload event procedure of another form. To work around this problem, remove the Unload method from the Unload event procedure or use the End statement in the Unload event procedure instead. Title: Determining Number of Lines in VB Text Box; SendMessage API Document Number: Q72719 Publ Date: 8-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: To determine the number of lines of text within a text box control, call the Windows API function SendMessage with EM_GETLINECOUNT(&H40A) as the wMsg argument. Calling SendMessage with the following parameters will return the amount of lines of text within a text box: hWd% - Handle to the text box. wMsg% - EM_GETLINECOUNT(&H40A) wParam% - 0 lParam% - 0 This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More information: As an example to determine the amount of lines within a text box, perform the following: 1. Create a form with a text box and a command button. Change the MultiLine property of the text box to TRUE. 2. Declare the API SendMessage function in the global-declarations section of your code window. (the Declare statement must be on just one line): Declare Function SendMessage% Lib "user" (ByVal hWd%, ByVal wMsg%, ByVal wParam%, ByVal lParam&) 3. You will need to declare another API routine to get the handle of the text box. Declare this also in your global-declarations section of your code window. The returned value will become the hWd% argument to the SendMessage function. Declare Function GetFocus% Lib "user" () 4. Within the click event of your button, add the following code: Sub Command1_Click () Const EM_GETLINECOUNT = &H40A 'defined within SDK WINDOWS.H ' command button has focus, give focus to text box. Text1.SetFocus ' get the handle of the text box. hWd% = GetFocus() ' print the amount of lines to the immediate window. Debug.Print SendMessage(hWd%, EM_GETLINECOUNT, 0, 0) End Sub 5. Run the program. Add several lines of text to the text box. Click the command button to see the number of lines printed out to the immediate window. References: "Programming Windows: the Microsoft Guide to Writing Applications for Windows 3," by Charles Petzold (published by Microsoft Press, 1990) "Peter Norton's Windows 3.0 Power Programming Techniques," by Peter Norton and Paul Yao (published by Bantam Computer Books, 1990) "Microsoft Windows 3.0 Software Development Kit: Reference Volume 1" The WINSDK.HLP file shipped with Microsoft Windows 3.0 Software Development Kit Title: How to Make a VB Text Box Control with a Password (*) Style Document Number: Q71457 Publ Date: 16-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: In the password style for a control, all characters display as an asterisk (*) as they are typed into the control. Microsoft Visual Basic does not have any intrinsic function for creating an edit control with the password style. You can add the password style to a Visual Basic text box control by using several Windows API function calls. This information applies to Microsoft Visual Basic Programming System version 1.0 for Windows. More Information: Adding the password style to a text box control can be performed by calling several Windows API function calls. These functions are GetFocus, GetWindowLong, SetWindowLong, and SendMessage. The function GetFocus requires no parameters. This function returns an integer value that represents the handle to the control. Use GetFocus to get a handle to the control that currently has the focus. hWd% = GetFocus() After you have received the handle to the text box control, you can call GetWindowLong to retrieve the style flags for the control by using the second parameter of GWL_STYLE. Once you have the style flags, you can use the bit-wise OR operation to set the ES_PASSWORD style. StyleFlags& = GetWindowLong (hWd%, GWL_STYLE) StyleFlags& = StyleFlags& OR ES_PASSWORD After adding the password style to the existing style for the control, you can call SetWindowLong to change the style associated to the control. You would call SendMessage with the message parameter of ES_SETPASSWORDCHAR to inform the control what character is to be used as the password mask; the default character is an asterisk (*). StyleFlags& = SetWindowLong (hWd%, GWL_STYLE, StyleFlags&) PasswordMask% = Asc("*") SendMessage (hWd%, ES_SETPASSWORDCHAR, PasswordMask%, 0&) To create a text box with the password style within Visual Basic, create a text box with the name Text1 on Form1. Declare the following Windows API functions and CONST variables in the Global section of your code: Declare Function GetFocus Lib "User" () As Integer Declare Function GetWindowLong Lib "User" (ByVal hWd%, ByVal nIndex%) As Long Declare Function SetWindowLong Lib "User" (ByVal hWd%, ByVal nIndex%, ByVal dwNewLong&) As Long Declare Function SendMessage Lib "User" (ByVal hWd%, ByVal wMsg%, ByVal wParam%, ByVal lParam&) As Long Global Const WM_USER = &H400 Global Const EM_SETPASSWORDCHAR = WM_USER + 28 Global Const ES_PASSWORD = &H20 Global Const GWL_STYLE = -16 Note: Each Declare statement above must be written on just one line. Include the following code in the (general) section of the Form1 module: Sub Make_Password_Control (Flag As Integer, PasswordMask As Integer) Dim hWd As Integer ' Window Handle for the control Dim StyleFlags As Long ' Window Style for the control If Not Flag Then ' The control should have a STATIC flag to minimize the ' execution of the code. We don't want to perform this code ' all the time, just once. Flag = Not Flag hWd = GetFocus() StyleFlags = GetWindowLong(hWd, GWL_STYLE) StyleFlags = StyleFlags Or ES_PASSWORD StyleFlags = SetWindowLong(hWd, GWL_STYLE, StyleFlags) StyleFlags = SendMessage(hWd, EM_SETPASSWORDCHAR, PasswordMask, 0&) End If End Sub Include the following code in the Text1_GotFocus event in the Form1 module: Sub Text1_GotFocus () Static Already_Password As Integer Make_Password_Control Already_Password, Asc("*") End Sub Title: How to Get "HWnd" Handle for a Control by Using GetFocus API Document Number: Q71799 Publ Date: 16-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Microsoft Visual Basic does not provide access to the Windows Handle (hWnd) for any control other than the Form. By using the Windows API GetFocus function, you can retrieve the handle to most Visual Basic controls. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: Visual Basic provides a "hWnd" property for the Form, but none of the provided controls has this property. By using the Windows API GetFocus function and the Visual Basic SetFocus method you can obtain the "hWnd" for most Visual Basic controls. With the exception of the Frame and Label controls, neither of these controls can receive the focus for user input and do not support the Visual Basic SetFocus method. The Visual Basic SetFocus method allows the changing of the input focus to a specific control, rather then waiting for the user to select the desired control manually. The following code will change the focus to the Command Button "Command1" on the Form: Command1.SetFocus The GetFocus function requires no parameters. The GetFocus function returns an integer value that represents the handle to the control. Use GetFocus to get a handle to the control that currently has the focus: hWd% = GetFocus() ' HWnd is reserved word in Visual Basic, so you ' must use a different name, such as hWd% Most Windows API functions require the handle (hWnd) of the window that is to be acted upon. For examples of using the Windows API GetFocus function in Visual Basic, query on the following word: GETFOCUS Title: "Overflow" in VB Drawing Circle Segment with Radius of Zero Document Number: Q73280 Publ Date: 16-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: MS-DOS Summary: When using the Microsoft Visual Basic version 1.0 Circle statement to draw a segment of a circle with a radius of 0, an "Overflow" error incorrectly occurs. Microsoft has confirmed this to be a problem with Microsoft Visual Basic programming system version 1.0 for Windows. We are researching the problem and will post new information here as it becomes available. More Information: The following statement demonstrates the problem: Circle (0,0), 0,, 4, 5 When you run the above statement, an "Overflow" error incorrectly occurs. In contrast, using the Circle statement to draw an entire circle of radius 0 works correctly without an error (correctly drawing nothing); for example: Circle (0,0), 0 Title: How to Scroll VB Text Box Programmatically and Specify Lines Document Number: Q73371 Publ Date: 16-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: By making a call to the Windows API function SendMessage, you can scroll text a specified number of lines or columns within a Visual Basic text box. By using SendMessage, you can also scroll text programmatically, without user interaction. This technique extends Visual Basic's scrolling functionality beyond the built-in statements and methods. The sample program below shows how to scroll text vertically and horizontally a specified number of lines. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: Note that Visual Basic itself does not offer a statement for scrolling text a specified number of lines vertically or horizontally within a text box. You can scroll text vertically or horizontally by actively clicking on the vertical and horizontal scroll bars for the text box at run time; however, you do not have any control over how many lines or columns are scrolled for each click of the scroll bar. Text always scrolls one line or one column per click on the scroll bar. Furthermore, no built-in Visual Basic method can scroll text without user interaction. To work around these limitations, you can call the Windows API function SendMessage, as explained below. Example ------- To scroll the text a specified number of lines within a text box requires a call to the Windows API function SendMessage using the constant EM_LINESCROLL. You can invoke the SendMessage function from Visual Basic as follows: r& = SendMessage& (hWd%, EM_LINESCROLL, wParam%, lParam&) hWd% The window handle of the text box. wParam% Parameter not used. lParam& The low-order 2 bytes specify the number of vertical lines to scroll. The high-order 2 bytes specify the number of horizontal columns to scroll. A positive value for lParam& causes text to scroll upward or to the left. A negative value causes text to scroll downward or to the right. r& Indicates the number of lines actually scrolled. The SendMessage API function requires the window handle (hWd% above) of the text box. To get the window handle of the text box, you must first set the focus on the text box using the SetFocus method from Visual Basic. Once the focus has been set, call the GetFocus API function to get the window handle for the text box. Below is an example of how to get the window handle of a text box. 'The following appears in the general declarations section of the 'form: Declare Function GetFocus% Lib "USER" () 'Assume the following appears in the click event procedure of a 'command button called Scroll. Sub Command_Scroll_Click () OldhWnd% = GetFocus () 'Store the window handle of the 'control that currently has the 'focus. Text1.SetFocus hWd% = GetFocus() End Sub To scroll text horizontally, the text box must have a horizontal scroll bar, and the width of the text must be wider than the text box width. Calling SendMessage to scroll text vertically does not require a vertical scroll bar, but the length of text within the text box should exceed the text box height. Below are the steps necessary to create a text box that will scroll five vertical lines or five horizontal columns each time you click the command buttons labeled "Vertical" and "Horizontal": 1. From the File menu, choose New Project (ALT+F+N). 2. Double-click on Form1 to bring up the code window. 3. Add the following API declaration in the General Declarations section of Form1. Note that you must put all Declare statements on a separate and single line. Also note that SetFocus is aliased as PutFocus because there already exists a SetFocus method within Visual Basic. Declare Function GetFocus% Lib "user" () Declare Function PutFocus% Lib "user" Alias "SetFocus" (ByVal hWd%) Declare Function SendMessage& Lib "user" (ByVal hWd%, ByVal wMsg%, ByVal wParam%, ByVal lParam&) 4. Create a text box called Text1 on Form1. Set the MultiLine property to True and the ScrollBars property to Horizontal (1). 5. Create a command button called Command1 and change the Caption to "Vertical". 6. Create a another command button called Command2 and change the Caption to "Horizontal". 7. From the General Declarations section of Form1, create a procedure to initialize some text in the text box as follows: Sub InitializeTextBox () Text1.Text = "" For i% = 1 To 50 Text1.Text = Text1.Text + "This is line " + Str$(i%) 'Add 15 words to a line of text For j% = 1 to 10 Text1.Text = Text1.Text + " Word "+ Str$(j%) Next j% 'Force a carriage return (CR) linefeed (LF) Text1.Text = Text1.Text + Chr$(13) + Chr$(10) x% = DoEvents() Next i% End Sub 8. Add the following code to the load event procedure of Form1: Sub Form_Load () Call InitializeTextBox End Sub 9. Create the actual scroll procedure within the General Declarations section of Form1 as follows: 'The following two lines must appear on a single line: Function ScrollText& (TextBox As Control, vLines As Integer, hLines As Integer) Const EM_LINESCROLL = &H406 'Place the number of horizontal columns to scroll in the high- 'order 2 bytes of Lines&. The vertical lines to scroll is 'placed in the low-order 2 bytes. Lines& = Clng(&H10000 * hLines) + vLines 'get the window handle of the control that currently has the 'focus, Command1 or Command2. SavedWnd% = GetFocus%() 'set focus to the passed control (Text control) TextBox.SetFocus 'get the handle to current focus (Text control) TextWnd% = GetFocus%() 'scroll the lines Success& = SendMessage(TextWnd%, EM_LINESCROLL, 0, Lines&) 'restore the focus to the original control, Command1 or 'Command2 r% = PutFocus% (SavedWnd%) 'return the number of lines actually scrolled ScrollText& = Success& End Function 10. Add the following code to the click event procedure of Command1 labeled "Vertical": Sub Command1_Click () 'Scroll text 5 vertical lines upward Num& = ScrollText&(Text1, 5, 0) End Sub 11. Add the following code to the click event procedure of Command2 labeled "Horizontal": Sub Command2_Click () 'Scroll text 5 horizontal columns to the left Num& = ScrollText&(Text1, 0, 5) End Sub 12. Run the program. Click the command buttons to scroll the text five lines or columns at a time. Title: "[" May Incorrectly Sort in List/Combo Box if Sorted=True Document Number: Q73838 Publ Date: 16-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: An example below demonstrates a problem using the Sorted property to sort a string beginning with a bracket ([) in either a list box or combo box in Microsoft Visual Basic programming system version 1.0 for Windows. This sorting problem is actually caused by Microsoft Windows 3.0 (buglist3.00) and is not caused by Visual Basic. Microsoft is researching this problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. In the Visual Basic environment, from the File menu, choose New Project. 2. Place two list boxes or two combo boxes on the form. 3. Select from the Properties Bar the Sorted property for either the two list boxes or two combo boxes to True. Note: Do not invoke List1.Sorted = -1 within the code of an event procedure because this causes the following run-time error: "Sorted" property cannot be set at runtime 4. Add some code to the Form_Click event procedure. Below are two separate examples of the code to add, depending on if you are using list boxes or combo boxes: Sub Form_Click () Sub Form_Click () List1.AddItem "[" Combo1.AddItem "[" List1.AddItem "\" Combo1.AddItem "\" List1.AddItem "a" Combo1.AddItem "a" List2.AddItem "a" Combo2.AddItem "a" List2.AddItem "\" Combo2.AddItem "\" List2.AddItem "[" Combo2.AddItem "[" End Sub End Sub 5. From the Run menu, choose Start, or press F5 to run the code. 6. Click on the form to see the sequence "a [ \" in the first list box or combo box and see the different sequence "[ \ a" in the second list box or combo box. This reveals an inconsistency with an internal Windows 3.0 sorting routine. If you replace the bracket character with the character "b", the two boxes correctly sort in the same order (\ a b). The problem is with sorting the bracket character. Title: Initial ForeColor/BackColor on Color Palette Can Be Reversed Document Number: Q74265 Publ Date: 16-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: This article explains a problem with the Color Palette in Microsoft Visual Basic programming system version 1.0. The following steps reproduce the problem: 1. Start Visual Basic; the default Form1 will display. 2. From the File menu, choose Save Project As, and follow the prompts to save under the default name Form1.frm, followed by Project1.mak. 3. From the Window menu, choose Color Palette. Notice the default colors presented for the background and foreground in the left box. The foreground is black and the background is white. 4. Exit Visual Basic. 5. From the Program Manager's File menu, choose the Run command and enter the following path: C:\VB\Project1.mak 6. This should begin running Visual Basic with the previously saved example Project1.mak that you saved in step 2. 7. Notice the Color Palette is displayed differently. The background is now black instead of white and the foreground is now white instead of black. This problem occurs only when a project is run from the command line. The above problem can be corrected by adding one more step: View the Form by selecting Form1.frm from the Project1 Window. This causes the Color Palette to be displayed correctly with the background being white instead of black. Microsoft has confirmed this to be a problem with Microsoft Visual Basic programming system version 1.0. We are researching this problem and will post new information here as it becomes available. Title: "[" May Incorrectly Sort in VB List/Combo Box If Sorted=True Document Number: Q74132 Publ Date: 16-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: An example below demonstrates a problem using the Sorted property to sort a string beginning with a bracket "[" in either a list box or combo box in Microsoft Visual Basic programming system version 1.0 for Windows. This sorting problem is actually caused by Microsoft Windows 3.0 (buglist3.00) and is not caused by Visual Basic. Microsoft is researching this problem and will post new information here as it becomes available. More Information: The following steps duplicate the problem: 1. In the Visual Basic environment, choose New Project from the File menu. 2. Place two list boxes or two combo boxes on the form. 3. From the Properties Bar, set the Sorted property for either the two list boxes or two combo boxes to True. Note: Do not invoke List1.Sorted = -1 within the code of an event procedure because this causes the run-time error "'Sorted' property cannot be set at run time." 4. Now add some code to the Form_Click event procedure. Below are two separate examples of the code to add depending on if you are using list boxes or combo boxes: Sub Form_Click () Sub Form_Click () List1.AddItem "[" Combo1.AddItem "[" List1.AddItem "\" Combo1.AddItem "\" List1.AddItem "a" Combo1.AddItem "a" List2.AddItem "a" Combo2.AddItem "a" List2.AddItem "\" Combo2.AddItem "\" List2.AddItem "[" Combo2.AddItem "[" End Sub End Sub 5. Run the code by pressing the F5 function key or choosing Start from the Run menu. 6. Click on the form to see the sequence "a [ \" in the first list box or combo box and to see the different sequence "[ \ a" in the second list box or combo box. This reveals an inconsistency with an internal Windows 3.0 sorting routine. If you replace the character "[" with the character "b", the two boxes correctly sort in the same order: "\ a b". The problem is with sorting the "[" character. Title: Extra Click Required to Return Focus to Code and Select Text Document Number: Q74294 Publ Date: 16-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary You must use an extra click when returning focus from the Menu bar, Toolbox, or the Properties bar to the current code window and then attempting to either select text or set the insertion point. Contrary to the standard Windows convention, which requires only one mouse click and hold to accomplish this, Visual Basic 1.0 requires you to click once to set the focus to the code window, and then again to position the insertion point or select text. Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: To duplicate this problem, start with a new project in the Visual Basic environment: 1. Double-click on Form1 to to open the Form1_Click procedure code window. 2. Click on Visual Basic's Main menu, Properties bar, or Toolbox. 3. Try to position the insertion point or select text in the Form1_Click code window. The first click merely shifts the focus to the code window, but the insertion point is not positioned in the window, nor is any text selected. You must release the mouse button and click again to select text or place the insertion point. The problem also occurs in the Copy/Paste or Cut/Paste process. When you attempt to Paste, you must click a second time to place the insertion point where desired for the Paste. Title: If Directory Deleted, Directories Empty in Save Project As Box Document Number: Q74192 Publ Date: 16-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The following is a small user-interface problem with the Save Project As dialog box in Microsoft Visual Basic programming system version 1.0 for Windows. If you currently have a project loaded in Visual Basic and, from a simultaneous DOS session in Windows, you delete that project and its subdirectory, then the next Save Project As command will incorrectly display an empty Directories list box. Subsequent Save Project As commands correctly show the Directories list box. Microsoft has confirmed this problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: The following steps reproduce the problem. 1. Go to a DOS prompt and change directory to the Visual Basic directory (CHDIR \VB). From this directory, make a new directory with the MKDIR command; for example, MKDIR TEST. 2. Now go back into Windows. From Visual Basic's File menu, choose Save Project As. Choose Yes to save the form as Form1.Frm. Next, save the form under the following path: C:\VB\TEST\Form1.Frm 3. After you press ENTER or choose OK, another message will display, asking you to save the Project1.Mak. Choose OK, and enter the path: C:\VB\TEST\Project1.Mak 4. Minimize Visual Basic and activate a DOS prompt box from Windows. From the directory C:\VB\TEST you should see the Project1.Mak and Form1.Frm files. Delete these files with DEL *.* and answer Y. Change directories to the C:\VB directory (CHDIR ...). Remove the TEST directory with the command RMDIR TEST. Now EXIT from DOS and return to your Visual Basic session within Windows. 5. Now try to save the project by choosing Save Project As. A message will correctly state "Path not found: 'C:\VB\TEST'". Choose OK; then you will see a Save Project As window displayed with an empty "File Name", but the "Directories" list box will incorrectly be blank. The problem is minor, since subsequent Save Project As commands correctly display directories in the "Directories" list box. Title: "UAE" Changing Display of DOS Window When VB Is at Breakpoint Document Number: Q74193 Publ Date: 16-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: This information applies to Microsoft Visual Basic programming system version 1.0 for Microsoft Windows. When using some Windows display drivers, the following steps may cause Microsoft Visual Basic to abort with an "UNRECOVERABLE APPLICATION ERROR:" 1. Start Microsoft Visual Basic. 2. Add a line of code to the Form_Click event procedure, such as "X = 5". 3. Set a break point on the line added in step 2. 4. Start a simultaneous DOS session in Windows. 5. Run the Visual Basic program (F5); click on the form to stop at the break point. 6. Activate (double-click) the DOS window. 7. Press ALT+ENTER to change the DOS window to a full screen window. After pressing ALT+ENTER to change the DOS window to a full screen DOS session, Microsoft Visual Basic may quit with an "UNRECOVERABLE APPLICATION ERROR." This behavior is a result of problems with certain Windows display drivers, and not a problem with Visual Basic. Title: Can Click in Code Window Without Activating it, in VB.EXE Document Number: Q74194 Publ Date: 16-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: If you have both a form and code window present at design time in Microsoft Visual Basic with the current focus on the form, clicking on the upper or lower edge of the splitter bar in the code window will fail to shift the focus to the code window. Clicking anywhere else on the code window correctly shifts the focus and activates the code window. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: To reproduce this problem in Visual Basic, choose the New Project option from Visual Basic's File menu. Double-click on Form1 to open a code window, then click on Form1 to return focus to the form. Now place the tip of the mouse pointer on the upper or lower edge of the code window's splitter bar such that the pointer remains an arrow, and is not an I-beam pointer or splitter pointer. Clicking now fails to shift the focus to the code window. You can click anywhere else in the code window and the code window will correctly become the active window. Note that the "splitter bar" (the horizontal border just above the editing area and just above the vertical scroll bar) allows you to split the code window into two parts, which allows you to view two different sections of code at once. Title: Why Output Might Not Display from VB Form_Load Procedure Document Number: Q71101 Publ Date: 22-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Any graphics or output done within a Form_Load procedure will not display on the form unless you first make the form visible with the Form1.Show method or if you set the form's AutoRedraw property to be true (non-zero). This information applies to Microsoft Visual Basic Programming System version 1.0 for Windows. More Information: When the Form_Load procedure executes (at the beginning of the program), by default the form is not yet displayed. Therefore, during the Form_Load event, no graphics are displayed to the nonexistent form unless you first Show the form (at run time) or set the form's AutoRedraw property (at design time or run time). A better approach to drawing graphics to the form is to have the graphics drawn to the form during a Sub Form_Paint procedure. This allows the Form.AutoRedraw property to be set to FALSE, increasing the speed performance of your program. Visual Basic does not have to refresh the screen image of your form as it does when a form is overlapped with another window. You (as the programmer) are responsible for refreshing the form, and Sub Form_Paint is the most logical place to handle this situation. Listed below are three examples of drawing graphics to your form. The first example shows how the graphics fail to be displayed to the form when drawn from within a Form_Load event procedure. The second example shows how you could draw a circle to the form, but the Form.AutoRedraw property must be set to TRUE for the circle to be retained in the event the form needs to be refreshed. The third example is the best approach; it is the fastest and most efficient of the three. For each example below, add the following Function procedure as a code procedure to Form1. Function Minimum! (n1!, n2!) If n1! < n2! Then Minimum! = n1! Else Minimum! = n2! End If End Function Example 1 --------- No graphic is displayed to the form in the following: Sub Form_Load Row = Form1.ScaleHeight / 2 Col = Form1.ScaleWidth / 2 Radius = Minimum(Row, Col) ' Function that returns smaller number. Form1.Circle (Col, Row), Radius End Sub Example 2 --------- This example will work, but the AutoRedraw property of Form1 must be TRUE for the screen to refresh properly: Sub Form_Load Form1.Show Form1.AutoRedraw = -1 Row = Form1.ScaleHeight / 2 Col = Form1.ScaleWidth / 2 Radius = Minimum(Row, Col) ' Function that returns smaller number. Form1.Circle (Col, Row), Radius End Sub Example 3 --------- This is the best example. AutoRedraw should be set to FALSE for better speed and efficiency. Sub Form_Paint Row = Form1.ScaleHeight / 2 Col = Form1.ScaleWidth / 2 Radius = Minimum(Row, Col) ' Function that returns smaller number. Form1.Circle (Col, Row), Radius End Sub Title: After Access (ALT+) Key, First Input to Combo Box Is Ignored Document Number: Q73040 Publ Date: 17-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: MS-DOS Summary: In Microsoft Visual Basic version 1.0, if a combo box has the focus and you use an access key (ALT + another key) to set the focus to another object, and you then give the focus back to the combo box (either by tabbing or using the mouse), then the next text key you enter into the combo box will be ignored. Microsoft has confirmed this problem in Microsoft Visual Basic version 1.0 programming system for Windows. We are researching this problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. Start Visual Basic. 2. On a form, create a combo box and a command button. 3. Change the caption property of the command button to "&Command1". This makes ALT+C the access key for Command1. 4. Run the application. Note that when you type ALT+C and then reset the focus back to the combo box, either with the mouse or by using the TAB key, the next key you press to enter text in the combo box will be ignored. This problem occurs for both drop-down and simple combo boxes, styles 0 and 1. Title: Procedure Name Remaining in Procedure Combo Box After Deletion Document Number: Q73653 Publ Date: 18-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: If you delete the SUB and END SUB (or FUNCTION and END FUNCTION) lines in a user-defined procedure and leave one or more blank lines in that procedure's code window, the procedure name remains in the combo box containing the procedure names (hereafter referred to as the procedure combo box). Also, if you delete the SUB and END SUB lines for a standard Visual Basic event procedure and you leave one or more blank lines, the code will remain blank for that procedure instead of returning to the standard SUB and END SUB syntax for that event. Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. From the File menu, select New Project (ALT, F, N). 2. Double-click on the default form (Form1). 3. From the General Declarations section of Form1, do the following: a. Type "Sub MySub" (without the quotation marks) and press ENTER. b. Insert a least one blank line between the SUB ... END SUB statements. c. Delete just the statements Sub MySub () and End Sub, and leave at least one blank line between them. The procedure name MySub will still appear in the procedure combo box; however, when you switch to the code window for the procedure, it will appear to be empty. The blank line that was added in step 3.b. above will still be present. To remove the procedure name MySub from the procedure combo box, delete all of the blank space within the code window. Title: Comments and Blank Lines Increase Size of VB 1.0 .EXE File Document Number: Q73697 Publ Date: 17-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Each line containing blank space or a comment in any code window of a Visual Basic application adds 2 bytes to the size of the compiled executable file (.EXE). This is not a problem with Visual Basic, but rather it is part of Visual Basic's design. This information applies to the Visual Basic programming system version 1.0 for Windows. More Information: The 2 byte overhead for each line containing blank space or a comment is generated as part of the pseudo-code for the application in the VB.EXE development environment. The program is run in "interpreted mode" based on this pseudo-code. Because an .EXE program is generated based on this pseudo-code (in other words, Visual Basic does not use a compiler and linker), the 2 byte overhead is copied to the .EXE program. The only workaround for this behavior is to remove comments and blank lines before compiling the Visual Basic project. Title: Cannot Tile or Cascade Programs Created with Visual Basic Document Number: Q73698 Publ Date: 17-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Applications that have been created with Microsoft Visual Basic 1.0 do not tile or cascade as do other Windows applications. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: Visual Basic creates applications that are pop-up windows. This window style does not respond to the tile or cascade message sent from the Windows 3.0 Task List or other applications that support the cascade and tile features. You can verify this action by launching two applications created in Visual Basic, then bringing up the Windows Task List by pressing CTRL+ESC, and from the Task List choosing either the Cascade or Tile button. Notice that nothing has changed in the arrangements of these two Visual Basic application windows. You may have expected the Visual Basic application windows to cascade or tile as other Windows applications do, but they will not do so. Title: Some VB.EXE Main Menu Commands Can Be Invisible at Run Time Document Number: Q73699 Publ Date: 17-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: If you shrink the width of VB.EXE's main menu (and Properties Bar) such that menu commands automatically wrap to the next line, wrapped menu commands may be invisible at run time in the VB.EXE environment. You can work around this visibility problem by using the ALT key to access the invisible menu commands on the shrunken menu, or by avoiding shrinking the width beyond the point where the menus wrap. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: Steps to Reproduce Problem -------------------------- 1. Start Visual Basic (VB.EXE). 2. Place the mouse pointer on the far right side of the Properties Bar such that the mouse changes to a double-headed pointer, ready for resizing the Properties Bar. 3. Press and hold down the left button of the mouse and drag the right edge of the Properties Bar toward the left side of the screen so that the Bar ends up being about 3 inches in width, then release the mouse button. This should cause the Window and Help menu commands to automatically wrap the next line. 4. From the Run menu, choose Start, or press F5. The Window and Help menus are now invisible because they are wrapped beyond the edge of their window. 5. Click on the Immediate Window (in the lower right corner) and bring the Immediate Window in front of the Form1 window. 6. Try bringing up the either the Window menu by pressing ALT+W or the Help menu by pressing ALT+H. You will see the appropriate menu on the screen, but it will appear disconnected below the Main Menu (or Properties Bar) even though the menu is still functional. If you don't perform step 5, you won't be able to select the invisible menus with the ALT key (or with the mouse). This behavior is due to the way that Windows 3.0 manipulates menus and the design of the Microsoft Visual Basic 1.0 interface. To avoid this behavior, Microsoft recommends keeping the main menu sufficiently wide such that menus are not wrapped. Title: TABs Paste Incorrectly as ] to VB.EXE's Immediate Window Document Number: Q73700 Publ Date: 17-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: TAB characters may Paste (from the Windows Clipboard) incorrectly into the Immediate Window in Microsoft Visual Basic version 1.0. (TAB characters may incorrectly Paste as pipe []| symbols.) Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.00 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. From Windows 3.0, run NOTEPAD.EXE and enter the following text: a a This will be displayed in the following format: a a 2. Select the text with the mouse and choose Copy from Notepad's Edit menu to copy the text to the Windows Clipboard. 3. Start Visual Basic and press F5 to run the blank program (or from the Run menu, choose Start). 4. Break the program by pressing CTRL+BREAK, then click the mouse on the Immediate Window. 5. Press SHIFT+INSERT to enter the selected text into the Immediate Window. Observe that the Immediate Window incorrectly displays the following text: a]a instead of displaying the following: a a 6. If you end the program (by choosing the End command from the Run menu), you will be able to successfully paste (SHIFT+INSERT) the correct text into any code window: a a Title: How to Optimize Size and Speed of Visual Basic Applications Document Number: Q73798 Publ Date: 17-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: This article describes how to optimize size and speed for applications in Microsoft Visual Basic programming system version 1.0 for Windows. More Information: Below are guidelines to help increase speed, available resources, available RAM, and available disk space in Visual Basic: Increase Speed -------------- - Preload forms. - Store graphics as bitmaps. - Place debug routines in a separate module. - Use dynamic link library (DLL) routines. Increase Available Resources ---------------------------- - Create simulated controls using a graphic object. - Draw graphics images during run time. Increase Available RAM ---------------------- - Use Integer variables instead of Single variables. - Create dynamic arrays to free arrays when not needed. - Drop/unload controls and forms when not needed. - Use local variables. Increase Disk Space ------------------- - Build controls at load time. - Minimize header size. - Delete unnecessary functions and subroutines. - Delete unused objects and associated methods. Title: No Edit Menu Access for Property Entry; Use Edit Shortcut Keys Document Number: Q73800 Publ Date: 17-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The following information applies to Microsoft Visual Basic programming system version 1.0 for Windows. The Properties Bar entry window was not designed to handle the Edit menu commands (such as Cut, Copy, Paste, and Undo) when chosen with the mouse. The Edit menu commands affect the controls on the form, not the Properties Bar entry window (even if you first select text in the Properties Bar entry window before choosing the Edit menu with the mouse). Instead of choosing Edit commands with the mouse, you can select the desired text in the Properties Bar entry window and use the Edit shortcut keys, as follows: Command Shortcut Keys ------- ------------- Cut SHIFT+DELETE Copy CTRL+INSERT Paste SHIFT+INSERT Undo ALT+BACKSPACE (NUM LOCK needs to be off if you select the DELETE or INSERT key from the numeric keypad.) More Information: Example: Edit Menu Cannot Affect Properties Bar Entry Window ------------------------------------------------------------ 1. Start Visual Basic. 2. From the File menu, choose New Project. 3. Double-click on a label box from the Toolbox (symbolized by a capital A in script). This should display a label box on the form. 4. With the mouse, select the text fragment "Lab" from the "Label1" Caption in the Properties Bar entry window, and choose Copy from the Edit menu. Note: While you may have thought you just copied "Lab" into the Clipboard, you actually copied the entire Label1 control (from the form) into the Clipboard. Clicking the Edit menu anywhere outside the Properties Bar entry window causes the focus to revert back to the Label1 control on the form. 5. Click on the "Form1" text appearing in the Properties Bar entry window to set the focus there. 6. From the Edit menu, choose Paste (again, clicking the Edit menu or anywhere outside the Properties Bar entry window causes the focus to revert back to the Label1 control on the form.) This causes the following message box: "You already have a control named 'Label1'. Do you want to create a control array?". Select either the Yes or No command button. Notice that another copy of the Label1 box will appear in the upper left corner of the form. Instead of choosing Edit commands with the mouse, you can select the desired text in the Properties Bar entry window and use the Edit shortcut keys. For example, you can select text in the Properties Bar entry window, then press CTRL+INSERT (while NUM LOCK is off) to copy text to the Clipboard. You can press SHIFT+INSERT to paste Clipboard text into the Properties Bar entry window. You can press ALT+BACKSPACE to Undo a Cut, Copy, or Paste. Title: Visual Basic Applications Cannot Act as Windows Shell Document Number: Q73801 Publ Date: 17-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: An application created by Visual Basic cannot be used as the Windows shell. Attempting to run an application as the Windows shell results in a Windows "Unrecoverable Application Error" (UAE) message. This is expected behavior when attempting to run a Visual Basic application as the Windows shell. This is not a problem with Visual Basic, but rather a design limitation. This information only applies to Visual Basic .EXE programs. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: A user-defined shell application can be specified in the Windows system initialization (SYSTEM.INI) file. The default shell is PROGMAN.EXE, or the Program Manager. If a Visual Basic program is specified as the customized Windows shell, a Windows UAE will occur on an attempt to run Windows from the DOS command line. A Visual Basic application cannot be run as the Windows shell because it does not contain the special set of startup code required by a Windows shell application. The only way to create a Windows shell application is to use the C Compiler and the Windows Software Development Kit (SDK) to write a non-Visual Basic application. Steps to Reproduce Problem -------------------------- Warning: The following steps require changing the Windows system initialization file (SYSTEM.INI) in a manner such that Windows will not run successfully unless the file is restored from DOS. The file can be restored from DOS by using a backup copy of the SYSTEM.INI file or by restoring the SYSTEM.INI file with a text editor from DOS. 1. Start Visual Basic. 2. From the File menu, choose New Project. 3. From the File menu, choose Make .EXE program. 4. Choose OK to select Project1.EXE as the .EXE filename. 5. Exit Visual Basic. 6. Start Windows Notepad. 7. From the File menu, choose Open. 8. In the Filename text box, type "c:\windows\system.ini" (without the quotation marks) or the path and filename of the SYSTEM.INI file on your system. 9. Choose OK. 10. Change the line the reads "shell=progman.exe" to "shell=c:\vb\project1.exe", or the appropriate path to the file created in step 4 above. 11. From the File menu, choose Save. 12. Exit Notepad. 13. From the Windows Program Manager File menu, choose Exit (you should exit back to DOS). 14. At the DOS prompt, run Windows. When you attempt to run Windows, a UAE will occur. You will need to reboot your computer and modify the SYSTEM.INI with a text editor from DOS such that the line "shell=c:\vb\project1.exe" appearing in the SYSTEM.INI is changed back to "shell=progman.exe". Title: Deleting VB Control Moves Associated Code to Object: (General) Document Number: Q73808 Publ Date: 17-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When you delete a control in the Visual Basic environment, the code that you wrote for that control is not deleted, but is instead moved to the Object: (General) area for code. Some programmers may not realize that these detached (unused) procedures still exist and consume memory. The detached code is available for calling, copying, or reuse. For example, when you add a control that shares the same name as a detached procedure, the detached event procedure reassociates with that control. If you want to delete both the control and its associated code, you need to manually select and delete the code in each event procedure for that control in addition to deleting the control itself. This behavior is by design in Microsoft Visual Basic programming system version 1.0 for Windows. More Information: The following example demonstrates that your code goes into the Object: (General) area after you delete the associated control (or object): 1. From the File menu, choose New Project. 2. Double-click on a command button from the Toolbox. This puts a Command1 button on your form. 3. Double-click on the Command1 button. This brings up the code window for the Command1_Click event procedure. 4. Enter the following code inside the Command1_Click procedure: Sub Command1_Click() Print "Hello" 'Enter this statement End Sub 5. Press F5 to run your code. Click on the Command1 button to see the text "Hello" display on Form1 in the upper left corner. From the Run menu, choose End to stop the program. 6. Click on the Command1 button on Form1 to set the focus there and either press DELETE or choose the Delete command from the Edit menu. This deletes the Command1 button from the form. At this point, some programmers may incorrectly assume that the code associated with the Command1 button was also deleted. Actually, the code associated with any deleted object is automatically moved into the Object: (general) area of the Code window for that form. You can find the detached procedures in the Code window by choosing (general) from the Object: box, and choosing the procedures from the Proc: box. (Click on the DOWN arrow symbol on the right of the Object: and Proc: boxes to see your choices.) Title: Pull-Down on Drive Box Disabled if Width Changed at Run Time Document Number: Q73809 Publ Date: 17-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: If you change the Width property of a drive list box at run time, the pull-down list of drives will no longer work. Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. Microsoft is researching this problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. Start Visual Basic. Form1 will automatically display. 2. Put a drive list box on Form1. 3. In the Click event of Form1, add the following code: Sub Form_Click () Drive1.Width = Drive1.Width * 2 End Sub 4. Run the application (press F5). 5. Click on the down arrow on the drive box to display the list. 6. Choose a drive; everything works as it should. 7. Click on Form1; the width of the drive box changes. 8. Click on the down arrow on the drive box. Note that the list fails to display. Title: Scroll Box Flashing Not Updated if Bar Resized with Focus Document Number: Q73839 Publ Date: 17-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: There is a Microsoft Windows version 3.0 problem updating the flashing indicator for the scroll box on a vertical scroll bar. This Windows problem affects vertical scroll bars in Microsoft Visual Basic programming system version 1.0 for Windows. This article describes how to work around the problem. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: Steps to Reproduce Problem -------------------------- 1. Start Visual Basic and place a vertical scroll bar on a form. 2. Place the following code in the Form_Click event procedure: Sub Form_Click () VScroll1.Height = VScroll1.Height * 2 End Sub 3. From the Run menu, choose Start, or press F5 to run the example. 4. Click and drag the flashing scroll box (on the scroll bar) to the middle (down from the top). 5. Click on the form to execute the Form_Click procedure, which doubles the height of the scroll bar. Observe that the scroll box correctly moved to the middle of the longer scroll bar, but the flashing indicator failed to also move. You can work around the problem by doing the following: 1. In step 2 above, add additional code so that the Form_Click procedure appears as follows: Sub Form_Click () Const True = -1, False = 0 VScroll1.Height = VScroll1.Height * 2 VScroll1.Enabled = False VScroll1.Enabled = True End Sub 2. Follow the directions for steps 3, 4, and 5 above. You should notice that the problem no longer exists. The flashing has been updated correctly in the same position as the scroll box. Microsoft has confirmed this to be a problem with Windows 3.0 (buglist3.00). We are researching this problem and will post new information here as it becomes available. Title: UAE Changing Text1.Text or Label1.Caption in Form_LinkClose Document Number: Q74293 Publ Date: 18-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Running a Visual Basic application under the following conditions will result in a Windows Unrecoverable Application Error (UAE) message: 1. A DDE (dynamic data exchange) conversation has been established with another application where Visual Basic is the server (for example, another application such as Microsoft Excel for Windows initiates the DDE conversation.) 2. The Text, Picture, or Caption property of a Textbox, Picture, or Label is set within the LinkClose event procedure of a form. The problem occurs for a program run in the Visual Basic development environment or run as an .EXE program. The problem does not occur if the Visual Basic application acts as the client (that is, initiates the conversation) in a DDE conversation. Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: The problem occurs any time a control capable of DDE is changed within the LinkClose event procedure of a form. Changing a control capable of DDE causes Visual Basic to check all valid links. Because the LinkClose event is incorrectly called before the DDE channel has been fully deleted, Visual Basic treats the "partially" closed channel as a valid link. A Windows UAE is generated as a result of Visual Basic checking this invalid link. To work around this problem, do the following: 1. Add a Timer control to the form. 2. Remove the code from the LinkClose event of Form1 and replace it with: Sub Form_LinkClose () Timer1.Enabled = -1 Timer1.Interval = 10 End Sub 3. Add the following code to the Timer event of Timer1: Sub Timer1_Timer () Label1.Caption = "new caption" 'or Text1.Text = "new text" if using text box Timer1.Enabled = 0 End Sub When this is run and a LinkClose event occurs, the LinkClose event will be allowed 10 milliseconds to finish, after which the desired code will be executed (in the timer event) with no UAE. Steps to Reproduce Problem -------------------------- 1. Start Microsoft Word for Windows (WINWORD.EXE). 2. From the Macro menu, choose Edit. 3. Type "autoexec" (without the quotation marks) as the name of the macro you want to create, and press ENTER. 4. Add the following lines of code: Sub MAIN 'sets up DDE link with VB ChanNum = DDEInitiate("uaetest","form1") Print ChanNum 'To confirm that link has been established End Sub 5. Exit Word for Windows and save all changes as you are prompted. 6. Start Microsoft Visual Basic (Form1 will automatically be created by default). 7. Put a label box on Form1 (or a text box on Form1). 8. Add the following code to the LinkClose event of Form1: Sub Form_LinkClose () Label1.Caption = "new caption" ' or Text1.Text = "new text" if using TextBox End Sub 9. From the File menu of Visual Basic, Save the file as Uaetest.Frm. 10. From the File menu of Visual Basic, Save the project as Uaetest.Mak. 11. Run Uaetest. 12. Start Windows. It will automatically run the macro to establish the DDE link. This can be confirmed by the number 1 showing up on the status line in Word for Windows. 13. Exit Word for Windows. 14. A UAE message will be displayed. Title: Problem Clicking Properties List Box on Maximized Form Document Number: Q74336 Publ Date: 22-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: At design time in the Microsoft Visual Basic (VB.EXE) environment, you cannot assign properties to controls on a form that is maximized unless the Code window is also displayed. The general problem is that if you press the ALT key to activate the Properties bar over a form of any size, you cannot access the Properties list box unless the Code window is currently in front of the form. Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: To work around the problem, put the Code window in front of the form (this can be done by double-clicking a control), then you can access the Properties list box and Settings box with the mouse. As an alternative, when the form is not maximized and when the Properties bar is at least partially visible, you can activate the Properties bar with the mouse instead of with the ALT key. Steps to Reproduce Problem -------------------------- 1. From the File menu, choose New Project. 2. Optionally, add any control (such as a picture box) to Form1. 3. Click the maximize button (in the upper right corner) on Form1 such that it fills the entire screen. 4. Press the ALT key to display the Properties bar. You now can correctly use the arrow keys or mouse to pull down the menus and choose commands from the main menu. The problem is that if you try to click on the Properties list box, the entire main menu disappears, preventing you from changing properties. Title: Spaces Can Make Words Wrap Too Soon in Windows Label Control Document Number: Q74337 Publ Date: 22-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Embedded spaces can cause words to wrap too soon within a label box in Microsoft Visual Basic programming system version 1.0 for Windows. The problem is not with Visual Basic, but rather with Windows. Microsoft has confirmed this to be a problem in Windows version 3.0 (buglist3.00). We are researching this problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. From the File menu, choose New Project. 2. Draw a label box on the form starting from the left side of the form. 3. Set the width property of the label to 6975 twips (twips is the default scale mode). 4. Set the height property of the label to 495 twips. 5. From the Properties list box, choose the Caption property for the Label1 box. Enter the following caption in the Settings box, typing 10 spaces between digits instead of the ... (ellipses) shown: 1...2...3...4...5...6...7...8...9 As you can see, the 9 is incorrectly placed on the next line of the label box, even though more than enough room exists to place the entire caption in one line. You can correct this problem by changing the width of the label to 7095 twips or more. Title: File, List Controls 2 Pixels High at Design Time (Grid Align) Document Number: Q74347 Publ Date: 19-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When the "Align to grid" option is on, Visual Basic's list box and file list box controls may not assume the correct minimum height when you draw them shorter than two grid lines at design time. This can result in a list box or file list box control that appears only 2 pixels (30 twips) high at design time. Visual Basic automatically resizes other controls to the minimum height if they were drawn too short. Microsoft has confirmed this to be a problem with Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. The problem is not serious, because simply running the program causes the control to correctly resize to the default minimum height. More Information: Steps to Reproduce Problem -------------------------- 1. Start Microsoft Visual Basic. From the Edit menu, choose Grid Settings and activate (check) the "Align to grid" option. 2. Click on the list box control, or file list box control, in the Toolbox. 3. Click on Form1 and drag the mouse across the form horizontally without moving the mouse vertically. 4. Release the mouse button, and the control will fail to be resized to the default minimum height (two grid lines). The control may be as small as 2 pixels (30 twips) high. Note that running the program causes the control to correctly resize to the default minimum height (two grid lines). Title: F5 in Run Mode with Focus on Main Menu Bar Acts as CTRL+BREAK Document Number: Q74348 Publ Date: 19-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: A Visual Basic program will break at run time under the following simultaneous conditions: 1. You run the program in the Visual Basic development environment. 2. The Visual Basic menu bar has the focus. 3. You press F5. The program will break when the F5 key is pressed and the Immediate Window will get the focus. This is not a problem with Visual Basic, but rather a design feature. This information only applies to an application run in the Visual Basic development environment, not as an .EXE program. This information applies to Visual Basic programming system version 1.0 for Windows More Information: The F5 key acts as the shortcut key for the Visual Basic Run menu. Because Start, Continue, and Break all share the same menu item under the Run menu, F5 acts differently depending upon the state of execution of a program. It acts as the Run key in the Visual Basic 1.0 environment. It also serves as the Break key once the application is running and the focus is on the Visual Basic menu bar. After execution has been "broken" with the break key, the F5 key serves as the Continue key. To demonstrate the different modes of the F5 key, do the following: 1. Run Visual Basic. 2. From the File menu, select New Project (ALT, F, N). 3. Press F5 to run the program. 4. Using the mouse, click on the Visual Basic menu bar. 5. Press F5 to break the program. The Immediate window will be given the focus after you press F5. 6. Press F5 again to continue execution of the program. Title: VB Syntax Error Appending : Lines to Sub or Function Statement Document Number: Q74407 Publ Date: 19-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: A syntax error may occur when a Sub or Function statement is followed by another statement on the same line, even when separated by a colon (:). Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: To illustrate the problem, type the following code onto a single line within a Code window: Sub Foo() : Print "Hello, World" : End Sub An "Invalid outside Sub or Function" error occurs when you move the cursor from this line. If the Sub procedure Foo() already exists, Sub Foo() End Sub then you can add code after the procedure heading, Sub Foo(), if separated by a colon, as follows: Sub Foo() : Print "Hello World" End Sub Although it is possible to use more than one statement on the same line with a procedure heading, Microsoft does not recommend this. A procedure heading should always be on a line by itself. Title: "Path Not Found: 'T:'" if Hyphen Precedes Directory Name Document Number: Q74408 Publ Date: 19-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The error message "Path not found: 'T:'" will occur if you try to open a project with a directory name that is preceded with a hyphen (for example, -TEST) in Microsoft Visual Basic programming system version 1.0 for Windows. The problem is due to the way Windows 3.0 interprets directories with the Windows API function DlgDirSelect. The following example reproduces the problem. Steps to Reproduce Problem -------------------------- 1. Create a temporary directory named -TEST (a hyphen followed by TEST) in your Visual Basic directory. 2. Start Visual Basic. From the File menu, choose Open Project. 3. You should be able to see the "-TEST" directory in the list box. Try selecting or clicking on that directory. The error message "Path not found: 'T:'" will be displayed. Microsoft has confirmed this to be a problem in the Windows 3.0 operating environment (BUGLIST3.00). We are researching this problem and will post new information here as it becomes available. Title: Mouse Pointer Disappears in Code Window if ESC or CTRL+BREAK Document Number: Q74409 Publ Date: 19-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: In Microsoft Visual Basic, the mouse pointer fails to be displayed if you press ESC or CTRL+BREAK within the Code window. (The mouse pointer correctly reappears if you move the mouse.) Microsoft has confirmed this to be a problem with Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. Start Visual Basic with a New Project. 2. Double-click on the form to bring up the Code window. Notice the I-beam mouse pointer within the Code window. If you place the mouse pointer outside of the Code window, you will see the I-beam change to an arrow. 3. Place the mouse pointer back in the Code window to display the I-beam pointer. Press either the ESC key or the key combination CTRL+BREAK. The I-beam mouse pointer will temporarily disappear. 4. The pointer will be redisplayed if you move the mouse. Title: Saving VB Project Changes Design-Time WindowState Property 1,2 Document Number: Q74446 Publ Date: 22-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: In the Properties list box, setting the WindowState property of a form to either "1 - Minimized" or "2 - Maximized" at design time incorrectly displays "0 - Normal" after you run the program. When you run the application again, your last WindowState setting (1 or 2) is correctly remembered, even though the Properties list box incorrectly displays "0 - Normal". However, if you save the project, the value for the WindowState property (1 or 2) will be forgotten, and will incorrectly return to "0 - Normal". Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching the problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. In the Properties list box, change the WindowState property of a form to "1 - Minimized" or "2 - Maximized". 2. From the Run menu, choose Start. 3. From the Run menu, choose End. Notice that the WindowState property in the Properties list box incorrectly displays "0 - Normal". 4. When you run the program again, the Form1 will correctly be minimized (1) or maximized (2), showing that the value for WindowState is remembered. 5. If you save the project and run again, the value set for the WindowState property is incorrectly reset to "0 - Normal". To work around this problem, you can set the WindowState property in the Form_Load event procedure (instead of setting WindowState in the Properties list box at design time). If you place the following line of code in the Form_Load event procedure, the application will always start up maximized: WindowState = 2 ' 0=normal window; 1=minimized; 2=maximized Title: "Unresolved External" Attempting to Use CDK VBDirtyForm() Document Number: Q74338 Publ Date: 25-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The VBAPI routine VBDirtyForm() is documented within Visual Basic's add-on Control Development Kit (CDK) and is defined with the CDK Header file, VBAPI.H. However, the LINK.EXE error "Unresolved external" occurs when linking your DLL if you attempt to use this function, because VBDirtyForm() does not actually exist. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. Microsoft has confirmed this to be a problem and will post additional information here as it becomes available. More Information: The functionality of VBDirtyForm() can easily be achieved using VBSetControlProperty() to assign a value to any property that has been defined with the property flags of PF_fSaveData and/or PF_fSaveMsg. When a property is assigned a value that was defined with one or both of the property flags, PF_fSaveData or PF_fSaveMsg, VB.EXE takes care of writing the property value to disk when the form is saved, and is made aware of any changes made to any property of any control or the form itself. Thus, VB.EXE knows to save the form when exiting or opening a new project. Title: WINAPI.TXT: Windows API Declarations and Constants for VB Document Number: Q73694 Publ Date: 29-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The file WINAPI.TXT supplies declarations for Microsoft Visual Basic programmers who want to call Windows API routines. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. WINAPI.TXT can be found in the Software/Data Library by searching on the word BV0447, the Q number of this article, or S13104. BV0447 was archived using the PKware file-compression utility. After you decompress BV0447, you will obtain the following two files: WINAPI.TXT README.NOW WINAPI.TXT is provided here in the assumption that you already have a reference for Windows API calls, such as the documentation provided with the Microsoft Windows Software Development Kit (SDK). If you don't have a reference manual for Windows API calls, you can obtain the Visual Basic add-on kit number 1-55615-413-5, "Microsoft Windows Programmer's Reference" and Online Resource (which includes WINAPI.TXT on disk), available at a charge from Microsoft. More Information: WINAPI.TXT can be found on CompuServe in the MSLANG forum (GO MSLANG), as well as in the Microsoft Software Library on CompuServe. Contents of README.NOW ---------------------- WINAPI.TXT is an ASCII text file containing the functions and constants in the Microsoft Windows 3.0 API, declared in the format used by Microsoft Visual Basic. To use WINAPI.TXT, you must have the book "Microsoft Windows Programmer's Reference" for Windows version 3.0 (published by Microsoft Press, 1990), or you must have the reference manuals provided with the Microsoft Windows SDK. WINAPI.TXT includes the following: - External procedure declarations for all the Microsoft Windows API functions that can be called from Visual Basic. - Global constant declarations for all the constants used by the Microsoft Windows API. - Type declarations for the user-defined types (structures) used by the Microsoft Windows API. WINAPI.TXT is too large to be loaded directly into a Visual Basic module. Attempting to load it directly into Visual Basic will cause an "Out of Memory" error message. WINAPI.TXT is also too large for the Notepad editor supplied with Microsoft Windows, but it can be loaded by Microsoft Write. To use WINAPI.TXT, load it into an editor (such as Microsoft Write) that can handle large files. Copy the declarations you want and paste them into the global module in your Visual Basic application. Note: Some of the Windows API declarations are very long. Some editors will wrap these onto a second line, and will copy them as multiple lines rather than a single line. Declarations in Visual Basic cannot span lines, so if you paste these as multiple lines, Visual Basic will report an error. If an error occurs, you can either adjust the margins in the editor before copying or remove the line break after pasting. The global module is the recommended place for the declarations that you copy from the WINAPI.TXT file; however, you can place the external procedure declarations in the Declarations section of any form or module. You can also place the constant declarations anywhere in any module or form code if you remove the Global keyword. Type declarations must be placed in the global module. Once you have pasted the declaration for a Windows API routine (as well as any associated constant and type declarations) into your application, you can call that routine as you would call any Visual Basic procedure. For more information about declaring and calling external procedures, see Chapter 23, "Extending Visual Basic," in "Microsoft Visual Basic: Programmer's Guide." Warning ------- Visual Basic cannot verify the data you pass to Microsoft Windows API routines. Calling a Microsoft Windows API routine with an invalid argument can result in unpredictable behavior: your application, Visual Basic, or Windows may crash or hang. When experimenting with Windows API routines, save your work often. Title: "Overflow" Printing Too Large a String to Form or Printer Document Number: Q74517 Publ Date: 29-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: An "Overflow" error message may occur when you print a long string in Microsoft Visual Basic. When a character is printed using the Print method, the CurrentX and CurrentY coordinates are also updated for the object being printed to. If the string being printed is long enough to cause the value of the CurrentX property to exceed 32,767 twips, an "Overflow" error will occur. This behavior is by design. "Overflow" can be caused by printing a single long string or by repeatedly printing shorter strings that are appended onto the end of the last string (using the Visual Basic semicolon (;) operator). This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: Steps to Reproduce Problem -------------------------- 1. Start Visual Basic or choose New Project from the File menu. 2. Place a label control on Form1. 3. Add the following code to the Form_Click event: Sub Form_Click() For index% = 1 to 1000 Print "A"; Label1.Caption = Str$(CurrentX) Next End Sub 4. From the Run menu, choose Start. 5. Click on Form1. An "Overflow" error will occur. You can examine the label caption to see that the value of Form1.CurrentX plus the TextWidth of "A" exceeded 32767 at the time of the error. Title: No Beep when You Click on Form while Menu Design Window Is Up Document Number: Q74518 Publ Date: 29-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The Menu Design window, used to create pull-down menus for your Visual Basic form(s), is a modal dialog box. Because the Menu Design window is a modal dialog box, clicking on any other Visual Basic window when the Menu Design window is visible should fail to transfer the focus and should generate a beep to notify you that you cannot act outside the dialog box. However, clicking on the Visual Basic form for which the Menu design window is opened does not generate a beep. All other Visual Basic windows, such as the ToolBox, Color Palette, Project Window, and main Visual Basic menu bar all respond with a beep when the Menu Design window is active. Focus is maintained by the Menu Design window in both cases. Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. Title: Control Overlaid by Another Control Fails to Refresh if Moved Document Number: Q74519 Publ Date: 29-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Visual Basic does not support overlapping controls. Having overlapping controls can result in portions of a control not refreshing correctly. If controls are moved over each other, then one or both of the controls may not correctly refresh even when the controls are moved apart. This is known to happen when controls are resized at run time using the Move method or by changing the Height and Width properties as a result of a Form_Resize event. Because controls must be resized one at a time, it is possible that one control will briefly overlap another control during the resize process at run time. The control that was briefly overlapped may not refresh properly. An example of this behavior is given further below. This behavior can be improved by performing the Refresh method (CtrlName.Refresh) on every overlapping control at run time, after an overlapped control has been moved or after a form that contains overlapping controls has been resized. This is not a problem with Visual Basic, but the nature of overlapping controls under Visual Basic. This behavior occurs at run time in the Visual Basic development environment or as an .EXE program. This information applies to the Visual Basic programming system version 1.0 for Windows. More Information: For more information about Visual Basic and overlapping controls, query in this knowledge base on the following words: overlapping and controls and Visual and Basic Steps to Reproduce Problem -------------------------- 1. From the File menu, choose New Project (ALT, F, P). 2. Add a picture control (Picture1) to the default form (Form1). 3. Add a command button (Command1) to Form1. 4. Add a vertical scroll bar (VScroll1) to Form1. 5. Using the mouse, double-click on Form1 to bring up the code window. 6. Within the Resize event procedure of Form1, add the following code: Sub Form_Resize () Picture1.Move 0, 0, ScaleWidth - VScroll1.Width, _ ScaleHeight - Command1.Height VScroll1.Move ScaleWidth - VScroll1.Width, 0, _ VScroll1.Width, ScaleHeight - Command1.Height Command1.Move 0, ScaleHeight - Command1.Height, _ ScaleWidth, Command1.Height End Sub Note: The underscores (_) in the above code example indicate that the line should be concatenated with the next line in the Visual Basic environment (VB.EXE). 7. Run the program. 8. Using the mouse, resize the form by extending the bottom or right sides. When the bottom edge of the form is extended, the command button (Command1) will not refresh. When the right edge of Form1 is extended, the scroll bar will not refresh. The refresh problems are caused because Picture1 is expanded and temporarily overlaps the control. When the control (VScroll1 or Command1) is moved out of the way, it is not refreshed. To work around this behavior, use the Refresh method for Picture1, VScroll1, and Command1 after the controls have be moved. Add the following statements to Sub Form_Resize (after the Command1.Move statement) above to overcome the behavior: Picture1.Refresh VScroll1.Refresh Command1.Refresh Title: Incorrectly Accessing System Menu of Hidden Form Document Number: Q74564 Publ Date: 29-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: It is possible under certain circumstances to incorrectly access the system menu of a hidden form in Visual Basic. Steps to Reproduce Problem -------------------------- 1. Start Visual Basic or choose New Project from the File menu. 2. Set the WindowState property of Form1 to 1 (minimized). 3. Enter the following line of code in the Form_Resize event procedure of Form1: If WindowState = 2 Then Hide 'WindowState 2 = maximized 4. From the Run menu, choose Start. 5. Click on the Form1 icon to bring up the system menu for Form1. 6. From the the Form1 system menu, choose Maximize. Form1 will maximize and then hide. 7. Press ALT+SPACE to activate the Form1 system menu. A system menu will appear in the upper left corner of the screen, even though Form1 is hidden. Microsoft has confirmed this to problem with Microsoft Visual Basic programming system 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. Title: Incomplete Path Causes "Insufficient Disk Space" During Setup Document Number: Q74646 Publ Date: 29-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: You may receive an "Insufficient disk space on: XXX" error message when running the Microsoft Visual Basic version 1.0 Setup program if you have not specified a drive letter in your path to Windows 3.0. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: If you have a partial PATH to the Windows environment (for example, PATH=\WIN3) in your AUTOEXEC.BAT file, you may need to reset the PATH to C:\WIN3. After you reset the path, Setup should run correctly. Title: "Insufficient Disk Space" After Setup Begins to Copy Files Document Number: Q74648 Publ Date: 29-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: If you receive an "Insufficient disk space" error message when running Visual Basic's Setup program, it may be caused by using Windows with a temporary Windows swap file instead of the permanent Windows swap file. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: Pages 520 through 529 in the "Microsoft Windows User's Guide" version 3.0 manual discuss Windows swap files. Permanent swap files are contiguous so that your disk does not contain files in fragmented pieces, which may happen if you are using temporary swap files. Temporary Windows swap files may grow in size, which may cause the "Insufficient disk space" error during the execution of Visual Basic's Setup program. However, permanent Windows swap files will not change in size, so using permanent Windows swap files may help to avoid the "Insufficient disk space" error. Title: EVENTINFO Topic Correction for VB CDK VBAPI.HLP File Document Number: Q74649 Publ Date: 29-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Below is a correction to the VBAPI.HLP file provided in the Microsoft Visual Basic Control Development Kit (add-on kit number 046-050-022). In the VBAPI.HLP file, for the structure topic named EVENTINFO, a column title is incorrectly labeled "Flag Value," but should instead be labeled "Field Name." This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. Title: Visual Basic Add-on Kits: CDK, Windows Reference, 360K Disks Document Number: Q72265 Publ Date: 30-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Microsoft has developed the following add-on kits to help Visual Basic programming-system users get even more from the product. You may call Microsoft End User Sales and Service at (800) 426-9400 to order these kits (except kit no. 5 below). Please note the specific requirements for the kits: 1. "Microsoft Windows Programmer's Reference" book and Online Resource This complete reference to the Microsoft Windows API includes the following: a. A comprehensive 1152-page reference book for Windows 3.0 (published by Microsoft Press, 1990) b. Online references to each component of the Windows API in Windows Help format. Includes both 5.25-inch and 3.5-inch disks. c. WINAPI.TXT: Function, Type, and Constant declarations in Visual Basic format for nearly every Windows API function. Note: A correction for the WINAPI.TXT file dated 5/14/91 is described in a separate article in this knowledge base. To find that article, query on the following words: WINAPI.TXT and correction. d. APIXREF.HLP: Quick reference listing the value of every constant and the appropriate library for every function. Kit number: 1-55615-413-5 Price: $49.95 (plus shipping/and handling and applicable sales tax) 2. Microsoft Visual Basic Control Development Kit (CDK) This kit enables you to develop Visual Basic controls to extend the Visual Basic Toolbox to meet your specific needs. Custom controls can be placed on forms and used just like built-in controls. You determine the appearance and functionality -- including properties and events -- of each control. Includes both 5.25-inch and 3.5-inch disks. Requires: Microsoft Windows Software Development Kit (SDK) (version 3.0 or later) and Microsoft C compiler (version 6.0 or later) Note: Custom controls are written in C and require extensive knowledge of the Windows API. Kit number: 046-050-022 Price: $49.95 (plus shipping/handling and applicable sales tax) 3. Microsoft Windows Help Compiler The Windows Help system lets you provide online Help to those using your Visual Basic application. Supports hypertext links and context-sensitive Help screens, using the Windows Help engine. Includes both 5.25-inch and 3.5-inch disks. Includes a sample help file and a sample Visual Basic program (which doubles as an application to test help files). Requires: An RTF (rich text formatting) text editor, such as Microsoft Word for Windows. Kit number: 046-050-052 Price: $49.95 (plus shipping/handling and applicable sales tax) 4. Visual Basic Low-Density (360K) 5.25-inch Disks If your hardware cannot accommodate the high-density (1.2 MB) 5.25-inch disks or low-density (720K) 3.5-inch disks included in the Visual Basic programming system package, you may order low-density (360K) 5.25-inch disks for the program. Kit number: 046-050-004 Price: free (pay only shipping/handling) The following kit for Microsoft SQL Server developers includes a copy of Visual Basic (contact Microsoft On-line Sales at 1 (800) 443-4672 for more information): 5. Windows-Based Visual Basic Library and Software Development Kit (SDK) for Microsoft SQL Server Contains SQL programming libraries, a preliminary documentation set, and a copy of Visual Basic programming system. Allows Visual Basic programmers to quickly develop rich Microsoft Windows graphical client-server applications for Microsoft SQL Server. Developers can also use Visual Basic Library for SQL Server with the Database Gateway(TM) from Micro Decisionware, Boulder, Colo., to build graphical applications that tap DB2 (TM) and other IBM mainframe data sources. (Microsoft SQL Server is an intelligent client-server relational database-management system (RDBMS) for PC networks. Providing capabilities previously the exclusive domain of mainframe and minicomputer systems, Microsoft SQL Server brings high-end performance, security, and data integrity to local area networks, allowing data to be shared safely among many applications and users. Microsoft SQL Server is supported by popular networks such as Microsoft LAN Manager, Novell NetWare, and IBM LAN Server.) Visual Basic Library for SQL Server is available as a Software Development Kit. It is available directly from Microsoft for $495. Contact Microsoft On-line Sales at 1 (800) 443-4672 for sales and support information. For pricing and availability outside the U.S., please contact your local Microsoft subsidiary. The above information is accurate as of July 29, 1991, and is subject to change. Title: No Title for Project Window After Loading from Command Line Document Number: Q74677 Publ Date: 30-JUL-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: A naming problem can occur when you invoke the VB.EXE (Visual Basic) environment with a project from the Windows command line with a .FRM, .BAS, or a .VBX filename extension. If you start a project with any of these extensions, you will see an untitled Project Window displayed, and if you make any changes to that Form and try to exit Visual Basic, Visual Basic will correctly prompt you to save the changes to that Form. However, if you first select New Form to add to the Project, you will be prompted to save the forms and to save the project under a blank project name. The project name is incorrectly blank and should instead reflect the last project name. Microsoft has confirmed this to be a problem with Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. Start Visual Basic or choose New Project from the File menu. 2. From the File menu, choose Save Project As. Save the form with the name Test1.FRM and the project with the name Test1.MAK. 3. From the Visual Basic File menu, choose Exit. 4. From the Windows Program Manager File menu, choose Run. Enter the following path: C:\VB\Test1.FRM 5. Visual Basic will start with an untitled Project Window that contains the files Global.BAS and TEST1.FRM. 6. From the Visual Basic Run menu, choose Exit. Note that if you make any changes to Test1.FRM and try to exit Visual Basic, the message "Save changes to 'TEST1.FRM'?" will be displayed. If you choose Yes, the changes to the form will be saved. If you choose to add another form from the File menu with the New Form command, you will be asked to to save the changes to each Form followed by the message "Save changes to '?'" when you exit Visual Basic. This is a problem unless you remember the Project name Test1.MAK. If you remember the filename, then the message "Replace existing 'C:\VB\TEST1.MAK'?" will be displayed and the new form or forms will be added to the project under the old project name. A workaround is to choose the Run command from the Windows Program Manager File menu with the following Path: C:\VB\Test1.MAK Visual Basic should now start with the correctly titled Project Window named TEST1.MAK. Title: Documentation Errors in First Printing of VB CDK Guide Document Number: Q74676 Publ Date: 2-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Below is a list of documentation errors in the first printing of the "Microsoft Visual Basic: Control Development Guide" shipped with the Visual Basic Control Development Kit (CDK). The documentation errors listed below may not apply to later printings of the "Microsoft Visual Basic: Control Development Guide." Many of the errors were corrected in the CDK Help file before shipping. The CDK is an add-on to the Microsoft Visual Basic programming system version 1.0 for Windows. More Information: Corrections to the "Microsoft Visual Basic: Control Development Guide" ---------------------------------------------------------------------- (page 79) Middle of the page: "...fourth field in the EVENTINFO structure..." should read "...fourth field in the PROPINFO structure..." Code at bottom of page: "OFFSETIN(MYCTL, Language)," should read "OFFSETIN(MYCTL, enumLanguage)," (page 112) VBXPixelsToTwips, VBYPixelsToTwips: Return data type is listed in Syntax as SHORT; it should be LONG. "...in logical twips into a measurement in pixels..." should read "...in logical pixels into a measurement in twips..." In the chart, Type should list as SHORT. (page 136) In the table, the incorrect heading "Flag Value" should be changed to "Field Name". Title: Closed Split Window Incorrectly Allows Text Entry Document Number: Q74731 Publ Date: 2-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: You can cause Microsoft Visual Basic to set the input focus to an invisible "view" of a split code window. Input is still accepted when the focus is set to the invisible portion of the code window, but will not be visible to the user. This is incorrect behavior, because closing a split window should shift focus to the first window. Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: Note that the "splitter bar" (the horizontal border just above the editing area and just above the vertical scroll bar) allows you to split the code window into two parts, which allows you to view two different sections of code at once. Steps to Reproduce Problem -------------------------- 1. Start Visual Basic or choose New Project from Visual Basic's File menu. 2. Double-click on Form1 to bring up a code window. 3. Drag down the code window splitter bar to the middle of the code window, splitting the code window into two views. 4. Click in the upper view of the code window to place the text insertion point there. 5. Select the code window splitter bar and drag it upwards to close the upper view in the code window. 6. Type "Sub foo" (without the quotation marks) and press ENTER. No text will appear in the code window, because the focus is set to the invisible half of the window. However, the contents of the "Proc" drop-down combo box will change to "Foo," indicating that Sub Foo has been created. 7. Click on the code window splitter bar again and pull the splitter bar back to the center of the code window. The text insertion point will appear in the upper view of the code window, and the current procedure for the upper view will be Sub Foo. Title: Example of Client/Server DDE Between Visual Basic Applications Document Number: Q74861 Publ Date: 2-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: This article outlines the steps necessary to initiate dynamic data exchange (DDE) between a Microsoft Visual Basic client application and a Visual Basic server application. This article demonstrates how to: 1. Create a Visual Basic application to function as a server. 2. Create a Visual Basic application to function as a client. 3. Initiate a cold DDE link (information updated upon request from the client) between the client application and the server application. 4. Use LinkRequest to update information in the client application from information in the server application. 5. Initiate a hot DDE link (information updated automatically from server to client) between the client application and the server application. 6. Use LinkPoke to send information from the client application to the server application. 7. Change the LinkMode property between hot and cold. This information applies to Microsoft Visual Basic programming system version 1.0 for Microsoft Windows. More Information: A client application sends commands through DDE to the server application to establish a link. Through DDE, the server provides data to the client at the request of the client or accepts information at the request of the client. Example ------- The steps below are an example of how to establish a DDE conversation between two Visual Basic applications. First, create the server application in Visual Basic: 1. Start Visual Basic, and Form1 will be created by default. 2. Change the Caption property of Form1 to "Server". 3. Put a Text Box (Text1) on Form1. 4. Save the form and project with the name SERVER. 5. From the File menu, choose Make EXE File. In the Make EXE File dialog box, choose OK to accept SERVER.EXE as the name of the EXE file. Second, create the client application in Visual Basic: 1. From the File menu, choose New Project. Form1 will be created by default. 2. Change the Caption property of Form1 to "Client". 3. Create the following controls with the following properties on Form1: Default Name Caption CtlName ------------ ------- ------- Text1 (Not applicable) Text1 Option1 Cold Link ColdLink Option2 Hot Link HotLink Command1 Poke Poke Command2 Request Request 4. Add the following code to the General Declaration section of Form1: Const TRUE = -1 Const FALSE = 0 Const HOT = 1 Const COLD = 2 Const NONE = 0 5. Add the following code to the Load event procedure of Form1: Sub Form_Load () 'This procedure will start the VB server application that was 'created earlier z% = Shell("C:\VB\SERVER", 1) z% = DoEvents() 'Causes Windows to finish 'processing the Shell command. Text1.LinkMode = NONE 'Clears DDE link if it already exists. Text1.LinkTopic = "Server]Form1" 'Sets up link with VB server. Text1.LinkItem = "Text1" 'Set link to text box on server. Text1.LinkMode = COLD 'Establish a cold DDE link. ColdLink.Value = TRUE 'Sets appropriate option button. End Sub 6. Add the following code to the Click event procedure of ColdLink: Sub ColdLink_Click () Request.Visible = TRUE 'Make request button valid. Text1.LinkMode = NONE 'Clear DDE Link. Text1.LinkMode = COLD 'Reestablish new LinkMode. End Sub 7. Add the following code to the Clink event procedure of HotLink: Sub HotLink_Click () Request.Visible = FALSE 'No need for button with hot link. Text1.LinkMode = NONE 'Clear DDE Link. Text1.LinkMode = HOT 'Reestablish new LinkMode. End Sub 8. Add the following code to the Click event procedure of Request: Sub Request_Click () 'With a cold DDE link, this button will be visible, and when 'selected it will request an update of information from the server 'application to the client application. Text1.LinkRequest End Sub 9. Add the following code to the Click event procedure of Poke: Sub Poke_Click () 'With any DDE link, this button will be visible, and when 'it selected, will poke information from the client application 'into the server application. Text1.LinkPoke End Sub You can now run the Visual Basic client application from the VB.EXE environment (skip to step 4 below) or you can save the application and create an .EXE file and run that from Windows (continue to step 1 below). 1. From the File menu, choose Save and save the form and project with the name CLIENT. 2. From the File menu, choose Make EXE File with the name CLIENT.EXE. 3. Exit the Visual Basic environment (VB.EXE). 4. Run the application (from Windows if an .EXE file, or from the Run menu if from the VB.EXE environment.) 5. Form1 of the client application will load and the server application will automatically start. You can now experiment with DDE between Visual Basic applications: 1. Try typing some text into the server's text box and then click the Update button. The text appears in the client's text box. 2. Click the Hot Link button and then type some more text into the server's text box. The text is automatically updated in the client's text box. 3. Type some text into the client's text box and click the Poke button. The text is sent to the server's text box. You can also establish DDE between applications at design time, as described on page 356 of the "Microsoft Visual Basic: Programmer's Guide" version 1.0 manual. For additional information on dynamic data exchange (DDE) between Visual Basic 1.0 and other Windows applications, query on the following words: DDE and Visual Basic Title: DDE Example Between Visual Basic and Word for Windows Document Number: Q74862 Publ Date: 2-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: This article outlines the steps necessary to initiate dynamic data exchange (DDE) between a Microsoft Visual Basic application and a Microsoft Word for Windows (WINWORD.EXE) document at run time. This article demonstrates how to: 1. Prepare a Word for Windows document for active DDE. 2. Initiate a cold DDE link (information updated upon request from the client) between the Visual Basic application (the client) and the document loaded into Word for Windows (the server). 3. Use LinkRequest to update information in the Visual Basic client based on information contained in the Word for Windows server. 4. Initiate a hot DDE link (information updated automatically from server to client) between the Visual Basic client and the Word for Windows server. 5. Use LinkPoke to send information from the Visual Basic client to the Word for Windows server. 6. Change the LinkMode property between hot and cold. This information applies to Microsoft Visual Basic programming system version 1.0 for Microsoft Windows. More Information: A client application sends commands through DDE to the server application to establish a link. Through DDE, the server provides data to the client at the request of the client or accepts information at the request of the client. Example ------- The steps below are an example of how to establish a DDE conversation between a Visual Basic application and a document loaded into Word for Windows (WINWORD.EXE). First, create the server document in Word for Windows: 1. Start Word for Windows. "Document1" will be created by default. 2. From the Window menu, choose Arrange All. This unmaximizes the document if it was maximized. Note that the title at the top of the WINWORD.EXE main title bar is now "Microsoft Word" and NOT "Microsoft Word - Document1". 3. Press SHIFT+END to select the document. 4. From the Insert menu, choose Bookmark. Under Bookmark Name, type "DDE_Link" (without quotation marks). Press ENTER. This sets a bookmark for the entire document. This bookmark will function as the LinkItem in the DDE conversation. 5. From the File menu, choose Save As, and save the document with the name SERVER.DOC. 6. Exit Word for Windows. For this particular example to function properly, WINWORD.EXE must not be loaded and running. Second, create the client application in Visual Basic: 1. Start Visual Basic. Form1 will be created by default. 2. Create the following controls with the following properties on Form1: Default Name Caption CtlName ------------ ------- ------- Text1 (Not applicable) Text1 Option1 Cold Link ColdLink Option2 Hot Link HotLink Command1 Poke Poke Command2 Request Request 3. Add the following code to the General Declaration section of Form1: Const TRUE = -1 Const FALSE = 0 Const HOT = 1 Const COLD = 2 Const NONE = 0 4. Add the following code to the Load event procedure of Form1: Sub Form_Load () 'This procedure will start WINWORD.EXE, load the document that was 'created earlier and prepared for DDE by creating a bookmark to 'the whole document. This bookmark is necessary because it 'functions as the LinkItem for the server in the DDE conversation. z% = Shell("C:\WinWord\WinWord C:\WinWord\Server.Doc",1) z% = DoEvents () 'Process Windows events. This ensures 'that WinWord will be executed before 'any attempt is made to perform DDE 'with it. Text1.LinkMode = NONE 'Clears DDE link if it already exists. Text1.LinkTopic = "WinWord]\WinWord\Server" 'Sets up link with 'WINWORD.EXE. Text1.LinkItem = "DDE_Link" 'Set link to bookmark on document. Text1.LinkMode = COLD 'Establish a cold DDE link. ColdLink.Value = TRUE End Sub 5. Add the following code to the Click event procedure of the Cold Link button: Sub ColdLink_Click () Request.Visible = TRUE 'Make request button valid. Text1.LinkMode = NONE 'Clear DDE Link. Text1.LinkMode = COLD 'Reestablish new LinkMode. End Sub 6. Add the following code to the Click event procedure of the Hot Link button: Sub HotLink_Click () Request.Visible = FALSE 'No need for button with hot link. Text1.LinkMode = NONE 'Clear DDE Link. Text1.LinkMode = HOT 'Reestablish new LinkMode. End Sub 7. Add the following code to the Click event procedure of the Request button: Sub Request_Click () 'With a cold DDE link this button will be visible, and clicking 'this button will request an update of information from the server 'application to the client application. Text1.LinkRequest End Sub 8. Add the following code to the Click event procedure of the Poke button: Sub Poke_Click () 'With any DDE link, this button will be visible, and clicking 'this button will poke information from the client application 'into the server application. Text1.LinkPoke End Sub You can now run the Visual Basic client application from the Visual Basic VB.EXE environment (skip to step 4 below) or you can save the application and create an EXE file and run that from Windows (continue to step 1 below). 1. From the File menu, choose Save and save the form and project with the name CLIENT. 2. From the File menu, choose Make EXE File with the name CLIENT.EXE. 3. Exit the Visual Basic environment (VB.EXE). 4. Run the application (from Windows if an .EXE file or from the Run menu if from the Visual Basic environment.) Form1 of the Visual Basic client application will be loaded, and Word for Windows will automatically be started with the document SERVER.DOC loaded. 5. Make sure that the main title bar in WINWORD.EXE reads "Microsoft Word", NOT "Microsoft Word - SERVER.DOC". If the title bar is not correct, choose Arrange All from the Window menu. You can now experiment with DDE between Visual Basic and Word for Windows: 1. Try typing some text into the document in Word for Windows, and then click the Request button. The text appears in the text box. 2. Click Hot Link and then type some more text into the document in Word for Windows. The text is automatically updated in the Visual Basic text box. 3. Type some text in the text box in the Visual Basic application and click the Poke button. The text is sent to the document in Word for Windows. Note that if in the WINWORD.EXE document, you delete the total contents of the bookmark, the bookmark will also be deleted. Any further attempt to perform DDE with this WINWORD.EXE session after the bookmark has been deleted gives the following error message: Foreign application won't perform DDE method or operation. If this happens, you must recreate the bookmark in the document in Word for Windows before performing any further DDE operations. You can also establish DDE between applications at design time, as described on page 356 of the "Microsoft Visual Basic: Programmer's Guide" version 1.0 manual. For additional information on dynamic data exchange (DDE) between Visual Basic 1.0 and other Windows applications, query on the following words: DDE and Visual Basic Title: Access Key Causes Different Event Order than Clicking Document Number: Q74905 Publ Date: 6-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: In Visual Basic, events may be generated in a different order if you choose a control (such as a button, a check box, or an option box) using an access key rather than with the mouse. The events that occur in a different order are Click, LostFocus, and GotFocus. The differing order of events is by design and is not the result of a problem with Visual Basic. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: You can create an access key at design time by changing the Caption property of a control to include an ampersand (&). The access key is the character after the ampersand, and at run time you press ALT+character to choose the control. (See page 120 of the "Microsoft Visual Basic: Programmer's Guide" version 1.0. manual.) When you press an access key (ALT+character) to choose a control, the Click event is generated before the LostFocus and GotFocus event; however, when you choose a control by clicking the mouse, the LostFocus and GotFocus events are generated before the Click event. The example below shows this different order of events. The example uses command buttons, but also applies to Check and Option boxes: 1. Open a new form and create two command buttons. 2. Enter the code as shown further below. 3. Change the Caption property of Command2 to "Command&2" 4. Run the program. 5. a. When Command1 has the focus and you click on Command2, the following events are generated in the following order: Command1_LostFocus Command2_GotFocus Command2_Click b. When Command1 has the focus and you press the access key, ALT+2, the following events are generated in the following order: Command2_Click Command1_LostFocus Command2_GetFocus Sample Code: ----------- Sub Command1_Click () Print "Command1_click" End Sub Sub Command1_LostFocus () Print "Command1_lostfocus" End Sub Sub Command1_GotFocus () Print "Command1_gotfocus" End Sub Sub Command2_Click () Print "Command2_click" End Sub Sub Command2_LostFocus () Print "Command2_lostfocus" End Sub Sub Command2_GotFocus () Print "Command2_gotfocus" End Sub Title: Carriage Return+Linefeed to Wrap Lines in Text Box Control Document Number: Q74906 Publ Date: 6-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Using the carriage return character, Chr$(13), alone to create a line wrap to the next line in a Visual Basic text box control will cause the character following the carriage return to be removed from a multiline text box. To correctly wrap to the next line, you must instead use both a carriage return and a linefeed, Chr$(10). This requirement is by design. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: The correct method to create a line wrap is to use a carriage return character followed by a linefeed character, Chr$(13) + Chr$(10). The Windows text box expects to find this sequence and assumes that the character following the carriage return is a linefeed, thus removing the following character as if it were a linefeed. The following steps show the results of using just the carriage return, and the results of using both carriage return and linefeed characters in a text box. 1. In a new project, click on the text box icon from the Toolbox (second tool down in the right column). 2. Click anywhere on the form and drag diagonally to create a text box large enough to hold more then one line of text. 3. From the Properties bar (below the main menu) scroll down to Multiline, then choose the Settings box for that Multiline property (also on the Properties bar below the menu) and choose True. The text box can now accommodate several lines of text. 4. Double-click anywhere in the form outside of the text box to bring up the Form_click code window (or use the F7 function key). 5. On the line below Sub Form_click (), type the following: Text1.text = "Hello" + Chr$(13) + "World" 6. Press F5 to run the newly created application, then click anywhere in the form outside the text box. The following text will appear: Hello orld Note that the W of "World" is missing. 7. To obtain the desired result, you must add a linefeed following the carriage return character, as follows: Text1.text = "Hello" + Chr$(13) + Chr$ (10) + "World" This will now display as expected: Hello World Title: How VB Can Determine if a Specific Windows Program Is Running Document Number: Q72918 Publ Date: 13-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: To determine if a specific program is running, call the Windows API function FindWindow. FindWindow returns the handle of the window whose class is given by the "lpClassname" parameter and whose window name, or caption, is given by the "lpCaption" parameter. If the returned value is zero, then the application is not running. This information applies to Microsoft Visual Basic Programming System version 1.0 for Windows. More Information: By calling FindWindow with a combination of a specific program's class name and/or the title-bar caption, your program can determine whether that specific program is running. When an application is started from the Program Manager, it registers the class name of the form. The window class provides information about the name, attributes, and resources required by your form. All Visual Basic forms have a class name of "ThunderForm". You can determine the class name of an application by using SPY.EXE that comes with the Microsoft Windows 3.0 Software Development Kit (SDK). If the window has a caption bar title, you can also use the title to locate the instance of the running application. This caption text is valid even when the application is minimized to an icon. Because another instance of your Visual Basic program will have the same class name and may have the same title bar caption, you must use Dynamic Data Exchange (DDE) to determine if another instance of your Visual Basic program is running. (This DDE technique is not shown in this article). The following example shows three ways to determine if the Windows 3.0 Calculator is running. To create the program, do the following: 1. Create a form. 2. Declare the Windows 3.0 API function FindWindow in the Global- Declarations section of the code window. The variables are declared as "Any" because you can pass either a pointer to a string, or a NULL value. You as a programmer are responsible for passing the correct variable type. Note that the Declare statement should be entered on just one line: Declare Function FindWindow% Lib "user" (ByVal lpClassName As Any, ByVal lpCaption As Any) 3. Add the following code to the form's Click event. This example demonstrates how you can find the instance of the application with a combination of the class name and/or the window's caption. In this example, the application will find an instance of the Windows 3.0 calculator (CALC.EXE). Sub Form_Click () Const NULL = 0& lpClassName$ = "SciCalc" lpCaption$ = "Calculator" Print "Handle = ";FindWindow(lpClassName$, NULL) Print "Handle = ":FindWindow(NULL, lpCaption$) Print "Handle = ";FindWindow(lpClassName$,lpCaption$) End Sub 4. Run this program with CALC.EXE running and without CALC.EXE running. If CALC.EXE is running, your application will print an arbitrary handle. If CALC.EXE is not running, your application will print the number zero as a handle. Below are some class names of applications that are shipped with Windows 3.0: Class Name Application ----------- ----------- SciCalc CALC.EXE CalWndMain CALENDAR.EXE Cardfile CARDFILE.EXE Clipboard CLIPBOARD.EXE Clock CLOCK.EXE CtlPanelClass CONTROL.EXE Session MS-DOS.EXE Notepad NOTE.EXE pbParent PBRUSH.EXE Pif PIFEDIT.EXE PrintManager PRINTMAN.EXE Recorder RECORDER.EXE Reversi REVERSI.EXE #32770 SETUP.EXE Solitaire SOL.EXE Terminal TERMINAL.EXE WFS_Frame WINFILE.EXE MW_WINHELP WINHELP.EXE #32770 WINVER.EXE MSWRITE_MENU WRITE.EXE Reference(s): "Peter Norton's Windows 3.0 Power Programming Techniques," by Peter Norton and Paul Yao (published by Bantam Computer Books, 1990). Title: Option Button with Access Key Gives UAE if Unload Is Invoked Document Number: Q74982 Publ Date: 13-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: If an option button containing an Unload statement in its Click event procedure is selected using the keyboard (an access key, the cursor keys, or the TAB key), the application terminates with a Windows Unrecoverable Application Error (UAE). Using the mouse to select the option button causes the Unload statement to execute correctly and does not generate a UAE. Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. Run Visual Basic or choose New Project from the File menu (ALT, F, N). Form1 will be created by default. 2. Place any control on Form1. 3. Place an option button (Option1) on Form1. 4. Assign an access key to Option1 by entering "&UAE" (without the quotation marks) for the Caption property of Option1. This will cause the letter U to become the access key for Option1. 5. Add the following code to the Option1_Click event procedure: Sub Option1_Click () Unload Form1 End Sub 6. Run the program (F5). 7. Use the access key (ALT+U), the cursor keys, or the TAB key to select the option button. When the option button is selected in this manner, a UAE will be generated. When you select the option button with the mouse, no UAE will occur. The UAE only occurs when the Click event is caused from the keyboard. Title: "Visual Basic 1.0 Setup by Batch File" Appnote Available Document Number: Q75370 Publ Date: 20-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: In rare cases, certain hardware configurations may not work properly with the SETUP.EXE utility shipped with Microsoft Visual Basic programming system version 1.0 for Windows. As an alternative installation method for Visual Basic 1.0, you can use the application note titled "Visual Basic 1.0 Setup by Batch File" (BV0446). To obtain application notes, call Microsoft Product Support Services at (206) 454-2030. Please specify whether you want a 3.5-inch (720K) or 5.25-inch (1.2 MB) disk (no other disk format is available). More Information: Microsoft can only distribute this application note to registered owners of Visual Basic because it contains uncompressed copies of Visual Basic's Icon Library files. Thus, this application note is not available on online electronic services; it is only available directly from Microsoft. This application note includes the following files and subdirectories on disk: README.NOW VBSETUP.BAT VBSETUP1.BAT DECOMP.EXE VBSETUP.BAT must be run from DOS and from the drive in which you inserted the disk. For example, typing the following from the drive C DOS prompt won't work: a:vbsetup Instead, you must make drive A (or the drive in which you inserted the disk) the active drive before running VBSETUP.BAT. For example, type "A:" (without the quotation marks) at the drive C DOS prompt and then type "VBSETUP" at the drive A DOS prompt. Note: When you run VBSETUP as shown above (with no arguments), further usage instructions will be displayed on the screen. The Icon Library shipped with Visual Basic is contained on the enclosed disk in uncompressed format, and will be copied to your destination directory by VBSETUP. This disk (and the included Icon Library) may only be distributed to registered owners of Microsoft Visual Basic. VBSETUP.BAT will only work with 5.25-inch 1.2 MB disks, or with 3.5-inch 720K disks. VBSETUP.BAT will not work with 5.25-inch 360K disks. Title: Determining Whether TAB or Mouse Gave a VB Control the Focus Document Number: Q75411 Publ Date: 20-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: You can determine whether a Visual Basic control received the focus from a mouse click or a TAB keystroke by calling the Windows API function GetKeyState in the control's GotFocus event procedure. By using GetKeyState to check if the TAB key is down, you can determine if the user tabbed to the control; if the TAB key was not used (and the control does not have an access key), the user must have clicked on the control with the mouse to set the focus. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: The GetKeyState Windows API function takes an integer parameter containing the virtual key code for the desired key states. GetKeyState returns an integer. If the return value is negative, the key has been pressed. The following is a code example. To use this example, start with a new project in Visual Basic. Add a text box and a command button to Form1. Enter the following code in the project's GLOBAL.BAS module: 'Global Module Declare Function GetKeyState% Lib "User" (ByVal nVirtKey%) Global Const VK_TAB = 9 Add the following code to the GotFocus event procedure for the Text1 text box control: Sub Text1_GotFocus() If GetKeyState(VK_TAB) < 0 Then Text1.SelStart = 0 Text1.SelLength = Len(Text1.Text) Else Text1.SelLength = 0 End If End Sub Run the program. If you use the TAB key to move the focus from the command button to the text box, you should see the text in the text box selected. If you change the focus to the text box by clicking on it with the mouse, the text will not be selected. If the control has an access key (assigned by using an ampersand [&| in the control's caption property), then you may also want to check the state of the virtual ALT key using GetKeyState to see if the user changed the focus using the access key. The virtual key code for ALT, actually known as VK_MENU, is 12. Title: Setup "Illegal Function Call" if Manually Delete Existing File Document Number: Q75412 Publ Date: 20-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: If the Microsoft Visual Basic Setup program detects an existing copy of Visual Basic already on the disk during installation, Setup will ask whether or not you want to "Overwrite existing files?". At this point, if you manually delete the existing files using a separate process in Windows and then attempt to continue with the Setup, Setup will give an "Illegal function call" error message and end without installing Visual Basic. Microsoft has confirmed this to be a problem with the Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. To work around the problem, let Setup overwrite the existing files. More Information: Steps to Reproduce Problem -------------------------- 1. Have an installation of Visual Basic in the \VB subdirectory of your hard disk. 2. Run the Visual Basic SETUP.EXE program. 3. When the subdirectory path to install Visual Basic is displayed, make sure it points to the VB subdirectory where the files already exist. Click on Continue. 4. Do not reply to the following message: "A previous installation of Visual Basic has been found in this directory. Overwrite existing files?" 5. Go to the File Manager in Windows and delete the existing Visual Basic files. 6. Return to the Visual Basic Setup and click Yes in reply to the message. When you reply OK to the "Illegal function call" message that appears, Setup ends without installing Visual Basic. To work around this behavior when Visual Basic files already exist prior to installation, either delete those files before starting Setup or let Setup overwrite the existing files. Title: Corrections for Errors in Visual Basic Version 1.0 Manuals Document Number: Q73655 Publ Date: 21-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Below are corrections for documentation errors in the manuals shipped with Microsoft Visual Basic version 1.0 for Windows. This master list of corrections includes and adds to the correction list found in sections 2 and 3 of the README.TXT file shipped with Visual Basic 1.0. Please use the article below as your master list for making corrections to the Visual Basic manuals. More Information: Microsoft Visual Basic includes the following two manuals: - "Microsoft Visual Basic: Programmer's Guide" - "Microsoft Visual Basic: Language Reference" In both manuals, all references to OS/2 and Presentation Manager (PM) are misprints, and should be ignored. Corrections to the "Microsoft Visual Basic: Programmer's Guide" --------------------------------------------------------------- (page 61) "To set the Caption property:" #2, last line: "...you can skip Step 4 and proceed to Step 5." should read "...you can skip Step 3 and proceed to Step 4." (page 97) First line: "...calls to the LogB procedure..." should read "...calls to the LogF procedure..." (page 106) Code at bottom of page should read: x = Shell("\winword\winword.exe c:\winword\plan.doc", 1) and y = Shell("\winproj\winproj.exe c:\winproj\schedule.wpr", 1) (page 117) Table at bottom of page, last two lines should be: Caption CtlName Indented Index - SepBar Once AppName Once 0 (Note that the README.TXT file incorrectly says to use 1 as the index value for AppName above; 0 is the correct value.) The following text should read: "Turn off the Visible property for AppName by toggling the Visible check box. The SepBar control has its caption set to a hyphen (-), which causes Visual Basic to display a separator bar." (page 118) Second paragraph, delete the following: "Therefore, you cannot delete the...of Appname." Add the following line of code just above the End Sub for the AddApp_Click procedure: AppName(LMenu).Visible = -1 (page 129) Last paragraph, first line: "...tabbing to the button and..." should read "...tabbing to the option button group, using the arrow keys, and..." (page 146) Top: "MsgBox msg$[,type%[,type%[,title$||" should read "MsgBox msg$[,type%[,title$||" (page 153) Lines 8 through 14: All references to CurrentX should be CurrentY and vice versa. (page 170) Code at bottom of page: Text1(I).Text = "Text1(" + Format(I) + ")" should read Text1(I).Text = "Text1(" + Format$(I) + ")" (page 182) Code at top of page: [object.|Line[(x1, y1)| - [x2, y2) [, color| should read [object.|Line[(x1, y1)| - (x2, y2) [, color| (page 204) Last paragraph, second line: "...continuous line when mouse button..." should read "...continuous line when the left mouse button..." (page 223) Last paragraph, second line: "...(named GroupChoice)..." should read "...(named GroupList)..." (page 106) Code at bottom of page should read: (page 248) All references to the property DrawColor should be omitted. There is no DrawColor property. (page 261) First paragraph, second line: "...variable-length strings." should read "...fixed-length strings." (page 267) Code at bottom of page: All references to "Picture1.Picture" should read "Form1.Picture1.Picture" (page 270) Code at bottom of page third line from bottom: "...Mid$(MyTime, 1, 2)..." should read "...Mid$(MyTime, ((Hours-12)<10)+2, 2)..." (page 276) Third paragraph, second line: "KeyPress event ....The same thing happens when..." should read "KeyDown event ...The KeyDown event gets the same code when..." (page 288) last line: "MB_EXCLAIM" should read "MB_ICONEXCLAMATION" (page 308) Third paragraph of code, second nested IF THEN statement: "If FileListBox.List(ind) = ..." should read "If FileListBox.List(Ind%) = ..." (page 311) The code under "FileListBox_DblClick" "FileListBox.Pattern = *.*" should read "FileListBox.Pattern = "*.*" " (page 313) Do Loop should read: Do Until Instr(LastOne% + 1, Test$, "\") = 0 LastOne% = Instr(LastOne% + 1, Test$, "\") Loop (page 320) Last paragraph, last sentence should read: "The maximum length of a file that can be edited with Text Editor is a little less than 32,000 bytes, because that is the default maximum number of characters you can assign to a Visual Basic multiline text box control." (page 330) Code sample seventh to last line and (page 331) second line: "EndLine$ = Input$(1, 1)" should read "EndLine$ = Input$(1, FileNum)" (page 339) The Form_Load procedure: Running this code will result in an error: "Illegal Function call" on the statement "FieldBoxes(0).SetFocus" on the second-to-last line. This is because the Form is not yet visible. To solve the problem, add the following line of code to the top of the procedure: Form1.Show (page 339) Code under "Form_Load": Add the following as first line after "Sub Form_Load": "Form1.Show" (page 339) Code at bottom of page: "WorkingFileNum = FileOpener..." should read "WorkingFileNum% = FileOpener..." (page 341) All reference to FieldBoxes in the code example on Page 341 should specify the form. For example: Form1.FieldBoxes (page 360) Note at bottom of page: References to the ALT key should be ESC key. (page 364) The Link Execute Event, second argument, last line of description: "...the client receives a negative argument." should read "...the client receives a negative acknowledgment." (page 369) Program example: "if Err = DDE_NO_APP" missing THEN statement. (page 370) "Requesting Data from Other Applications" All references to "warm link" should be references to "cold link". (page 371) "Notifying Other Applications..." first paragraph: "(in the case of a warm link)" should read "(in the case of a cold link)". (page 378) "To load a custom control file:" Delete step 2 (the second line). "Type or select the name..." should be step 2. (page 380) Under "Special Considerations When Declaring DLL Routines": The statement "The Visual Basic package contains a file that includes the declarations for all useful routines in the operation ..." is incorrect. This file is not included with Visual Basic, but is part of the add-on kit, "Microsoft Windows Programmer's Reference" Book and Online Resource, available from Microsoft at a charge. (page 386) Code at top of page: The first set of quotation marks around "Microsoft Excel" should be straight quotation marks. Add the following paragraph after first code fragment: "The use of ByVal when passing a string is necessary because the data type of that argument was declared As Any. Including ByVal when passing a string declaring AsAny causes Visual Basic to convert the string to the null-terminated form expected by most DLL routines." The following code at the bottom of the page: "...Lib "User"..." should read "...Lib "GDI"..." (Index) A, "ALT key": Delete "interrupting DDE 360" A, "As Any": Add to page list: "386" E, after "Errors": Add new topic: "ESC Key, interrupting DDE 360" I, "Index property": Add to page list on "creating control arrays": "117" M, "Microsoft Visual Basic": Change page list on "starting programs" from "17-18" to "16-17" S, "Strings": "variable-length 251, 385" should read "use of ByVal with variable-length 251, 385, 386" Corrections to "Microsoft Visual Basic: Language Reference" ----------------------------------------------------------- (page 9) Windows category: "hWin" should read "hWnd" (page 27) Add to the Note the following paragraph: "When you minimize a form whose AutoRedraw Property is set to False (0), ScaleHeight and ScaleWidth are set to icon size. When AutoRedraw is set to True (-1), ScaleHeight and ScaleWidth remain the size of the restored window." (page 31) Description: "...for an object; for forms and picture boxes..." should read "...for an object, for forms and text boxes..." Add the following paragraph at the end of the Remarks section: "Because of appearance, the BorderStyle for forms with a menu can only be set to Sizeable (2) or Fixed Single (1). Setting the BorderStyle property to None (0) or Fixed Double (3) forces the BorderStyle property to Fixed Single (1)." (page 52) Graphic image: The image shown is an example of a check box; it should show a combo box example. (page 147) Description: "read-only" should read "read-write" Change the Note to read as follows: "For a form icon to be functional, the BorderStyle property must be set to either 1 (Fixed Single) or 2 (Sizeable). The MinButton property must be set to True (-1)." "At runtime, you can assign an object's Icon property to another object's DragIcon or Icon property. You can also assign an icon returned by the LoadPicture function. Doing this assigns an empty (null) icon, which enables you to draw on the icon at run time." (page 154) Despite references on page 154 and in the VB.EXE online Help, the INPUT$ function is not supported for files opened with random access. Attempting to use INPUT$ on a file opened for random access results in a "Bad file mode" error message. (Use of INPUT$ on random files was eliminated in Visual Basic, as was the older Basic statement FIELD.) (page 184) In the second line of the Note: "...by pressing the ALT key." should read "...by pressing the ESC key." (page 188) Last line of description should read: "The List property is not available at design time; it is read-only for drive, file, and directory list boxes and read-write for combo and list boxes." (page 209) Month Function: In the Case statements, delete all numbers greater than 12. (page 244) Pointer Property: This property does not exist. The name was changed to MousePointer Property (page 214). (page 285) Syntax: The syntax fo ClipBoard.SetData should be changed from "ClipBoard.SetData (data%, [format%|) to "Clipboard.SetData data%, [format%|" Title: Correction to WINAPI.TXT for Visual Basic Add-on Kit Document Number: Q74526 Publ Date: 21-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The following corrections apply to the WINAPI.TXT file provided on disk with the "Microsoft Windows Programmer's Reference" book and Online Resource, add-on kit number 1-55615-413-5, for Microsoft Visual Basic. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: The following corrections apply to the WINAPI.TXT file dated 5/14/91. 1. The following statement is incorrect Declare Function SetCommState Lib "User" () and should be changed to read as follows: Declare Function SetCommState Lib "User" (lpDCB as DCB) As Integer 2. The Declare statement for WinExec is missing the ByVal attribute in the second parameter. Without this ByVal, invoking WinExec can cause a Windows "Unrecoverable Application Error" ("UAE"). The WinExec Declare statement should be changed to read as follows (on one line): Declare Function WinExec Lib "Kernel" (ByVal lpCmdLine As String, ByVal nCmdShow As Integer) As Integer 3. The following statement is incorrect GetDC Lib "GDI" (ByVal hWnd As Integer) As Integer and should be changed to read as follows: GetDC Lib "USER" (ByVal hWnd As Integer) As Integer In other words, the function GetDC is in the Windows "USER" library (DLL), not in the "GDI" library (DLL). 4. The following statement is incorrect Declare Function WinExec Lib "Kernel" (ByVal lpCmdLine As String, nCmdShow As Integer) As Integer and should be changed to read as follows: Declare Function WinExec Lib "Kernel" (ByVal lpCmdLine As String, ByVal nCmdShow As Integer) As Integer For more information on WINAPI.TXT, query on the following words: WINAPI.TXT and Visual and Basic Title: DDE from Visual Basic to Excel for Windows Document Number: Q75089 Publ Date: 21-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: This article describes how to initiate a dynamic data exchange (DDE) conversation between a Visual Basic client application and a Microsoft Excel server application. This article demonstrates how to: - Prepare a Microsoft Excel document for active DDE. - Initiate a cold DDE link (information updated upon request from the client) between Visual Basic (the client) and Excel (the server). - Use LinkRequest to update information in Visual Basic (the client) based on information contained in Excel (the server). - Initiate a hot DDE link (information updated automatically from server to client) between Visual Basic (the client) and Excel (the server). - Use LinkPoke to send information from Visual Basic (the client) to Excel (the server). - Change the LinkMode property between hot and cold. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows and to Microsoft Excel for Windows. More Information: A client application sends commands through DDE to the server application to establish a link. Through DDE, the server provides data to the client at the request of the client or accepts information at the request of the client. The steps below serve as a example of how to establish a DDE conversation between Visual Basic and Excel for Windows. First, create the server spreadsheet in Excel: 1. Start Excel, and a document titled "SHEET1" will be created by default. 2. From the File menu, choose Save As, and save the document with the name SERVER.XLS 4. Exit Excel. For this example to function properly, Excel must not be loaded and running. Second, create the client application in Visual Basic: The client is the application that performs the link operations. It prompts the server to send information or informs the server that information is being sent. 1. Start Visual Basic (VB.EXE), and Form1 will be created by default. 2. Create the following controls with the following properties on Form1: Default Name Caption CtlName ------------ ------- ------- Text1 (not applicable) Text1 Option1 Cold Link ColdLink Option2 Hot Link HotLink Command1 Poke Poke Command2 Request Request 3. Add the following code to the General Declaration section of Form1: Const TRUE = -1 Const FALSE = 0 Const HOT = 1 Const COLD = 2 Const NONE = 0 4. Add the following code to the Load event procedure of Form1: Sub Form_Load () 'This procedure will start Excel and load SERVER.XLS, the 'spreadsheet that was created earlier. z% = Shell("C:\EXCEL\EXCEL c:\excel\SERVER.XLS", 1) z% = DoEvents() 'Process Windows events. This ensures 'that Excel will be executed before 'any attempt is made to perform DDE. Text1.LinkMode = NONE 'Clears DDE link if it already exists. Text1.LinkTopic = "Excel]c:\excel\server.xls" 'Sets up link 'with Excel. Text1.LinkItem = "R1C1" 'Set link to first cell on spreadsheet. Text1.LinkMode = COLD 'Establish a cold DDE link. ColdLink.Value = TRUE End Sub 5. Add the following code to the Click event procedure of the Cold Link button: Sub ColdLink_Click () Request.Visible = TRUE 'Make request button valid. Text1.LinkMode = NONE 'Clear DDE Link. Text1.LinkMode = COLD 'Reestablish new LinkMode. End Sub 6. Add the following code to the Click event procedure of the Hot Link button: Sub HotLink_Click () Request.Visible = FALSE 'No need for button with hot link. Text1.LinkMode = NONE 'Clear DDE Link. Text1.LinkMode = HOT 'Reestablish new LinkMode. End Sub 7. Add the following code to the Click event procedure of the Request button: Sub Request_Click () 'With a cold DDE link this button will be visible and when selected 'it will request an update of information from the server 'application to the client application. Text1.LinkRequest End Sub 8. Add the following code to the Click event procedure of the Poke button: Sub Poke_Click () 'With any DDE link this button will be visible and when selected 'it will poke information from the client application to the 'server application. Text1.LinkPoke End Sub You can now run the Visual Basic client application from the Visual Basic environment (skip to step 4) or you can save the application and create an EXE file and run that from Windows (continue to step 1): 1. From the Visual Basic File menu, save the Form and Project with the name CLIENT. 2. From the File menu, choose Make EXE File, and name it CLIENT.EXE. 3. Exit Visual Basic. 4. Run the application (from Windows if an .EXE file or from the Run menu if from the Visual Basic environment). 5. Form1 of the client application will be loaded and Excel will automatically be started with the document SERVER.XLS loaded. 6. Make sure that the main title bar in Excel reads "Microsoft Excel," NOT "Microsoft Excel - SERVER.XLS." If the title bar is improper, then from the Window menu choose ArrangeAll. You can now experiment with DDE between Visual Basic and Excel: 1. Try typing in some text in R1C1 in the spreadsheet and then select the Request button. The text appears in the text box. 2. Choose Hot Link and then type in some more text in R1C1 of the spreadsheet. The text is automatically updated in the Visual Basic text box. 3. Type some text in the text box in the Visual Basic application and select the Poke button. The text is sent to R1C1 in the Excel spreadsheet. Note that if you have "Ignore Remote Requests" checked in the "Options" - "Work space" menu, you will not be able to establish DDE from Visual Basic. Make sure that "Ignore Remote Requests" is NOT checked. You can also establish DDE between applications at design time. This is covered on page 356 in the "Microsoft Visual Basic: Programmer's Guide" version 1.0 manual. For additional information on dynamic data exchange (DDE) between Microsoft Visual Basic version 1.0 and other Windows applications, query on the following words: DDE and Visual Basic Title: DDE Between Visual Basic and Q+E for Windows Document Number: Q75090 Publ Date: 21-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: This article describes how to initiate a dynamic data exchange (DDE) conversation between a Visual Basic client application and a Q+E server application. This article demonstrates how to: 1. Prepare a Q+E database file for active DDE. 2. Initiate a cold DDE link (information updated upon request from the client) between Visual Basic (the client) and Q+E (the server). 3. Use LinkRequest to update information in Visual Basic (the client) based on information contained in Q+E (the server). 4. Initiate a hot DDE link (information updated automatically from server to client) between Visual Basic (the client) and Q+E (the server). 5. Use LinkPoke to send information from Visual Basic (the client) to Q+E (the server). 6. Change the LinkMode property between hot and cold. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows and to Pioneer Software Q+E (a database query tool). More Information: A client application sends commands through DDE to the server application to establish a link. Through DDE, the server provides data to the client at the request of the client or accepts information at the request of the client. The following steps serve as a example of how to establish a DDE conversation between Visual Basic and Pioneer Software Q+E for Windows. First, generate a Q+E database file to act as the server. 1. Create a database (.DBF) file (see the Q+E manuals for the procedure). For this example, you will use one of the default files, ADDR.DBF, that was provided with Excel for Windows. 2. If Q+E is already running, exit Q+E. For this example to work properly, Q+E must not be loaded and running. Next, create the client application in Visual Basic. The client is the application that performs the link operations. It prompts the server to send information or informs the server that information is being sent. 1. Start Visual Basic. Form1 will be created by default. 2. Create the following controls with the following properties on Form1: Default Name Caption CtlName ------------ ------- ------- Text1 (not applicable) Text1 Option1 Cold Link ColdLink Option2 Hot Link HotLink Command1 Poke Poke Command2 Request Request 3. Add the following code to the General Declaration section of Form1: Const TRUE = -1 Const FALSE = 0 Const HOT = 1 Const COLD = 2 Const NONE = 0 4. Add the following code to the Load event procedure of Form1: Sub Form_Load () 'This procedure will start Q+E and load the 'file "ADDR.DBF" z% = Shell("C:\EXCEL\QE C:\EXCEL\QE\ADDR.DBF",1) z% = DoEvents () 'Process Windows events. This 'ensures that Q+E will be 'executed before any attempt is 'made to perform DDE with it. Text1.LinkMode = NONE 'Clears DDE link if it already 'exists. Text1.LinkTopic = "QE]QUERY1" 'Sets up link with Q+E. Text1.LinkItem = "R1C1" 'Set link to first cell on 'spreadsheet. Text1.LinkMode = COLD 'Establish a cold DDE link. ColdLink.Value = TRUE End Sub 5. Add the following code to the Click event procedure of the Cold Link button: Sub ColdLink_Click () Request.Visible = TRUE 'Make request button valid. Text1.LinkMode = NONE 'Clear DDE Link. Text1.LinkMode = COLD 'Reestablish new LinkMode. End Sub 6. Add the following code to the Clink event procedure of the Hot Link button: Sub HotLink_Click () Request.Visible = FALSE 'No need for button with hot link. Text1.LinkMode = NONE 'Clear DDE Link. Text1.LinkMode = HOT 'Reestablish new LinkMode. End Sub 7. Add the following code to the Click event procedure of the Request button: Sub Request_Click () 'With a cold DDE link this button will be visible and when 'selected it will request an update of information from the server 'application to the client application. Text1.LinkRequest End Sub 8. Add the following code to the Click event procedure of the Poke button: Sub Poke_Click () 'With any DDE link this button will be visible and when selected 'it will poke information from the client application to the 'server application. Text1.LinkPoke End Sub You can now run the Visual Basic client application from the Visual Basic environment (skip to step 4) or you can save the application and create an .EXE file and run that from Windows (continue to step 1): 1. From the File menu, save the Form and Project using the name CLIENT. 2. From the File menu, choose Make an EXE File, and name it CLIENT.EXE. 3. Exit Visual Basic. 4. Run the application (from Windows if an .EXE file or from the Run menu if from the Visual Basic environment). 5. Form1 of the client application will be loaded and Q+E will automatically be started with the database file ADDR.DBF loaded. 6. Make sure that the main title bar in Q+E reads "Q + E," NOT "Q + E - ADDR.DBF." If the title bar is incorrect, then from the Window menu of Q+E choose ArrangeAll. You can now experiment with DDE between Visual Basic and Q+E for Windows: 1. Try typing in some text in R1C1 (the cell that holds the name "Tyler") in the Q+E spreadsheet and then select the Request button. The text will appear in the Visual Basic text box. 2. Choose Hot Link and then type in some more text in R1C1 of the Q+E spread sheet. The text is automatically updated in the Visual Basic text box. 3. Type some text in the text box in the Visual Basic application and select the Poke button. The text is sent to R1C1 in the Q+E spreadsheet. Note that if you do not have the Allow Editing option checked under the Edit menu in Q+E, you will not be able to change the contents of the Q+E spreadsheet. This may prevent some DDE operations. For example, attempting to LinkPoke to Q+E from Visual Basic when the Allow Editing option is not selected will cause the program to crash and result in a "Foreign application won't perform DDE method or operation" error message. Attempting to change the contents of the spreadsheet from Q+E will result in a "Use the allow editing command before making changes" error message. From the Edit menu of Q+E, select Allow Editing to enable this option. When viewed from the edit menu, it should have a check mark next to it when enabled. You can also establish DDE between applications at design time. For more information, see page 356 of the "Microsoft Visual Basic: Programmer's Guide" version 1.0 manual. For additional information on dynamic data exchange (DDE) between Microsoft Visual Basic version 1.0 and other Windows applications, query on the following words: DDE and Visual Basic Title: Cannot Make DDE Link to Object as Child of Another Object Document Number: Q75091 Publ Date: 21-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When performing dynamic data exchange (DDE) from a client application to a Visual Basic server application, you cannot make a DDE link to an object that is not a direct child of a Form in the Visual Basic application. For example, from Excel you cannot establish a DDE link with a text box in a Visual Basic application if that text box is contained within a picture box on Form1. The text box must be on Form1 and not a child of any other object on that form. Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. Microsoft is researching this problem and will post new information here as it becomes available. More Information: To work around this problem, create an additional object on the form and set that object's Visible property to False. You can then establish a DDE link with this hidden object. Establishing a DDE link with a hidden object will issue the Change event for this object. You can attach code to this event that will update the information sent via the DDE link to the appropriate control, which may or may not be a direct child of the form. The following example demonstrates this workaround: First, create the server application in Visual Basic: 1. Start Visual Basic, and Form1 will be created by default. 2. Put a text box (Text1) on Form1. 3. Save the Form and Project with the name SERVER. 4. From the File menu, choose Make EXE File, make an .EXE, and call it SERVER.EXE. Next, create the client application in Visual Basic: 1. From the File menu, choose New Project. Form1 will be created by default. 2. Put a picture box (Picture1) on Form1. 3. Put a text box (Text1) in the picture box (Picture1) as follows: a. Click ONCE on the text box icon in the toolbox. b. Move the mouse pointer on top of Picture1 (note the mouse pointer is a cross). c. Press the left mouse button and drag the mouse pointer to size the text box. d. Release the left mouse button. e. Text1 is now a child of Picture1. 4. Put a text box (Text2) on Form1. 5. Set the Visible property of Text2 to False. 6. Add the following code to the General Declaration section of Form1: Const NONE = 0 Const HOT = 1 7. Add the following code to the Form_Load event procedure of Form1: Sub Form_Load () 'This procedure will start the Visual Basic server application 'that was created earlier. Form1.Show 'Show Form1 z% = Shell("C:\VB\SERVER,1) z% = DoEvents() 'Causes Windows to process the Shell. Text2.LinkMode = NONE 'Clears DDE Link if already there. Text2.LinkTopic = "Server]Form1" 'Sets up link with VB server. Text2.LinkItem = "Text1" 'Sets link to Text Box on server. Text2.LinkMode = HOT 'Establish a hot DDE link. End Sub 8. Add the following code to the Change event procedure of Text1: Sub Text2_Change () 'This procedure will cause the information in the text field of 'Text1 to be updated whenever the text property of Text2 changes. Text1.Text = Text2.Text End Sub You can now run the VB client application: 1. From the Run menu, choose Start. 2. Form1 of the client application will be loaded and the Visual Basic server application will automatically be started. 3. Now any information you type in the text box of the Server application will be automatically updated to the invisible text box (on Form1) in the client application and then automatically transferred to the Visible text box (on Picture1 on Form1) in the client application. Title: Duplicate PostScript Font Names in VB Printer.Fonts List Document Number: Q75092 Publ Date: 21-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When a PostScript printer driver is active in Microsoft Windows 3.0, the Fonts(index%) property of Visual Basic's Printer object may return one or more duplicate font names at run time. This problem is caused by Microsoft Windows 3.0 itself (and is not caused by Microsoft Visual Basic programming system version 1.0 for Windows). Microsoft has confirmed this to be a problem with Microsoft Windows version 3.0 (buglist3.00). We are researching this problem and will post new information here as it becomes available. More Information: The following program displays the list of font names available for the PostScript printer currently selected in the Windows Control Panel: Sub Form_Click () For J% = 0 to Printer.FontCount - 1 Print Printer.Fonts(J%) Next J% End Sub In some cases, when a PostScript printer is active in Windows, one or more fonts are listed twice. Title: Some Invalid DrawMode Values Return 1-16 Instead of Error Document Number: Q75174 Publ Date: 21-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The Microsoft Visual Basic DrawMode property will not give an error for some invalid values. For example, numbers in the range 257 to 272, 513 to 528, and so forth, and for negative numbers in the range -240 to -255, -496 to -511, and so forth. Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: The code below demonstrates the problem. When you run this program, the DrawMode is assigned to 257, and when the DrawMode is printed, it prints 1, showing that the values are mapping onto 1 through 16. Example ------- 1. In the VB.EXE environment, create a New Form. 2. In the Form_GotFocus event procedure, add the following lines of code: DrawMode = 257 Print DrawMode 3. Run the program (press F5). The program will incorrectly display a 1 on the form, instead of giving the error message "Illegal Property Value." By analyzing the range of values that map onto 1 through 16, any number that satisfies the following equation will not generate an error, but will instead give values in the range of 1 to 16: Number = (x * 256) + y where x is a whole number between -128 and 127, and y is between 1 and 16 inclusive (that is, any number in the range of a multiple of 256 plus 1 to 16 will map onto 1 through 16). Title: Using Code Menu's Replace to Create Subs May Fail in VB.EXE Document Number: Q75057 Publ Date: 22-AUG-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When using the Replace command from the Code menu of Microsoft Visual Basic to perform a replacement that results in the creation of a Sub or Function, Visual Basic may not correctly perform the replacement. Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. Microsoft is researching this problem and will post new information here as it becomes available. More Information: Steps to Reproduce Problem -------------------------- 1. Start the Visual Basic environment (VB.EXE). 2. Double-click on Form1 to bring up a code window. 3. Select the (general) object from the object list box at the top of the code window. 4. Type the following text in the code window: 'test1 'test2 'test3 'test4 5. From the Code menu, choose the Replace command. 6. Type the following on the "Find What:" line of the Replace dialog box: 'test 7. Type the following on the "Replace With:" line of the same dialog box: sub test 8. If you now choose the Verify button, Visual Basic will prompt you to replace the text for the lines 'test1 and 'test3, but not for 'test2 or 'test4. If you choose Replace All, Visual Basic will correctly create Sub test1 and Sub test2, but will fail to replace the text for 'test3 or 'test4. (The order of replacement depends upon the location of the insertion point.) Title: How to Determine Multiple Instances of a VB Application Document Number: Q75641 Publ Date: 9-SEP-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Using Windows version 3.0 API function calls, you can determine if another instance of your application is running. Using the same API calls, you can also determine how many instances of an application are running. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: You can use two Windows API function calls to determine how many instances of your application are running. This can be useful if you want to limit how many copies of your application can run at once. The Windows KERNEL DLL (dynamic-link library) defines two functions called GetModuleHandle and GetModuleUsage. GetModuleUsage uses the handle returned from GetModuleHandle to determine how many instances of your application are running. Below is a definition of each function: GetModuleHandle%(lpProgramName$) -------------------------------- This function retrieves the program handle of the specified program. lpProgramName$ Points to a null-terminated character string that specifies the program. Return Value The return value identifies the program if the function is successful. Otherwise, the return value is zero. GetModuleUsage%(hProgram%) -------------------------- This function returns the reference count of a specified program. hProgram% Identifies the program or an instance of the program. This value can be determined with a call to GetModuleHandle. Return Value The return value specifies the reference count of the program. Example ------- The following application is an example of how to limit an application to a single instance: 1. Create a form called Form1. 2. Within the global-declaration section of the form, declare the following Windows API functions: Declare Function GetModuleHandle% Lib "Kernel" (ByVal lpProgramName$) Declare Function GetModuleUsage% Lib "Kernel" (ByVal hProgram%) 3. Within the Form_Load event add the following code: Sub Form_Load () hw% = GetModuleHandle("project.EXE") If GetModuleUsage(hw%) > 1 Then MsgBox "This program is already loaded!", 16 End End If End Sub 4. Compile the program as PROJECT.EXE 5. Run PROJECT.EXE from the Program Manager. 6. Run a second instance of PROJECT.EXE. It should display a message box and terminate. Reference: "Programming Windows: the Microsoft Guide to Writing Applications for Windows 3," by Charles Petzold (published by Microsoft Press, 1990) "Microsoft Windows 3.0 Software Development Kit: Reference Volume 1" WINSDK.HLP file shipped with Microsoft Windows 3.0 Software Development Kit Title: Text Not Highlighted Copying Immediate Window to Clipboard Document Number: Q75762 Publ Date: 9-SEP-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When you copy text from the Immediate window to the Windows system clipboard, the selected text is not highlighted. Also, the cursor is not visible. However, the copy operation works as it should. This information applies to Microsoft Visual Basic programming system version 1.0 for windows. Microsoft has confirmed this problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: To reproduce the problem, perform the following steps: 1. Run the Windows Clipboard utility. (Usually found in the Windows MAIN group window). 2. Run Visual Basic. 3. Press F5 to start Visual Basic. 4. Press CTRL+BREAK to bring up the Immediate window. 5. Press F5 to continue. 6. Click on the Immediate window to give it the focus. 7. Press CTRL+HOME to move to the beginning of the text in the Immediate window. 8. Press SHIFT+CTRL+END (this selects all text in the Immediate window. Note that you cannot select text with the Mouse at this point). 9. Press CTRL+INS (this copies the selected text in the Immediate window to the Windows clipboard). The text transfers to the Windows clipboard as it should, but the text in the Immediate window is not highlighted as it should be. The cursor is also not visible. Title: How to Print the ASCII Character Set in Visual Basic Document Number: Q75857 Publ Date: 9-SEP-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The default font used by Visual Basic is the standard ANSI character set. To display the ASCII character set, which is more commonly used by DOS mode applications, you must call two different Windows API functions. The Windows API functions are GetStockObject and SelectObject. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: Windows supports a second character set, referred to as the OEM character set. This is generally the character set used internally by DOS for screen display at the DOS prompt. The character codes 32 to 127 are normally identical for the OEM, ASCII, and ANSI character sets. The ANSI characters represented by the remaining character codes (codes 0 to 31 and 128 to 255) are generally different from characters represented by the OEM and ASCII character sets. The OEM and ASCII character sets are identical for these ranges. Under the ASCII and OEM character sets, the character codes 128 to 255 correspond to the extended ASCII character set, which includes line drawing characters, "graphics" characters, and special symbols. The characters represented by this range of character codes generally differ between the ASCII (or OEM) and ANSI character sets. To change the selected font from ANSI to the OEM ASCII font, you must get a handle to the OEM character set by calling GetStockObject. When this handle is passed as an argument to SelectObject, the ANSI font will be replaced by the OEM ASCII font. This API function also returns the handle to the font object previously used. Once you are through displaying the desired characters, you should call SelectObject again to reselect the original font object. Note: There is also an API function called DeleteObject. This function need not be called to delete a stock object. The purpose of this API function is to delete objects loaded with the API function GetObject. The three functions are described as follows: GetStockObject% (nIndex%) ------------------------- nIndex% Specifies the type of stock object desired. Use the constant OEM_FIXED_FONT to retrieve the handle to the OEM character set. The value of this constant is 10. Return Value The return value identifies the desired logical object if the function is successful. Otherwise, it is NULL. SelectObject% (hDC%, hObject%) ------------------------------ hDC% Identifies the device context. hObject% Identifies the object to be selected. Use the return value from GetStockObject% (above) to select the OEM character set. Return Value The return value identifies the handle to the object previously used. This value should be saved in a variable such that SelectObject can be called again to restore the original object used. It is NULL if there is an error. The following steps describe how to create a program example that demonstrates how to print ASCII characters. 1. Run Visual Basic. 2. From the File menu, choose New Project (ALT, F, N). 3. Create a command button called Command1 on the default form (Form1). 4. Add the following declarations to the General Declarations section of Form1. Declare Function GetStockObject% Lib "GDI" (ByVal nIndex%) Declare Function SelectObject% Lib "GDI" (ByVal hdc%, ByVal hObject%) 5. Place the following code in the Command1 click event procedure: Sub Command1_Click () Const OEM_FIXED_FONT = 10 Const PIXEL = 3 Dim hOEM As Integer '* handle to the OEM font object Dim Y, H As Single '* save the scale mode so that you can reset later Saved% = Form1.ScaleMode Form1.ScaleMode = PIXEL '* Get the character height and subtract the external leading H = Form1.TextHeight(Chr$(200)) - 1 '* get the handle to the desired font hOEM = GetStockObject(OEM_FIXED_FONT) '* select the object relating to the font handle, if '* successful then print the desired characters. PreviousObject% = SelectObject(Form1.hDC, hOEM) If PreviousObject% Then Form1.CurrentX = 10: Form1.CurrentY = 10 Print Chr$(201); Chr$(187); Form1.CurrentX = 10: Form1.CurrentY = Form1.CurrentY + H Print Chr$(200); Chr$(188) '* Reinstate previous font hOEM = SelectObject(Form1.hDC, PreviousObject%) Else '* SelectObject was unsuccessful MsgBox "Couldn't find OEM fonts", 48 End If '* reset the scale mode Form1.ScaleMode = Saved% End Sub 6. From the Run menu, choose Start. 7. Click the Command1 button. When the Command1 button is clicked or selected, a small box with a double border will be drawn in the upper-left corner of the screen. The box is drawn using characters associated with the extended ASCII character set. References: 1. "Programming Windows: the Microsoft Guide to Writing Applications for Windows 3," by Charles Petzold (published by Microsoft Press, 1990) 2. "Peter Norton's Windows 3.0 Power Programming Techniques," by Peter Norton & Paul Yao (published by Bantam Computer Books, 1990) 3. "Microsoft Windows 3.0 Software Development Kit: Reference Volume 1" 4. The WINSDK.HLP file shipped with Microsoft Windows 3.0 Software Development Kit. Title: Simulating ON KEY Key Trapping with KeyDown Event in VB Document Number: Q75858 Publ Date: 9-SEP-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Although there is no ON KEY GOSUB statement in Visual Basic, the effect of ON KEY event handling can be achieved in Visual Basic. Visual Basic forms and controls that are able to get focus within Visual Basic have a [form/control|_KeyDown event procedure that can simulate the effects of the ON KEY statements of DOS-based Basics. The process of using the KeyDown is more powerful and more flexible than the ON KEY statement. This information applies to the Microsoft Visual Basic programming system version 1.0 for Windows. More Information: If you press a key while one of your Visual Basic forms or controls has the focus, the KeyDown event procedure for that form or control will be executed. Within the KeyDown event procedure, you can call a global procedure and pass the actual key states to the global procedure to create the same effect as the ON KEY event trapping that is performed in the DOS-based Basic. You can also pass the control or form where the KeyDown occurred to the global procedure. Passing the control or form itself will allow the global procedure to tell what control or form called the global procedure. To create a small example, perform the following steps: 1. Within Visual Basic's Project window, double-click the GLOBAL.BAS file to bring up the code window. From Visual Basic's Code menu, choose "Load text...". Load the CONSTANTS.TXT file that came with Visual Basic. Note: If you already have text within the GLOBAL.BAS file, you will need to create another module, add the CONSTANTS.TXT to this file, and then cut and paste to the GLOBAL.BAS file. 2. Create two text boxes on a form. 3. In the Text1_KeyDown event procedure, add the following code: Call OnKeyGoSub(KeyCode, Shift, Text1) 4. In the Text2_KeyDown event procedure, add the following code: Call OnKeyGoSub(KeyCode, Shift, Text2) 5. Add a Label to Form1 called Label1. 6. At the global-declaration section for form1, add the following procedure: Sub OnKeyGoSub (KeyCode%, Shift%, Ctrl As Control) Select Case KeyCode% Case KEY_MENU: Key$ = "" Case KEY_SHIFT: Key$ = "" Case KEY_CONTROL: Key$ = "" Case KEY_F1: Key$ = " F1 " Case KEY_UP: Key$ = " UP key" Case KEY_CAPITAL: Key$ = "CAP LOCKS" Case Else: Key$ = Chr$(KeyCode%) End Select Select Case Shift% Case SHIFT_MASK: Shft$ = "Shift" Case ALT_MASK: Shft$ = "Alt" Case CTRL_MASK: Shft$ = "Ctrl" Case Else: Shft$ = "" End Select ControlName$ = Ctrl.CtrlName Label1.Caption="Key:"+ Shft$+ " "+ Key$+" from "+ ControlName$ End Sub 7. Run the program. Move back and forth between the two text boxes using either the TAB key or the mouse. Experiment with any key in combination with the ALT, CTRL, and SHIFT keys. Also try the F1 key and the UP ARROW key. This example is limited but shows how you could simulate the ON KEY statements or key trapping within Visual Basic. Placing the call to the key trap procedure within any KeyDown event procedure will simulate the ON KEY statement.