Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Articles
Search: 

Yet another approach to the forms and grids
Nick Neklioudov, January 1, 2001
I believe all of us are familiar with that set of four navigational buttons "First", "Prior", "Next", "Last" we use for data entry or maintenance forms. You need to put some code in their Click() events, enable or disable navigation buttons, according to the position of record pointer in a table. ...
I believe all of us are familiar with that set of four navigational buttons "First", "Prior", "Next", "Last" we use for data entry or maintenance forms. You need to put some code in their Click() events, enable or disable navigation buttons, according to the position of record pointer in a table. Of course, usually all we do it only once, and save this commandgroup as a class for reuse. I would like to suggest another approach for VFP 5.0 which eliminates the need in that commandgroup at all.

Everybody knows, that we can put any control into a grid cell, but maybe not everybody realizes that it is possible to put there also any container, even the whole form, which gives us some extra opportunities.

I created this sample after discussion about "Scrolling grid" in the thread, started by Jon Paskett on UT this January.

This example contains pageframe, placed into a grid cell instead of default textbox. The pageframe contains 3 pages with all necessary controls and should be saved as class in a class library.

Say, we use EMPLOYEE.DBF from Tasmanian Traders sample as our data source. Our pageframe has Height = 300 and Width = 400 , so we create a form, with a grid of 1 column, then drop our new pageframe class into grid's column, set CurrentControl for the Column1 to the pageframe and remove default textbox. Also we have to make sure that grid properties are set to :

ColumnCount = 1
DeleteMark = .F.
GridLines = 0
HeaderHeight = 0
Height = 300
HighlightRow = .F.
RecordMark = .F.
RecordSource = "employee"
RowHeight = 300
ScrollBars = 2
Width = 400
Column1.Width = 400
Column1.Sparse = .F.
The trick is that now the grid cell has the exact size of the pageframe.

After those settings we run our form and see the pageframe, which has a vertical scrollbar on the right side. We can use this scrollbar to navigate through our data source like we do it with a text in MS Word. Note, that the record shown in the pageframe is not the current record in our data source until we actually click anywhere on the pageframe or any of its controls. Only after that record pointer actually moves.

So, in this case we have no need in any code we previously used in our navigational commandgroup.

This approach "as is" may be used for forms, which works directly with tables or views, and use APPEND BLANK for adding records, or, for any forms which are used just to represent data.

Sometimes, when you open this form in Form Designer again, after adding pageframe to the grid, it can give you an error message "Error loading file - record number X - Pageframe1 (or one of its members). : Pageframe cannot be sized that small", despite of the fact, that pageframe instance in the grid column has size 300 x 400 pixels. I opened my form's .SCX file by USE MYFORM.SCX and found, that by unknown reasons there are no Width and Height properties defined in Properties field for the record containing information about the pageframe. It never happened, when I was experimenting in VFP 3.0. To fix that, it is enough just to add to Property field manually:

Height = 300
Width = 400
By the way, I would not recommend this kind of grid for VFP 3.0, because it seems to work differently there, and give strange visual effects, but for the VFP 5.0 it works just fine, as far as I tested it. I would be glad to get any feedback about any problems regarding this approach.
Nick Neklioudov, Cgi Group Inc.
Nick Neklioudov, M.Sc., CNA, works as Senior Analyst with CGI Group Inc. in Halifax, Nova Scotia, Canada. Programming in all versions of FoxPro/VFP since 1987, in .Net since 2003, not counting some other developer tools and environments. Nick received Microsoft Most Valuable Professional award three times. Nick Neklioudov has over 20 years experience with computers and information technologies, especially in database-oriented programming, object-oriented programming and information systems development.
More articles from this author
Nick Neklioudov, January 1, 2006
Nick Neklioudov resumes the highlights in the VFP community in the last month
Nick Neklioudov, February 1, 2006
Nick Neklioudov resumes the highlights in the VFP community in the last month
Nick Neklioudov, March 1, 2006
Nick Neklioudov resumes the highlights in the VFP community in the last month
Nick Neklioudov, April 1, 2006
Nick Neklioudov resumes the highlights in the VFP community in the last month
Nick Neklioudov, May 1, 2006
Nick Neklioudov resumes the highlights in the VFP community in the last month
Nick Neklioudov, June 1, 2006
Nick Neklioudov resumes the highlights in the VFP community in the last month
Nick Neklioudov, July 1, 2006
Nick Neklioudov resumes the highlights in the VFP community in the last month
Nick Neklioudov, August 1, 2006
Nick Neklioudov resumes the highlights in the VFP community in the last month
Nick Neklioudov, September 1, 2006
Nick Neklioudov resumes the highlights in the VFP community in the last month
Nick Neklioudov, October 1, 2006
Nick Neklioudov resumes the highlights in the VFP community in the last month
Nick Neklioudov, November 1, 2006
Nick Neklioudov resumes the highlights in the VFP community in the last month
Nick Neklioudov, December 1, 2006
Nick Neklioudov resumes the highlights in the VFP community in the last month
Nick Neklioudov, March 1, 2007
Nick Neklioudov resumes the highlights in the VFP community in the last month
Nick Neklioudov, June 23, 2000
You can make your form Modal/Modeless on the fly. This may be useful for preventing users to switch to other forms before they finished entering the data.
Nick Neklioudov, April 7, 2000
This will translate the HEX encrypted text. It is a little wrapper around George Tasker class for automatic translation back and forth and placing the translated text to the Clipboard. You can explicitly pass your text as a parameter, or the program automatically picks the clipboard content.
Nick Neklioudov, May 29, 2002
Instead of trying to add properties with some third-party tools like ADDPROP5.FLL to the native object created with SCATTER NAME command you may try to approach this problem from the other side. You can replace the native SCATTER command with your own function MYSCATTER which may work on any are...
Nick Neklioudov, April 5, 2000
Checkboxes supports both Numeric and Logical data types. When you check its value, do not just write IF thisform.mycheckbox.Value = 1 or IF thisform.mycheckbox.Value = .t. Check it as IF !EMPTY(thisform.mycheckbox.Value) This way you don't care what the type of value really i...
Nick Neklioudov, June 26, 2000
Say, you have the client birth date and you want your program to tell you if the birthday is within the certain date range (even when the given range starts in one year and finishes in another). SELECT * FROM CLIENTS ; WHERE BETWEEN(GOMONTH(birth_date,(YEAR(start_date)- YEAR(birth_date))*12), st...
Nick Neklioudov, November 1, 2001
I live in Halifax, Nova Scotia with my wife Tanya (who I happily married 22 years ago) and our 18-year old daughter Nadya. The 3-year old cat Stanley is also a family member :) As you might have guessed, I do VFP programming. Tanya works at Dalhousie University. She is Ph. D. in Biology and has bee...
Nick Neklioudov, November 1, 2002
Author: Whil Hentzen Publisher: Hentzenwerke Corporation ISBN: 193091900X Paperback: 548 pages Dimensions (in inches): 1.14 x 9.10 x 7.02 3rd edition (July 2002) Amazon link: http://www.amazon.com/exec/obidos/tg/detail/-/193091900X/qid=1033007807/sr=8-3/ ref=sr_8_3/1...
Nick Neklioudov, July 17, 2000
If you get an error "Expression is invalid. Use a valid expression for DYNAMIC... property" you may try different type of addressing your PEMs: For example, in Grid.Init() this syntax does not work this.SETALL('DynamicBackColor', 'IIF(ASCAN(This.Parent.aRecNosSelected,RECNO()) > 0, RGB(255,0,...
Nick Neklioudov, January 17, 1998
This works: this.column1.DynamicForeColor = "IIF(some_type = 2, RGB(255,0,0), RGB(0,0,0))" And this does not work: this.column1.DynamicForeColor = "IIF(some_type = 2, RGB(255,0,0), RGB(0,0,0)) " Reason: one extra space before closing quotes.