04 Mar 2010 @ 6:14 AM 

The Timer, Line, Shape And OLE Controls In Visual Basic 6 (VB6)

 

The Timer Control

A Timer control is invisible at run time, and its purpose is to send a periodic pulse to the current application. You can trap this pulse by writing code in the Timer’s Timer event procedure and take advantage of it to execute a task in the background or to monitor a user’s actions. This control exposes only two meaningful properties: Interval and Enabled. Interval stands for the number of milliseconds between subsequent pulses (Timer events), while Enabled lets you activate or deactivate events. When you place the Timer control on a form, its Interval is 0, which means no events. Therefore, remember to set this property to a suitable value in the Properties window or in the Form_Load event procedure:

Private Sub Form_Load()
Timer1.Interval = 500 ‘ Fire two Timer events per second.
End Sub

Timer controls let you write interesting programs with just a few lines of code. The typical (and abused) example is a digital clock. Just to make things a bit more compelling, I added flashing colons:

Private Sub Timer1_Timer()
Dim strTime As String
strTime = Time$
If Mid$(lblClock.Caption, 3, 1) = “:” Then
Mid$(strTime, 3, 1)= ” ”
Mid$(strTime, 6, 1) = ” ”
End If
lblClock.Caption = strTime
End Sub

You must be careful not to write a lot of code in the Timer event procedure because this code will be executed at every pulse and therefore can easily degrade your application’s performance. Just as important, never execute a DoEvents statement inside a Timer event procedure because you might cause the procedure to be reentered, especially if the Interval property is set to a small value and there’s a lot of code inside the procedure.

Timer controls are often useful for updating status information on a regular basis. For example, you might want to display on a status bar a short description of the control that currently has the input focus. You can achieve that by writing some code in the GotFocus event for all the controls on the form, but when you have dozens of controls this will require a lot of code (and time). Instead, at design time load a short description for each control in its Tag property, and then place a Timer control on the form with an Interval setting of 500. This isn’t a time-critical task, so you can use an even larger value. Finally add two lines of code to the control’s Timer event:

Private Sub Timer1_Timer()
On Error Resume Next
lblStatusBar.Caption = ActiveControl.Tag
End Sub

The Line Control

The Line control is a decorative control whose only purpose is let you draw one or more straight lines at design time, instead of displaying them using a Line graphical method at run time. This control exposes a few properties whose meaning should sound familiar to you by now: BorderColor (the color of the line), BorderStyle (the same as a form’s DrawStyle property), BorderWidth (the same as a form’s DrawWidth property), and DrawMode. While the Line control is handy, remember that using a Line method at run time is usually better in terms of performance.

The Shape Control

In a sense, the Shape control is an extension of the Line control. It can display six basic shapes: Rectangle, Square, Oval, Circle, Rounded Rectangle, and Rounded Square. It supports all the Line control’s properties and a few more: BorderStyle (0-Transparent, 1-Solid), FillColor, and FillStyle (the same as a form’s properties with the same names). The same performance considerations I pointed out for the Line control apply to the Shape control.

The OLE Control

When OLE first made its appearance, the concept of Object Linking and Embedding seemed to most developers nothing short of magic. The ability to embed a Microsoft Word Document or a Microsoft Excel worksheet within another Windows application seemed an exciting one, and Microsoft promptly released the OLE control—then called the OLE Container control—to help Visual Basic support this capability.

In the long run, however, the Embedding term in OLE has lost much of its appeal and importance, and nowadays programmers are more concerned and thrilled about Automation, a subset of OLE that lets them control other Windows applications from the outside, manipulating their object hierarchies through OLE. For this reason, I won’t describe the OLE control: It’s a rather complex object, and a thorough description of its many properties, methods, and events (and quirks) would take too much space.

Posted By: admin
Last Edit: 04 Mar 2010 @ 06:14 AM

EmailPermalinkComments (0)
Tags
 04 Mar 2010 @ 6:11 AM 

PictureBox And Image Controls In Visual Basic 6

 

Both PictureBox and Image controls let you display an image, so let’s compare them and see when it makes sense to choose one or the other.

The PictureBox Control

PictureBox controls are among the most powerful and complex items in the Visual Basic Toolbox window. In a sense, these controls are more similar to forms than to other controls. For example, PictureBox controls support all the properties related to graphic output, including AutoRedraw, ClipControls, HasDC, FontTransparent, CurrentX, CurrentY, and all the Drawxxxx, Fillxxxx, and Scalexxxx properties. PictureBox controls also support all graphic methods, such as Cls, PSet, Point, Line, and Circle and conversion methods, such as ScaleX, ScaleY, TextWidth, and TextHeight. In other words, all the techniques that I described for forms can also be used for PictureBox controls (and therefore won’t be covered again in this section).

Loading images

Once you place a PictureBox on a form, you might want to load an image in it, which you do by setting the Picture property in the Properties window. You can load images in many different graphic formats, including bitmaps (BMP), device independent bitmaps (DIB), metafiles (WMF), enhanced metafiles (EMF), GIF and JPEG compressed files, and icons (ICO and CUR). You can decide whether a control should display a border, resetting the BorderStyle to 0-None if necessary. Another property that comes handy in this phase is AutoSize: Set it to True and let the control automatically resize itself to fit the assigned image.

You might want to set the Align property of a PictureBox control to something other than the 0-None value. By doing that, you attach the control to one of the four form borders and have Visual Basic automatically move and resize the PictureBox control when the form is resized. PictureBox controls expose a Resize event, so you can trap it if you need to move and resize its child controls too.

You can do more interesting things at run time. To begin with, you can programmatically load any image in the control using the LoadPicture function:

Picture1.Picture = LoadPicture(“c:\windows\setup.bmp”)

and you can clear the current image using either one of the following statements:

‘ These are equivalent.
Picture1.Picture = LoadPicture(“”)
Set Picture1.Picture = Nothing

The LoadPicture function has been extended in Visual Basic 6 to support icon files containing multiple icons. The new syntax is the following:

LoadPicture(filename, [size], [colordepth], [x], [y])

where values in square brackets are optional. If filename is an icon file, you can select a particular icon using the size or colordepth arguments. Valid sizes are 0-vbLPSmall, 1-vbLPLarge (system icons whose sizes depend on the video driver), 2-vbLPSmallShell, 3-vbLPLargeShell (shell icons whose dimensions are affected by the Caption Button property as set in the Appearance tab in the screen’s Properties dialog box), and 4-vbLPCustom (size is determined by x and y). Valid color depths are 0-vbLPDefault (the icon in the file that best matches current screen settings), 1-vbLPMonochrome, 2-vbLPVGAColor (16 colors), and 3-vbLPColor (256 colors).

You can copy an image from one PictureBox control to another by assigning the target control’s Picture property:

Picture2.Picture = Picture1.Picture

The PaintPicture method

PictureBox controls are equipped with a very powerful method that enables the programmer to perform a wide variety of graphic effects, including zooming, scrolling, panning, tiling, flipping, and many fading effects: This is the PaintPicture method. (This method is also exposed by form objects, but it’s most often used with PictureBox controls.) In a nutshell, this method performs a pixel-by-pixel copy from a source control to a destination control. The complete syntax of this method is complex and rather confusing:

DestPictBox.PaintPicture SrcPictBox.Picture, destX, destY, [destWidth], _
[destHeight], [srcX], [srcY2], [srcWidth], [srcHeight], [Opcode])

The only required arguments are the source PictureBox control’s Picture property and the coordinates inside the destination control where the image must be copied. The destX / destY arguments are expressed in the ScaleMode of the destination control; by varying them, you can make the image appear exactly where you want. For example, if the source PictureBox control contains a bitmap 3000 twips wide and 2000 twips tall, you can center this image on the destination control with this command:

picDest.PaintPicture picSource.Picture, (picDest.ScaleWidth – 3000) / 2, _
(picDest.ScaleHeight – 2000) / 2

In general, Visual Basic doesn’t provide a way to determine the size of a bitmap loaded into a PictureBox control. But you can derive this information if you set the control’s AutoSize property to True and then read the control’s ScaleWidth and ScaleHeight properties. If you don’t want to resize a visible control just to learn the dimensions of a bitmap, you can load it into an invisible control, or you can use this trick, based on the fact that the Picture property returns an StdPicture object, which in turn exposes the Height and Width properties:

‘ StdPicture’s Width and Height properties are expressed in
‘ Himetric units. 
With Picture1
width = CInt(.ScaleX(.Picture.Width, vbHimetric, vbPixels))
height = CInt(.ScaleY(.Picture.Height, vbHimetric, _
vbPixels))
End With

By the way, in all subsequent code examples I assume that the source PictureBox control’s ScaleWidth and ScaleHeight properties match the actual bitmap’s size. By default, the PaintPicture method copies the entire source bitmap. But you can copy just a portion of it, passing a value for srcWidth and srcHeight:

‘ Copy the upper left portion of the source image.
picDest.PaintPicture picSource.Picture, 0, 0, , , , , _
picSource.ScaleWidth / 2, picSource.ScaleHeight / 2

If you’re copying just a portion of the source image, you probably want to pass a specific value for the srcX and srcY values as well, which correspond to the coordinates of the top-left corner of the area that will be copied from the source control:

‘ Copy the bottom-right portion of the source image
‘ in the corresponding corner in the destination. 
wi = picSource.ScaleWidth / 2
he = picSource.ScaleHeight / 2
picDest.PaintPicture picSource.Picture, wi, he, , , wi, he, wi, he

You can use this method to tile a target PictureBox control (or form) with multiple copies of an image stored in another control:

‘ Start with the leftmost column.
x = 0
Do While x < picDest.ScaleWidth
y = 0
‘ For each column, start at the top and work downward.
Do While y < picDest.ScaleHeight
picDest.PaintPicture picSource.Picture, x, y, , , 0, 0
‘ Next row
y = y + picSource.ScaleHeight
Loop
‘ Next column
x = x + picSource.ScaleWidth
Loop

Another great feature of the PaintPicture method lets you resize the image while you transfer it, and you can even specify different zoom-in and zoom-out factors for the x- and y-axes independently. You just have to pass a value to the destWidth and destHeight arguments: If these values are greater than the source image’s corresponding dimensions, you achieve a zoom-in effect, and if they are less you get a zoom-out effect. For example, see how you can double the size of the original image:

picDest.PaintPicture picSource.Picture, 0, 0, _
picSource.ScaleWidth * 2, picSource.ScaleHeight * 2

As a special case of the syntax of the PaintPicture method, the source image can even be flipped along its x-axis, y-axis, or both by passing negative values for these arguments:

‘ Flip horizontally.
picDest.PaintPicture picSource.Picture, _
picSource.ScaleWidth, 0, -picSource.ScaleWidth
‘ Flip vertically.
picDest.PaintPicture picSource.Picture, 0, _
picSource.ScaleHeight, , -picSource.ScaleHeight
‘ Flip the image on both axes.
picDest.PaintPicture picSource.Picture, picSource.ScaleWidth, _
picSource.ScaleHeight, -picSource.ScaleWidth, -picSource.ScaleHeight

As you might expect, you can combine all these effects together, magnifying, reducing, or flipping just a portion of the source image, and have the result appear in any point of the destination PictureBox control (or form). You should find no problem in reusing all those routines in your own applications.

As if all these capabilities weren’t enough, we haven’t covered the last argument of the PaintPicture method yet. The opcode argument lets you specify which kind of Boolean operation must be performed on pixel bits as they’re transferred from the source image to the destination. The values you can pass to this argument are the same that you assign to the DrawMode property. The default value is 13-vbCopyPen, which simply copies the source pixels in the destination control. By playing with the other settings, you can achieve many interesting graphical effects, including simple animations.

The Image Control

Image controls are far less complex than PictureBox controls. They don’t support graphical methods or the AutoRedraw and the ClipControls properties, and they can’t work as containers, just to hint at their biggest limitations. Nevertheless, you should always strive to use Image controls instead of PictureBox controls because they load faster and consume less memory and system resources. Remember that Image controls are windowless objects that are actually managed by Visual Basic without creating a Windows object. Image controls can load bitmaps and JPEG and GIF images.

When you’re working with an Image control, you typically load a bitmap into its Picture property either at design time or at run time using the LoadPicture function. Image controls don’t expose the AutoSize property because by default they resize to display the contained image (as it happens with PictureBox controls set at AutoSize = True). On the other hand, Image controls support a Stretch property that, if True, resizes the image (distorting it if necessary) to fit the control. In a sense, the Stretch property somewhat remedies the lack of the PaintPicture method for this control. In fact, you can zoom in to or reduce an image by loading it in an Image control and then setting its Stretch property to True to change its width and height:

‘ Load a bitmap.
Image1.Stretch = False
Image1.Picture = LoadPicture(“c:\windows\setup.bmp”)
‘ Reduce it by a factor of two.
Image1.Stretch = True
Image1.Move 0, 0, Image1.Width / 2, Image1.Width / 2

Image controls support all the usual mouse events. For this reason, many Visual Basic developers have used Image controls to simulate graphical buttons and toolbars. Now that Visual Basic natively supports these controls, you’d probably better use Image controls only for what they were originally intended.

Posted By: admin
Last Edit: 04 Mar 2010 @ 06:11 AM

EmailPermalinkComments (0)
Tags
 02 Mar 2010 @ 3:51 AM 

Label And Frame Controls In Visual Basic 6 (VB6)

 

Label and Frame controls have a few features in common, so it makes sense to explain them together. First they’re mostly “decorative” controls that contribute to the user interface but are seldom used as programmable objects. In other words, you often place them on the form and arrange their properties as your user interface needs dictate, but you rarely write code to serve their events, generally, or manipulate their properties at run time.

Label Controls

Most people use Label controls to provide a descriptive caption and possibly an associated hot key for other controls, such as TextBox, ListBox, and ComboBox, that don’t expose the Caption property. In most cases, you just place a Label control where you need it, set its Caption property to a suitable string (embedding an ampersand character in front of the hot key you want to assign), and you’re done. Caption is the default property for Label controls. Be careful to set the Label’s TabIndex property so that it’s 1 minus the TabIndex property of the companion control.

Other useful properties are BorderStyle(if you want the Label control to appear inside a 3D border) and Alignment (if you want to align the caption to the right or center it on the control). In most cases, the alignment depends on how the Label control relates to its companion control: for example, if the Label control is placed to the left of its companion field, you might want to set its Alignment property to 1-Right Justify. The value 2-Center is especially useful for stand-alone Label controls.

Different settings for the Alignment property of Label controls.

You can insert a literal & character in a Label control’s Caption property by doubling it. For example, to see Research & Development you have to type &Research && Development. Note that if you have multiple but isolated &s, the one that selects the hot key is the last one and all others are ignored. This tip applies to all the controls that expose a Caption property. (The & has no special meaning in forms’ Caption properties, however.)

If the caption string is a long one, you might want to set the Label’s WordWrap property to True so that it will extend for multiple lines instead of being truncated by the right border of the control. Alternatively, you might decide to set the AutoSize property to True and let the control automatically resize itself to accommodate longer caption strings.

You sometimes need to modify the default value of a Label’s BackStyle property. Label controls usually cover what’s already on the form’s surface (other lightweight controls, output from graphic methods, and so on) because their background is considered to be opaque. If you want to show a character string somewhere on the form but at the same time you don’t want to obscure underlying objects, set the BackStyle property to 0-Transparent.

If you’re using the Label control to display data read from elsewhere—for example, a database field or a text file—you should set its UseMnemonics property to False. In this case, & characters have no special meaning to the control, and so you indirectly turn off the control’s hot key capability. I mention this property because in older versions of Visual Basic, you had to manually double each & character to make the ampersand appear in text. I don’t think all developers are aware that you can now treat ampersands like regular characters.

As I said before, you don’t usually write code in Label control event procedures. This control exposes only a subset of the events supported by other controls. For example, because Label controls can never get the input focus, they don’t support GotFocus, LostFocus, or any keyboard-related events. In practice, you can take advantage only of their mouse events: Click, DblClick, MouseDown, MouseMove, and MouseUp. If you’re using a Label control to display data read from a database, you might sometimes find it useful to write code in its Change event. A Label control doesn’t expose a specific event that tells programmers when users press its hot keys.

You can do some interesting tricks with Label controls. For example, you can use them to provide rectangular hot spots for images loaded onto the form. To create that context-sensitive ToolTip, I loaded the image on the form using the form’s Picture property and then I placed a Label control over the Microsoft BackOffice logo, setting its Caption property to an empty string and the BackStyle property to 0-Transparent. These properties make the Label invisible, but it correctly shows its ToolTip when necessary. And because it still receives all mouse events, you can use its Click event to react to users’ actions.

Frame Controls

Frame controls are similar to Label controls in that they can serve as captions for those controls that don’t have their own. Moreover, Frame controls can also (and often do) behave as containers and host other controls. In most cases, you only need to drop a Frame control on a form and set its Caption property. If you want to create a borderless frame, you can set its BorderStyle property to 0-None.

Controls that are contained in the Frame control are said to be child controls. Moving a control at design time over a Frame control—or over any other container, for that matter—doesn’t automatically make that control a child of the Frame control. After you create a Frame control, you can create a child control by selecting the child control’s icon in the Toolbox and drawing a new instance inside the Frame’s border. Alternatively, to make an existing control a child of a Frame control, you must select the control, press Ctrl+X to cut it to the Clipboard, select the Frame control, and press Ctrl+V to paste the control inside the Frame. If you don’t follow this procedure and you simply move the control over the Frame, the two controls remain completely independent of each other, even if the other control appears in front of the Frame control.

Frame controls, like all container controls, have two interesting features. If you move a Frame control, all the child controls go with it. If you make a container control disabled or invisible, all its child controls also become disabled or invisible. You can exploit these features to quickly change the state of a group of related controls.

Posted By: admin
Last Edit: 02 Mar 2010 @ 03:51 AM

EmailPermalinkComments (0)
Tags
 02 Mar 2010 @ 3:43 AM 

VB6 CommandButton And OptionButton Controls – Visual Basic 6

 

When compared to TextBox controls, these controls are really simple. Not only do they expose relatively few properties, they also support a limited number of events, and you don’t usually write much code to manage them.

CommandButton Controls in VB6

Using CommandButton controls is trivial. In most cases, you just draw the control on the form’s surface, set its Caption property to a suitable string (adding an & character to associate a hot key with the control if you so choose), and you’re finished, at least with user-interface issues. To make the button functional, you write code in its Click event procedure, as in this fragment:

Private Sub Command1_Click()
‘ Save data, then unload the current form.
Call SaveDataToDisk
Unload Me
End Sub

You can use two other properties at design time to modify the behavior of a CommandButton control. You can set the Default property to True if it’s the default push button for the form (the button that receives a click when the user presses the Enter key—usually the OK or Save button). Similarly, you can set the Cancel property to True if you want to associate the button with the Escape key.

The only relevant CommandButton’s run-time property is Value, which sets or returns the state of the control (True if pressed, False otherwise). Value is also the default property for this type of control. In most cases, you don’t need to query this property because if you’re inside a button’s Click event you can be sure that the button is being activated. The Value property is useful only for programmatically clicking a button:

This fires the button’s Click event.
Command1.Value = True

The CommandButton control supports the usual set of keyboard and mouse events (KeyDown, KeyPress, KeyUp, MouseDown, MouseMove, MouseUp, but not the DblClick event) and also the GotFocus and LostFocus events, but you’ll rarely have to write code in the corresponding event procedures.

Properties of a CommandButton control

 

  • To display text on a CommandButton control, set its Caption property.
  • An event can be activated by clicking on the CommandButton.
  • To set the background colour of the CommandButton, select a colour in the BackColor property.
  • To set the text colour set the Forecolor property.
  • Font for the CommandButton control can be selected using the Font property.
  • To enable or disable the buttons set the Enabled property to True or False
  • To make visible or invisible the buttons at run time, set the Visible property to True or False.
  • Tooltips can be added to a button by setting a text to the Tooltip property of the CommandButton.
  • A button click event is handled whenever a command button is clicked. To add a click event handler, double click the button at design time, which adds a subroutine like the one given below.

    Private Sub Command1_Click( )
    ………………

  • OptionButton Controls in VB6

    OptionButton controls are also known as radio buttons because of their shape. You always use OptionButton controls in a group of two or more because their purpose is to offer a number of mutually exclusive choices. Anytime you click on a button in the group, it switches to a selected state and all the other controls in the group become unselected.

    Preliminary operations for an OptionButton control are similar to those already described for CheckBox controls. You set an OptionButton control’s Caption property to a meaningful string, and if you want you can change its Alignment property to make the control right aligned. If the control is the one in its group that’s in the selected state, you also set its Valueproperty to True. (The OptionButton’s Value property is a Boolean value because only two states are possible.) Value is the default property for this control.

    At run time, you typically query the control’s Value property to learn which button in its group has been selected. Let’s say you have three OptionButton controls, named optWeekly, optMonthly, and optYearly. You can test which one has been selected by the user as follows:

    If optWeekly.Value Then
    ‘ User prefers weekly frequency.
    ElseIf optMonthly.Value Then
    ‘ User prefers monthly frequency.
    ElseIf optYearly.Value Then
    ‘ User prefers yearly frequency.
    End If

    Strictly speaking, you can avoid the test for the last OptionButton control in its group because all choices are supposed to be mutually exclusive. But the approach I just showed you increases the code’s readability.

    A group of OptionButton controls is often hosted in a Frame control. This is necessary when there are other groups of OptionButton controls on the form. As far as Visual Basic is concerned, all the OptionButton controls on a form’s surface belong to the same group of mutually exclusive selections, even if the controls are placed at the opposite corners of the window. The only way to tell Visual Basic which controls belong to which group is by gathering them inside a Frame control. Actually, you can group your controls within any control that can work as a container—PictureBox, for example—but Frame controls are often the most reasonable choice.

    Example

    Open a new Standard EXE project and the save the Form as Option.frm and save the project as Option.vbp.

    Design the Form as per the following specifications table.

    Object                           Property                              Settings

    Label                                          Caption                                               Enter a Number

                                                          Name                                                   Label1

    TextBox                                     Text                                                      (empty)

                                                          Name                                                    Text1

    CommandButton                   Caption                                                &Close

                                                          Name                                                    Command1

    OptionButton                           Caption                                                &Octal

                                                           Name                                                    optOct

    OptionButton                           Caption                                                &Hexadecimal

                                                           Name                                                    optHex

    OptionButton                           Caption                                                &Decimal 

                                                           Name                                                    optDec

    The application responds to the following events

    .The change event of the TextBox reads the value and stores it in a form-level numeric variable.

    • The click event of optOct button returns curretval in octal.
    • The click event of the optHex button curerntval in hexadecimal
    • The click event of the optDec button returns the decimal equivalent of the value held currentval.

      The Val function is used to translate string to a number and can recognize Octal and Hexadecimal strings. The LTrim function trims the leading blanks in the text. The following code is entered in the click events of the OptionButton controls.

      Private Sub optOct_Click()
      Text1.Text = Oct(currentval)
      End Sub

      Private Sub optHex_Click()
      Text1.Text = Hex(currentval)
      End Sub

      Private Sub optDec_Click()
      Text1.Text = Format(currentval)
      End Sub

      The follwoing code is entered in the click event of teh Close button.

      Private Sub cmdClose_Click()
      Unlod Me
      End Sub

        
                                            

  • Posted By: admin
    Last Edit: 02 Mar 2010 @ 03:43 AM

    EmailPermalinkComments (0)
    Tags
     02 Mar 2010 @ 3:28 AM 

    Multiline TextBox Controls – Visual Basic 6 TextBox Control

     

    You create multiline TextBox controls by setting the MultiLine property to True and the ScrollBars property to 2-Vertical or 3-Both. A vertical scroll bar causes the contents of the control to automatically wrap when a line is too long for the control’s width, so this setting is most useful when you’re creating memo fields or simple word processor-like programs. If you have both a vertical and a horizontal scroll bar, the TextBox control behaves more like a programmer’s editor, and longer lines simply extend beyond the right border. I’ve never found a decent use for the other settings of the ScrollBars property (0-None and 1-Horizontal) in a multiline TextBox control. Visual Basic ignores the ScrollBars property if MultiLine is False.

    Both these properties are read-only at run time, which means that you can’t alternate between a regular and a multiline text box, or between a word processor-like multiline field (ScrollBars = 2-Vertical) and an editorlike field (ScrollBars = 3-Both). To tell the whole truth, Visual Basic’s support for multiline TextBox controls leaves much to be desired. You can do very little with such controls at run time, except to retrieve and set their Text properties. When you read the contents of a multiline TextBox control, it’s up to you to determine where each line of text starts and ends. You do this with a loop that searches for carriage return (CR) and line feed (LF) pairs, or even more easily using the new Split string function:

    ‘ Print the lines of text in Text1, labeling them with their line numbers.
    Dim lines() As String, i As Integer
    lines() = Split(Text1.Text, vbCrLf)
    For i = 0 To UBound(lines)
    Print (i + 1) & “: ” & lines(i)
    Next

    The support offered by Visual Basic for multiline TextBox controls ends here. The language doesn’t offer any means for learning such vital information as at which point each line of text wraps, which are the first visible line and the first visible column, which line and column the caret is on, and so on. Moreover, you have no means of programmatically scrolling through a multiline text box. The solutions to these problems require Microsoft Windows API programming. In my opinion, however, Visual Basic should offer these features as built-in properties and methods.

    You should account for two minor issues when including one or more multiline TextBox controls on your forms. When you enter code in a word processor or an editor, you expect that the Enter key will add a newline character (more precisely, a CR-LF character pair) and that the Tab key will insert a tab character and move the caret accordingly. Visual Basic supports these keys, but because both of them have special meaning to Windows the support is limited: The Enter key adds a CR-LF pair only if there isn’t a default push button on the form, and the Tab key inserts a tab character only if there aren’t other controls on the form whose TabStop property is set to True. In many circumstances, these requirements can’t be met, and some of your users will find your user interface annoying. If you can’t avoid this problem, at least add a reminder to your users that they can add new lines using the Ctrl+Enter key combination and insert tab characters using the Ctrl+Tab key combination. Another possible approach is to set the TabStop property to False for all the controls in the form in the multiline TextBox’s GotFocus event and to restore the original values in the LostFocus event procedure.

    Posted By: admin
    Last Edit: 02 Mar 2010 @ 03:28 AM

    EmailPermalinkComments (0)
    Tags
     02 Mar 2010 @ 3:26 AM 

    Auto-Tabbing Fields And Formatting Text – Visual Basic 6 TextBox Control

     

    Auto-Tabbing Fields

    Users aren’t usually delighted to spend all their time at the keyboard. Your job as a programmer is to make their jobs easier, and so you should strive to streamline their everyday work as much as possible. One way to apply this concept is to provide them with auto-tabbing fields, which are fields that automatically advance users to the next field in the Tab order as soon as they enter a valid value. Most often, auto-tabbing fields are those TextBox controls whose MaxLength property has been assigned a non-null value. Implementing such an auto-tabbing field in Visual Basic is straightforward:

    Private Sub Text1_Change()
    If Len(Text1.Text) = Text1.MaxLength Then SendKeys “{Tab}”
    End Sub

    The trick, as you see, is to have your program provide the Tab key on behalf of your user. In some cases, this simple approach doesn’t work—for example, when you paste a long string into the field. You might want to write code that works around this and other shortcomings. Auto-tabbing is a nice feature but not vital to the application, so whether you write a workaround or not isn’t a real problem in most cases.

    Formatting Text

    Many business applications let you enter data in one format and then display it in another. For example, numeric values can be formatted with thousand separators and a fixed number of decimal digits. Currency values might have a $ symbol (or whatever your national currency symbol is) automatically inserted. Phone numbers can be formatted with dashes to split into groups of digits. Credit-card numbers can be made more readable with embedded spaces. Dates can be shown in long-date format (“July 22, 2007″). And so on.

    The LostFocus event is an ideal occasion to format the contents of a TextBox control as soon as the input focus leaves it. In most cases, you can perform all your formatting chores using the Format function. For example, you can add thousand separators to a numeric value in the txtNumber control using this code:

    Private Sub txtNumber_LostFocus()
    On Error Resume Next
    txtNumber.Text = Format(CDbl(txtNumber.Text), _
    “#,###,###,##0.######”)
    End Sub

    When the field regains the focus, you’ll want to get rid of those thousand separators. You can do it easily using the CDbl function:

    Private Sub txtNumber_GotFocus()
    ‘ On Error is necessary to account for empty fields.
    On Error Resume Next
    txtNumber.Text = CDbl(txtNumber.Text)
    End Sub

    In some cases, however, formatting and unformatting a value isn’t that simple. For example, you can format a Currency value to add parentheses around negative numbers, but there’s no built-in Visual Basic function able to return a string formatted in that way to its original condition. Fear not, because nothing prevents you from creating your own formatting and unformatting routines. I have built two general-purpose routines for you to consider.

    The FilterString routine filters out all unwanted characters in a string:

    Function FilterString(Text As String, validChars As String) As String
    Dim i As Long, result As String
    For i = 1 To Len(Text)
    If InStr(validChars, Mid$(Text, i, 1)) Then
    result = result & Mid$(Text, i, 1)
    End If
    Next
    FilterString = result
    End Function

    FilterNumber builds on FilterString to strip down all formatting characters in a number and can also trim trailing decimal zeros:

    Function FilterNumber(Text As String, TrimZeros As Boolean) As String
    Dim decSep As String, i As Long, result As String
    ‘ Retrieve the decimal separator symbol.
    decSep = Format$(0.1, “.”)
    ‘ Use FilterString for most of the work.
    result = FilterString(Text, decSep & “-0123456789″)
    ‘ Do the following only if there is a decimal part and the
    ‘ user requested that nonsignificant digits be trimmed.
    If TrimZeros And InStr(Text, decSep) > 0 Then
    For i = Len(result) To 1 Step -1
    Select Case Mid$(result, i, 1)
    Case decSep
    result = Left$(result, i – 1)
    Exit For
    Case “0″
    result = Left$(result, i – 1)
    Case Else
    Exit For
    End Select
    Next
    End If
    FilterNumber = result
    End Function

    The feature I like most in FilterNumber is that it’s locale-independent. It works equally well on both sides of the Atlantic ocean (and on other continents, as well.) Instead of hard-coding the decimal separator character in the code, the routine determines it on the fly, using the Visual Basic for Applications (VBA) Format function. Start thinking internationally now, and you won’t have a nervous breakdown when you have to localize your applications in German, French, and Japanese.

    The Format function lets you retrieve many locale-dependent characters and separators. 
    Format$(0.1, “.”) ‘ Decimal separator
    Format$(1, “,”) ‘ Thousand separator
    Mid$(Format(#1/1/99#, “short date”), 2, 1) ‘ Date separator

    You can also determine whether the system uses dates in “mm/dd/yy” (U.S.) format or “dd/mm/yy” (European) format, using this code:

    If Left$(Format$(“12/31/1999″, “short date”), 2) = 12 Then
    ‘ mm/dd/yy format

    Else
    ‘ dd/mm/yyyy format

    End If

    There’s no direct way to determine the currency symbol, but you can derive it by analyzing the result of this function:

    Format$(0, “currency”) ‘ Returns “$0.00″ in US

    It isn’t difficult to write a routine that internally uses the information I’ve just given you to extract the currency symbol as well as its default position (before or after the number) and the default number of decimal digits in currency values. Remember, in some countries the currency symbol is actually a string of two or more characters.

    To illustrate these concepts in action, I’ve built a simple demonstration program that shows how you can format numbers, currency values, dates, phone numbers, and credit-card numbers when exiting a field, and how you can remove that formatting from the result when the input focus reenters the TextBox control. Follwoing figure shows the formatted results.

    Formatting and unformatting the contents of TextBox controls makes for more professional-looking applications

    Private Sub txtNumber_GotFocus()
    ‘ Filter out nondigit chars and trailing zeros.
    On Error Resume Next
    txtNumber.Text = FilterNumber(txtNumber.Text, True)
    End Sub
    Private Sub txtNumber_LostFocus()
    ‘ Format as a number, grouping thousand digits.
    On Error Resume Next
    txtNumber.Text = Format(CDbl(txtNumber.Text), _
    “#,###,###,##0.######”)
    End Sub

    Private Sub txtCurrency_GotFocus()
    ‘ Filter out nondigit chars and trailing zeros.
    ‘ Restore standard text color.
    On Error Resume Next
    txtCurrency.Text = FilterNumber(txtCurrency.Text, True)
    txtCurrency.ForeColor = vbWindowText
    End Sub
    Private Sub txtCurrency_LostFocus()
    On Error Resume Next
    ‘ Show negative values as red text.
    If CDbl(txtCurrency.Text) < 0 Then txtCurrency.ForeColor = vbRed
    ‘ Format currency, but don’t use parentheses for negative numbers.
    ‘ (FormatCurrency is a new VB6 string function.)
    txtCurrency.Text = FormatCurrency(txtCurrency.Text, , , vbFalse)
    End Sub

    Private Sub txtDate_GotFocus()
    ‘ Prepare to edit in short-date format.
    On Error Resume Next
    txtDate.Text = Format$(CDate(txtDate.Text), “short date”)
    End Sub
    Private Sub txtDate_LostFocus()
    ‘ Convert to long-date format upon exit.
    On Error Resume Next
    txtDate.Text = Format$(CDate(txtDate.Text), “d MMMM yyyy”)
    End Sub

    Private Sub txtPhone_GotFocus()
    ‘ Trim embedded dashes.
    txtPhone.Text = FilterString(txtPhone.Text, “0123456789″)
    End Sub
    Private Sub txtPhone_LostFocus()
    ‘ Add dashes if necessary.
    txtPhone.Text = FormatPhoneNumber(txtPhone.Text)
    End Sub

    Private Sub txtCreditCard_GotFocus()
    ‘ Trim embedded spaces.
    txtCreditCard.Text = FilterNumber(txtCreditCard.Text, True)
    End Sub
    Private Sub txtCreditCard_LostFocus()
    ‘ Add spaces if necessary.
    txtCreditCard.Text = FormatCreditCard(txtCreditCard.Text)
    End Sub

    Instead of inserting the code that formats phone numbers and credit-card numbers right in the LostFocus event procedures, I built two distinct routines, which can be more easily reused in other applications, as shown in the code below.

    Function FormatPhoneNumber(Text As String) As String
    Dim tmp As String
    If Text <> “” Then
    ‘ First get rid of all embedded dashes, if any.
    tmp = FilterString(Text, “0123456789″)
    ‘ Then reinsert them in the correct position.
    If Len(tmp) <= 7 Then
    FormatPhoneNumber = Format$(tmp, “!@@@-@@@@”)
    Else
    FormatPhoneNumber = Format$(tmp, “!@@@-@@@-@@@@”)
    End If
    End If
    End Function

    Function FormatCreditCard(Text As String) As String
    Dim tmp As String
    If Text <> “” Then
    ‘ First get rid of all embedded spaces, if any.
    tmp = FilterNumber(Text, False)
    ‘ Then reinsert them in the correct position.
    FormatCreditCard = Format$(tmp, “!@@@@ @@@@ @@@@ @@@@”)
    End If
    End Function

    Unfortunately, there isn’t any way to create locale-independent routines that can format any phone number anywhere in the world. But by grouping all your formatting routines in one module, you can considerably speed up your work if and when it’s time to convert your code for another locale.

    Posted By: admin
    Last Edit: 02 Mar 2010 @ 03:26 AM

    EmailPermalinkComments (0)
    Tags
     02 Mar 2010 @ 3:21 AM 

    The CausesValidation Property And The Validate Event – Visual Basic 6 TextBox Control

     

    Visual Basic 6 has finally come up with a solution for most of the validation issues that have afflicted Visual Basic developers for years. As you’ll see in a moment, the Visual Basic 6 approach is simple and clean; it really astonishes me that it took six language versions to deliver such a lifesaver. The keys to the new validation features are the Validate event and the CausesValidation property. They work together as follows: When the input focus leaves a control, Visual Basic checks the CausesValidation property of the control that is about to receive the focus. If this property is True, Visual Basic fires the Validate event in the control that’s about to lose the focus, thus giving the programmer a chance to validate its contents and, if necessary, cancel the focus shift.

    Let’s try a practical example. Imagine that you have five controls on a form: a required field (a TextBox control, txtRequired, that can’t contain an empty string), a numeric field, txtNumeric, that expects a value in the range 1 through 1000, and three push buttons: OK, Cancel, and Help. (See the figure below.) You don’t want to perform validation if the user presses the Cancel or Help buttons, so you set their CausesValidation properties to False. The default value for this property is True, so you don’t have to modify it for the other controls. Run the sample program on the companion CD, type something in the required TextBox, and then move to the second field. Because the second field’s CausesValidation property is True, Visual Basic fires a Validate event in the first TextBox control:

    Private Sub txtRequired_Validate(Cancel As Boolean)
    ‘ Check that field is not empty.
    If txtRequired.Text = “” Then
    MsgBox “Please enter something here”, vbExclamation
    Cancel = True
    End If
    End Sub

    If the Cancel parameter is set to True, Visual Basic cancels the user’s action and takes the input focus back on the txtRequired control: No other GotFocus and LostFocus events are generated. On the other hand, if you typed something in the required field, the focus will now be on the second field (the numeric text box). Try clicking on the Help or Cancel buttons: No Validate event will fire this time because you set the CausesValidation property for each of these controls to False. Instead, click on the OK button to execute the Validate event of the numeric field, where you can check it for invalid characters and valid range.

    A demonstration program that lets you experiment with the new Visual Basic Validate features

    Private Sub txtNumeric_Validate(Cancel As Boolean)
    If Not IsNumeric(txtNumeric.Text) Then
    Cancel = True
    ElseIf CDbl(txtNumeric.Text) < 1 Or CDbl(txtNumeric.Text) > 1000 Then
    Cancel = True
    End If
    If Cancel Then
    MsgBox “Please enter a number in range [1-1000]“, vbExclamation
    End If
    End Sub

    In some circumstances, you might want to programmatically validate the control that has the focus without waiting for the user to move the input focus. You can do it with the form’s ValidateControls method, which forces the Validate event of the control that has the input focus. Typically, you do it when the user closes the form:

    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    ‘ You can’t close this form without validating the current field.
    If UnloadMode = vbFormControlMenu Then
    On Error Resume Next
    ValidateControls
    If Err = 380 Then
    ‘ The current field failed validation.
    Cancel = True
    End If
    End If
    End Sub

    Checking the UnloadMode parameter is important; otherwise, your application will mistakenly execute a ValidateControls method when the user clicks on the Cancel button. Note that ValidateControls returns an error 380 if Cancel was set in the Validate event procedure of the control that had the focus.

    Visual Basic 6’s validation scheme has two flaws, though. If your form has a CommandButton whose Default property is set to True, pressing the Enter key while the input focus is on another control results in a click on the CommandButton control but doesn’t fire a Validate event, even if the CausesValidation property of the CommandButton control is set to True. The only way to solve this problem is to invoke the ValidateControls method from within the default CommandButton control’s Click event procedure.

    The second flaw is that the Validate event doesn’t fire when you’re moving the focus from a control whose CausesValidation property is False, even if the control that receives the focus has its CausesValidation property set to True.

    The new Visual Basic 6 validation mechanism is simple and can be implemented with little effort. But it isn’t the magic answer to all your validation needs. In fact, this technique can only enforce field-level validation; it does nothing for record-level validation. In other words, it ensures that one particular field is correct, not that all fields in the form contain valid data. To see what I mean, run the demonstration program, enter a string in the first field, and press Alt+F4 to close the form. Your code won’t raise an error, even if the second field doesn’t contain a valid number! Fortunately, it doesn’t take much to create a generic routine that forces each control on the form to validate itself:

    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    ‘ You can’t close this form without validating all the fields on it.
    If UnloadMode = vbFormControlMenu Then
    On Error Resume Next
    Dim ctrl As Control
    ‘ Give the focus to each control on the form, and then
    ‘ validate it.
    For Each ctrl In Controls
    Err.Clear
    ctrl.SetFocus
    If Err = 0 Then
    ‘ Don’t validate controls that can’t receive input focus.
    ValidateControls
    If Err = 380 Then
    ‘ Validation failed, refuse to close.
    Cancel = True: Exit Sub
    End If
    End If
    Next
    End If
    End Sub

    The CausesValidation property and the Validate event are shared by all the intrinsic controls that are able to get the focus as well as by most external ActiveX controls, even those not specifically written for Visual Basic. This is possible because they are extender features, provided by the Visual Basic runtime to all the controls placed on a form’s surface.

    One Visual Basic operator has great potential when it comes time to validate complex strings but is neglected by most Visual Basic developers. Let’s say you have a product code that consists of two uppercase characters followed by exactly three digits. You might think that you need some complex string functions to validate such a string until you try the Like operator, as follows:

    If “AX123″ Like “[A-Z][A-Z]###” Then Print “OK”

    Posted By: admin
    Last Edit: 02 Mar 2010 @ 03:21 AM

    EmailPermalinkComments (0)
    Tags
    Categories: P Causes & Validate
     02 Mar 2010 @ 3:17 AM 

    Validation Routines For Numbers – Visual Basic 6 TextBox Control

     

    Although trapping invalid keys in the KeyPress or KeyDown event procedures seems a great idea at first, when you throw your application to inexperienced users you soon realize that there are many ways for them to enter invalid data. Depending on what you do with this data, your application can come to an abrupt end with a run-time error or—much worse—it can appear to work correctly while it delivers bogus results. What you really need is a bullet-proof method to trap invalid values.

    Before I offer you a decent solution to the problem, let me explain why you can’t rely solely on trapping invalid keys for your validation chores. What if the user pastes an invalid value from the clipboard? Well, you might say, let’s trap the Ctrl+V and Shift+Ins key combinations to prevent the user from doing that! Unfortunately, Visual Basic’s TextBox controls offer a default edit menu that lets users perform any clipboard operation by simply right-clicking on them. Fortunately, there’s a way around this problem: Instead of trapping a key before it gets to the TextBox control, you trap its effect in the Change event and reject it if it doesn’t pass your test. But this makes the structure of the code a little more complex than you might anticipate:

    ‘ Form-level variables
    Dim saveText As String
    Dim saveSelStart As Long

    Private Sub Text1_GotFocus()
    ‘ Save values when the control gets the focus.
    saveText = Text1.Text
    saveSelStart = Text1.SelStart
    End Sub

    Private Sub Text1_Change()
    ‘ Avoid nested calls.
    Static nestedCall As Boolean
    If nestedCall Then Exit Sub

    ‘ Test the control’s value here.
    If IsNumeric(Text1.Text) Then
    ‘ If value is OK, save values.
    saveText = Text1.Text
    saveSelStart = Text1.SelStart
    Else
    ‘ Prepare to handle a nested call. 
    nestedCall = True
    Text1.Text = saveText
    nestedCall = False
    Text1.SelStart = saveSelStart
    End If
    End Sub

    Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
    saveSelStart = Text1.SelStart
    End Sub
    Private Sub Text1_MouseDown(Button As Integer, _
    Shift As Integer, X As Single, Y As Single)
    saveSelStart = Text1.SelStart
    End Sub
    Private Sub Text1_MouseMove(Button As Integer, _
    Shift As Integer, X As Single, Y As Single)
    saveSelStart = Text1.SelStart
    End Sub

    If the control’s value doesn’t pass your tests in the Change event procedure, you must restore its previous valid value; this action recursively fires a Change event, and you must prepare yourself to neutralize this nested call. You might wonder why you also need to trap the KeyUp, MouseDown, and MouseMove events: The reason is that you always need to keep track of the last valid position for the insertion point because the end user could move it using arrow keys or the mouse.

    The preceding code snippet uses the IsNumeric function to trap invalid data. You should be aware that this function isn’t robust enough for most real-world applications. For example, the IsNumeric function incorrectly considers these strings as valid numbers:

    123,,,123
    345-
    $1234 ‘ What if it isn’t a currency field?
    2.4E10 ‘ What if I don’t want to support scientific notation?

    To cope with this issue, I have prepared an alternative function, which you can modify for your particular purposes. (For instance, you can add support for a currency symbol or the comma as the decimal separator.) Note that this function always returns True when it’s passed a null string, so you might need to perform additional tests if the user isn’t allowed to leave the field blank:

    Function CheckNumeric(text As String, DecValue As Boolean) As Boolean
    Dim i As Integer
    For i = 1 To Len(text)
    Select Case Mid$(text, i, 1)
    Case “0″ To “9″
    Case “-”, “+”
    ‘ Minus/plus signs are only allowed as leading chars.
    If i > 1 Then Exit Function
    Case “.”
    ‘ Exit if decimal values not allowed.
    If Not DecValue Then Exit Function
    ‘ Only one decimal separator is allowed.
    If InStr(text, “.”) < i Then Exit Function
    Case Else
    ‘ Reject all other characters.
    Exit Function
    End Select
    Next
    CheckNumeric = True
    End Function

    If your TextBox controls are expected to contain other types of data, you might be tempted to reuse the same validation framework I showed you previously—including all the code in the GotFocus, Change, KeyUp, MouseDown, and MouseMove event procedures—and replace only the call to IsNumeric with a call to your custom validation routine. Things aren’t as simple as they appear at first, however. Say that you have a date field: Can you use the IsDate function to validate it from within the Change event? The answer is, of course, no. In fact, as you enter the first digit of your date value, IsDate returns False and the routine therefore prevents you from entering the remaining characters, and so preventing you from entering any value.

    This example explains why a key-level validation isn’t always the best answer to your validation needs. For this reason, most Visual Basic programmers prefer to rely on field-level validation and test the values only when the user moves the input focus to another field in the form. I explain field-level validation in the next section.

    Posted By: admin
    Last Edit: 02 Mar 2010 @ 03:17 AM

    EmailPermalinkComments (0)
    Tags
    Categories: O Validation Routines
     02 Mar 2010 @ 3:14 AM 

    Trapping Keyboard Activity – Visual Basic 6 TextBox Control

     

    TextBox controls support KeyDown, KeyPress, and KeyUp standard events. One thing that you will often do is prevent the user from entering invalid keys. A typical example of where this safeguard is needed is a numeric field, for which you need to filter out all nondigit keys:

    Private Sub Text1_KeyPress(KeyAscii As Integer)
    Select Case KeyAscii
    Case Is < 32 ‘ Control keys are OK.
    Case 48 To 57 ‘ This is a digit.
    Case Else ‘ Reject any other key.
    KeyAscii = 0
    End Select
    End Sub

    You should never reject keys whose ANSI code is less than 32, a group that includes important keys such as Backspace, Escape, Tab, and Enter. Also note that a few control keys will make your TextBox beep if it doesn’t know what to do with them—for example, a single-line TextBox control doesn’t know what to do with an Enter key.

    Don’t assume that the KeyPress event will trap all control keys under all conditions. For example, the KeyPress event can process the Enter key only if there’s no CommandButton control on the form whose Default property is set to True. If the form has a default push button, the effect of pressing the Enter key is clicking on that button. Similarly, no Escape key goes through this event if there’s a Cancel button on the form. Finally, the Tab control key is trapped by a KeyPress event only if there isn’t any other control on the form whose TabStop property is True.

    You can use the KeyDown event procedure to allow users to increase and decrease the current value using Up and Down arrow keys, as you see here:

    Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
    Case vbKeyUp
    Text1.Text = CDbl(Text1.Text) + 1
    Case vbKeyDown
    Text1.Text = CDbl(Text1.Text) -1
    End Select
    End Sub

    There’s a bug in the implementation of TextBox ready-only controls. When the Locked property is set to True, the Ctrl+C key combination doesn’t correctly copy the selected text to the Clipboard, and you must manually implement this capability by writing code in the KeyPress event procedure


    Posted By: admin
    Last Edit: 02 Mar 2010 @ 03:14 AM

    EmailPermalinkComments (0)
    Tags
     02 Mar 2010 @ 3:08 AM 

    Using TextBox Control In Visual Basic 6

     

    TextBox controls offer a natural way for users to enter a value in your program. For this reason, they tend to be the most frequently used controls in the majority of Windows applications. TextBox controls, which have a great many properties and events, are also among the most complex intrinsic controls. In this section, I guide you through the most useful properties of TextBox controls and show how to solve some of the problems that you’re likely to encounter.

    Setting properties to a TextBox

    • Text can be entered into the text box by assigning the necessary string to the text property of the control
    • If the user needs to display multiple lines of text in a TextBox, set the MultiLine property to True
    • To customize the scroll bar combination on a TextBox, set the ScrollBars property.
    • Scroll bars will always appear on the TextBox when it’s MultiLine property is set to True and its ScrollBars property is set to anything except None(0)
    • If you set the MultilIne property to True, you can set the alignment using the Alignment property. The test is left-justified by default. If the MultiLine property is et to False, then setting the Alignment property has no effect.

    Run-Time Properties of a TextBox control

    The Text property is the one you’ll reference most often in code, and conveniently it’s the default property for the TextBox control. Three other frequently used properties are these:

    • The SelStart property sets or returns the position of the blinking caret (the insertion point where the text you type appears). Note that the blinking cursor inside TextBox and other controls is named caret, to distinguish it from the cursor (which is implicitly the mouse cursor). When the caret is at the beginning of the contents of the TextBox control, SelStart returns 0; when it’s at the end of the string typed by the user, SelStart returns the value Len(Text). You can modify the SelStart property to programmatically move the caret.
    • The SelLength property returns the number of characters in the portion of text that has been highlighted by the user, or it returns 0 if there’s no highlighted text. You can assign a nonzero value to this property to programmatically select text from code. Interestingly, you can assign to this property a value larger than the current text’s length without raising a run-time error.
    • The SelText property sets or returns the portion of the text that’s currently selected, or it returns an empty string if no text is highlighted. Use it to directly retrieve the highlighted text without having to query Text, SelStart, and SelLength properties. What’s even more interesting is that you can assign a new value to this property, thus replacing the current selection with your own. If no text is currently selected, your string is simply inserted at the current caret position.

    When you want to append text to a TextBox control, you should use the following code (instead of using the concatenation operator) to reduce flickering and improve performance:

    Text1.SelStart = Len(Text1.Text)
    Text1.SelText = StringToBeAdded

    One of the typical operations you could find yourself performing with these properties is selecting the entire contents of a TextBox control. You often do it when the caret enters the field so that the user can quickly override the existing value with a new one, or start editing it by pressing any arrow key:

    Private Sub Text1_GotFocus()
    Text1.SelStart = 0
    ‘ A very high value always does the trick.
    Text1.SelLength = 9999
    End Sub

    Always set the SelStart property first and then the SelLength or SelText properties. When you assign a new value to the SelStart property, the other two are automatically reset to 0 and an empty string respectively, thus overriding your previous settings.

    The selected text can be copied to the Clipboard by using SelText:

    Clipboard.SelText text, [format]

    In the above syntax, text is the text that has to be placed into the Clipboard, and format has three possible values.

    1. VbCFLink – conversation information
    2. VbCFRTF – Rich Text Format
    3. VbCFText – Text

    We can get text from the clipboard using the GetText() function this way:

    Clipboard.GetText ([format])

    The following Figure summarizes the common TextBox control’s properties and methods.



    Posted By: admin
    Last Edit: 02 Mar 2010 @ 03:11 AM

    EmailPermalinkComments (0)
    Tags

     Last 50 Posts
     Back
     Back
    Change Theme...
    • Users » 1
    • Posts/Pages » 33
    • Comments » 0
    Change Theme...
    • VoidVoid « Default
    • LifeLife
    • EarthEarth
    • WindWind
    • WaterWater
    • FireFire
    • LightLight