Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Combobox slow
Message
 
To
09/09/1998 13:22:55
Diptesh Patel
Unitelsoftware Ltd.
Mumbai, India
General information
Forum:
Visual FoxPro
Category:
Forms & Form designer
Title:
Miscellaneous
Thread ID:
00134629
Message ID:
00134684
Views:
16
that sounds like a real tall order! Is there an easier way? Maybe use a list box instead and have a textbox beside it for input?



>IF YOUR TABLE CONTAINS LARGE NO. OF RECORDS ? THEN TRY THIS..
>
>How to Build a Custom Combo Box
>
>Article ID: Q155013 Creation Date: 20-AUG-1996 Revision Date: 21-AUG-1996
>
>The information in this article applies to:
>•Microsoft Visual FoxPro for Windows, versions 3.0, 3.0b
>
>SUMMARY
>When using a large table or cursor (over 500 records) as the RowSource for a Combo Box, you may start to see a slow down in the Combo Box performance. This article shows how to create a control that has the basic Combo Box functionality but does not have the same performance slow down that the standard Combo Box has when working with a large table.
>
>MORE INFORMATION
>The fastest control for working with a large number of records is the Grid. However, there are times when there is not enough space on a form for a grid or when the developer needs the functionality of a Combo Box but without the performance overhead that the standard Combo Box has. The following example shows how to create a custom Combo Box using a Grid, Text Box, and Command Button. If you are not familiar with creating or using visual classes, please see chapter 10 of the Microsoft Visual FoxPro Developer's Guide.
>
>Step-by-Step Example
>1.Create a new class named NewPopup based on a Container, and save it in Mylib.
>2.Add the following new properties and methods to the NewPopup container:
>cSearchString as a Property tOutTime as a Property Pop as a Method Search as a Method
>3.Set the following properties for the NewPopup container:
>Width = 128
>Height = 185
>BackStyle = 0
>BorderWidth = 0
>tOutTime = .NULL.
>4.Add a Text Box to the container and set the following properties:
>Height = 26
>Left = 2
>ReadOnly = .T. && If you want to be able to edit the data in
>
> ** the text box leave this property set to .F.
>
>Top = 2
>Width = 111
>5.Enter the following code in the KeyPress Event for Text1:
>
>IF nKeyCode = 160
>
> This.Parent.Command1.Click()
> ** Makes the grid appear when you press the ALT+DOWNARROW key
>
>ENDIF
>6.Add a Command Button to the container and set the following properties:
>
>Top = 2
>Left = 112
>Height = 26
>Width = 13
>FontBold = .F.
>FontName = Wingdings
>FontSize = 6
>Caption = ALT + 0234
>** When you hold down the ALT key and press the NUMBER keys, it
>** inserts a down arrow character for the Caption
>7.Enter the following code in the Click Event for Command1:
>
>This.Parent.Grid1.Visible = .T. && Make the Grid visible This.Parent.Zorder(0)
>** Places the container in front of other objects
>This.Parent.Grid1.Column1.Text1.SetFocus
>IF !ISNULL(This.Parent.tOutTime)
>
> KEYBOARD '{Enter}'
> ** Forces the Grid to Activate
> ** Without this, the grid would not work properly when you
> ** enter it the second time.
>
>
>
>ENDIF
>8.Add a Grid to the container and set the following properties:
>
>ColumnCount = 1
>DeleteMark = .F.
>GridLines = 0
>GridLineWidth = 0
>HeaderHeight = 0
>Height = 156
>Left = 2
>MousePointer = 1
>ReadOnly = .F.
>RecordMark = .F.
>ScrollBars = 2
>Top = 27
>Visible = .F.
>Width = 123
>9.Enter the following code in the AfterRowColChange Event of Grid1:
>
>This.Parent.Text1.Value = This.Column1.Text1.Value
>10.Set the following properties for Column1 in Grid1:
>
> Width = 124
> Sparse = .F.
>
>
>
>11.Set the following properties for Text1 in Column1 of Grid1:
>
>
>
> BorderStyle = 0
> Format = K
> HideSelection = .F.
> MousePointer = 1
> SpecialEffect = 1
>
>
>
>12.Enter the following code in the Click Event of Text1 in Column1 of
>
> Grid1:
>
>
>
>
>
>
>
> This.Parent.Parent.Parent.Pop()
>
>
>
>13.Enter the following code in the KeyPress Event of Text1 in Column1 of
>
> Grid1:
>
>
>
>
>
>
>
> IF nKeyCode = 13 && Then hit the ENTER key
> This.Parent.Parent.Parent.Pop()
> ENDIF
> IF (nKeyCode > 48 AND nKeyCode < 58) OR ;
> (nKeyCode > 64 AND nKeyCode < 123)
> ** Calls the search method if you hit a letter or numeric key
> This.Parent.Parent.Parent.Search(nKeyCode)
> ENDIF
>
>
>
>14.Enter the following code in the GotFocus Event of the NewPopup
>
> Container:
>
>
>
>
>
>
>
> SET BELL OFF
>
>
>
>15.Enter the following code in the Init Event of the NewPopUp Container:
>
>
>
> This.Grid1.HeaderHeight = 0
> ** When you modify an instance of the class in a Form and modify
> ** some of the grid setting, it will change the HeaderHeight property
> ** back to a default size. This line of code will set the
> ** HeaderHeight back to 0 at run time
> This.Zorder(1)
> ** Moves the container behind any controls that it may be on top of
> nFieldlen = FSIZE(This.Grid1.Column1.ControlSource)
> ** resize the grid based on the field size and font
> IF This.Width < (nFieldlen * ;
> FONTMETRIC(6,This.Grid1.FontName,This.Grid1.FontSize,"B"))+12
>
>
>
>
>
>
>
> This.Width = (nFieldlen * ;
> FONTMETRIC(6,This.Grid1.FontName,This.Grid1.FontSize,"B"))+12
>
>
>
>
>
>
>
> This.Grid1.Width = (nFieldlen * ;
> FONTMETRIC(6,This.Grid1.FontName,This.Grid1.FontSize,"B"))+10
>
>
>
>
>
>
>
> This.Grid1.Column1.Width = (nFieldlen * ;
> FONTMETRIC(6,This.Grid1.FontName,This.Grid1.FontSize,"B"))
> ENDIF
>
>
>
>16.Enter the following code in the LostFocus Event of the NewPopUp
>
> Container:
>
>
>
>
>
>
>
> SET BELL ON
> This.Grid1.Visible = .F.
> This.ZOrder(1)
> ** Moves the container behind any object it is over
>
>
>
>17.Enter the following code in the Pop Method of the NewPopUp
>
> Container:
>
>
>
>
>
>
>
> This.Text1.SetFocus
> This.Grid1.Visible = .F.
> This.ZOrder(1)
> ** Moves the container behind any object it is over
>
>
>
>18.Enter the following code in the Search Method of the NewPopUp
>
> Container:
>
>
>
>
>
>
>
> **Does an incremental search of the table in the grid
> LPARAMETERS nKeyPress
> cField = This.Grid1.Column1.ControlSource
> nRecord=RECNO()
> tInTime = DateTime()
> IF !ISNULL(This.tOutTime)
>
>
>
>
>
>
>
> IF (tInTime - This.tOutTime)<= 1
> This.cSearchString = This.cSearchString + CHR(nKeyPress)
> LOCATE FOR UPPER(LEFT(&cField,LEN(This.cSearchString))) = ;
> UPPER(This.cSearchString)
> ELSE
> This.cSearchString=""
> This.cSearchString = CHR(nKeyPress)
> LOCATE FOR UPPER(LEFT(&cField,1)) = UPPER(This.cSearchString)
> ENDIF
>
>
>
>
>
>
>
> IF FOUND()
> This.Grid1.Refresh()
> ELSE
> GO nRecord
> This.Grid1.Refresh()
> ENDIF
>
>
>
>
>
>
>
> ELSE
>
>
>
>
>
>
>
> This.cSearchString=""
> This.cSearchString = CHR(nKeyPress)
> LOCATE FOR UPPER(LEFT(&cField,1)) = UPPER(This.cSearchString)
>
>
>
>
>
>
>
> IF FOUND()
> This.Grid1.Refresh()
> ELSE
> GO nRecord
> This.Grid1.Refresh()
> ENDIF
>
>
>
>
>
>
>
> ENDIF
> This.tOutTime = DateTime()
>
>
>
>19.Save and close the class. 20.Create a form and add the NewPopUp container to the form. 21.Set the RowSource of the Grid1 in the NewPopUp container to the table
>
> of your choice.
>
>22.Set the ControlSource of Column1 of Grid1 in the NewPopUp container.
>23.Save and run the Form. Click the Command Button to display the Grid,
>
> and then type the first letter of something you wish to find. Make a
> selection by either clicking on your choice or using the ARROW key
> to highlight your choice and then pressing the ENTER key. You will see
> the Grid disappear and the value of your choice appear in the text box.
"Build a man a fire, and he's warm for a day.
Set a man on fire, and he's warm for the rest of his life."
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform