VMP Home
Product Information
Message Board
Download VMP
Training and Demos
Previous versions
User Contributions
VFP Tools & Downloads
Subscription Policy
Order Now
  Questions and answers

The following is a list of excellent questions I have received via e-mail from a folks making their VMP purchasing decision. Those questions and my reply to each one may provide helpful information if you do not yet own VMP.
-Drew Speedie

How are the Abstract Classes built in the framework? Builders, Wizards, what?

I don't really understand this question. Abstract classes are generally those that you don't subclass or use for instances, so Builders and Wizards wouldn't be used for that process.

Is a data dictionary included? If not, why not, and what is provided for it?

No. By not basing anything on a data dictionary, you have much more flexibility. You can use your own or a commercial one like the one that comes with Stonefield Database Toolkit. VMP does not force one on you.

Is there support for Stonefield Database Toolkit?

Yes, it is explicitly integrated into VMP, in 2 variations.

Does framework access data through the native VFP data environment or, if not, how?

Yes, if you want to. No if you don't. Again, a framework shouldn't dictate how you want to access data - that's for you to decide. A good framework helps you work the way you prefer.

In addition to "regular" data access using the DataEnvironment or Form.Load() code, etc. VMP ships with a set of n-Tier services classes for creating n-Tier applications.  Data services are provided by classes that are instantiated as the middle tier, between the data tier and the presentation tier.  Forms instantiate such Business Objects to provide data, update data, validate data, etc.

Where does business logic reside?

Wherever you put it. In the presentation tier, in the .DBC database, or in a middle tier of your design. Whatever makes sense in the type of application you are developing (1-Tier, 2-Tier, n-Tier, web app, etc.).   

For n-Tier applications, VMP includes a rule object class in which you can code business rules and add rule objects to the appropriate VMP middle-tier object.

What provisions are there for parameterized views?

Parameterize views however you want. This is not a framework issue. A framework shouldn't dictate how/when/why you use views, parameterized or otherwise. The VM example application that ships with VMP uses parameterized views for all data-entry, although you can bind directly to (buffered) table fields if you prefer.  The NT example application demonstates using several view-based Business Objects, but mostly uses SQL-SELECTs for data access.

How does the framework provide Client-Server support?

By supporting (remote) views and SQL Pass-Thru. VMP also contains a "connection service" object for managing the ODBC connection, and wrappers for the SQLExec() and Requery() functions. Abstract TABLEUPDATE() code supports any mix of local and remote data.

The n-Tier services classes include classes for managing remote data connections in an n-Tier architecture.  The middle tier classes support data access by either remote views or, for more flexibility, SQL Pass Thru.

What tools are supplied to assist developers in creating applications with it?

VMP includes an Application Setup Wizard to get started with each new application. We also have other builders and wizards, usage of which is totally optional. The zReadMe documentation provided in classes provides a wealth of implementation information, frequently with step-by-step instructions. Several developer tools support searching a project for a specific text string, creating a new .SCX-based form, searching for an explicit PEM setting, and many others.  Just check out the Developer Tools section of the VMP Help file

What help is available for new users of the framework?

You can download (free) the online help (.CHM) file, which provides high-level explanations. A 13-chapter Tutorial takes just a few days to complete and guides you through the process of creating a typical VMP application and all its usual components. zReadMe documentation includes explanatory information for each class.

How much documentation is supplied and what format?

VMP ships with an online help (.CHM) file, which you can download for free -- you don't have to be a VMP purchaser to download it. If printed out, VMPHELP.CHM would be around 500 pages.

VMP also ships with two example applications.  The VM example application is a 1-tier application that contains a couple of simple 2-tier examples.  The NT example application demonstrates the usage of VMP n-Tier services in an n-Tier archtecture.

The most important documentation is contained right in the VMP code.  Each VMP class has a custom zReadMe containing only the class documentation, including implemenation instructions and usage examples.

Which of the common design patterns does the framework employ?

Hooks, bridges, mediators, etc.

Is an Environment Class included?

Not as such, but several VMP classes perform the services folks normally associate with what they call an "Environment Class".

The n-Tier services classes allow you to create the equivalent of a data environment at the Business Object level.

Is there a Forms Handler or Manager class?

Yes, XXFW.VCX/cusForms, which (or a custom subclass thereof) is instantiated at runtime as oForms, a global forms manager object.

Is there a Timer Manager class?

No. What would you use one for? We discourage the use of timers, limiting them to use only when necessary. VMP includes several timer subclasses for use when necessary, and the global application object, ctrApp contains a single timer that can handle multiple chores in addition to VMP application timeout.

Is there a Toolbar Manager class?

Yes, XXFW.VCX/cusToolbars, which (or a subclass thereof) is instantiated at runtime as oToolbars, a global toolbars manager object. VMP supports two kinds of toolbars:

  1. any number of "global" toolbars, which are available/installed for the life of the app
  2. one "linked" toolbar per open form, installed/available when the form has focus

Does the framework "require" or "allow" private datasessions?

Yes <g>. You decide how you want to implement private data sessions, but you cannot create an event-driven modeless application without taking advantage of private data sessions. Ditto for multi-instance forms.  The default data-management form class included with VMP sets a private data session by default, but you can specify a Default data session when desired/necessary.

How do control objects communicate with data?

Generally by the fact that they're bound to table/view fields. However, you can "bind" them any way you see fit.  

The n-Tier services classes provide data to the presentation tier as cursors, allowing you to continue to use the "normal" behaviors of bound controls, even though the cursors to which controls are bound are not the actual tables.

What support is provided for tables and views, remote and local?

VMP supports any combination you can do in VFP. It is not the purpose of a framework to dictate how/when you use any combination thereof.

Are there any MoverListBox classes?

Yes.  XXFWCOMP.VCX/ctrMover is our mover listbox class, and XXFWFRM.VCX/frmMover is a mover listbox dialog.  Also, the VMP picklist grid class has a MultiSelect option, which is frequently a better alternative to a mover listbox.

What kinds of custom grid classes are there?

VMP includes three grid classes:

  • a "base" grid class, which optionally supports "ReSort" behaviors
  • a "picklist" grid class, which optionally supports MultiSelect behaviors
  • a "data-entry" grid class with appropriate behaviors

The "picklist" and "data-entry" grid classes inherit from the "base" grid class, and therefore inherit all its basic behaviors.

Are there any custom MessageBox classes?

Yes. VMP ships with Steven Black's public domain MSGSVC utility for handling all messaging to the user. You can optionally stick with VFP MessageBox()es, in which case VMP includes a library routine "wrapper".

Are multiple database containers allowed?

Yes. VFP allows them, so VMP does too.

What kinds of form classes are there?

What kinds would you like? <g> VMP includes several generic form classes and several very specific form classes for specific tasks. If you find something missing, create it yourself!

Where are the input values validated?

Wherever you decide. VMP controls abstract validation logic which, among other things, "automatically" invoke field rules (if any) established in the .DBC when the ControlSource is a View.FieldName. Other than that, you can implement anything you want.

The n-Tier services classes are fully integrated with the VMP presentation tier, so that the developer does not have to code the communication between bound controls and the business objects containing the rule logic. Controls "automatically" communicate with the corresponding Business Object to perform validation as the user navigates through form controls.

How are menus implemented?

Via the standard VFP Menu Designer. VMP also ships with the GenMenuX.PRG utility that supports some extended behaviors. And VMP instantiates an oMenu menu manager at runtime.

How easily are parameterized views constructed?

You decide -- you create them. I personally prefer to create them in .PRG code for maximum flexibility and maintainability (the VM example application does so), but you're welcome to construct them in the View Designer, the SDT interface, etc.

In n-Tier applications, we generally find that SQL Pass-Thru cursors are easier to maintain than the equivalent views.

What mechanisms for Referential Integrity are used?

You can use the native VFP RI Builder, but we include a much simpler VMP RI engine (and Builder) that does the same thing only better (in our opinion), using only 2 simple stored procedures.  For remote data, we recommend implementing RI in the back end database.

Is there an Incremental Search ComboBox class?

The VFP base class Combo comes with incremental search natively, so I'm not sure what you mean here. VMP also includes XXFWCTRL.VCX/txtPicklistValid which is an incremental-search, "quickfill" textbox that "knows" how to validate itself agains a lookup cursor, sending the user to a picklist when necessary. We recommend using txtPicklistValid over a combo in most situations.

What facilities are there for User-defined column headings in grids?

You can specify the header.Caption yourself. Also, VMP abstracts code that, if you don't explicitly specify the Captions, populates them with any Caption specified in the .DBC, even if the Caption is only specified in the Table.Field and the Column.ControlSource is a View.Field.

If you want to allow each user to customize grid.column.header.Caption text, you can hook that behavior into the VMP user preferences engine.

How is data backup handled?

However you decide to hande it!

How do we Drag & Drop from a ListBox to a Grid?

You'll have to code D&D yourself – that's not a framework issue IMO.

How are user rights for paths validated on networks?

That is not a framework issue, IMO. You'll have to do that yourself.

Is there an Environment class that can return values to a user such as diskspace, memory available, drives available, etc.?

No, perhaps in a future version.

Are there Data Behavior classes?

VMP includes a set of n-Tier services classes, including Data Source and Data Source Behavior classes that always work together to provide data access and behavior functions.

What provisions are there for "run-time" indexing?

VMP includes an XXFWMISC.VCX/cusReindex class that does the grunt work for run-time reindexing via the native REINDEX command.  The VM example application contains an example of run-time indexing selected from the main system menu.

For more robust reindexing, we suggest using SDT's Reindex() method.

Are there custom Toolbar classes?

VMP supports all native VFP classes. VMP also includes 3 toolbar classes, from generic to a very specific toolbar commonly used as a global toolbar.

If toolbars are not desired, will forms allow command groups instead?

Certainly, although VMP does not include a commandgroup class hierarchy – we recommend using individual commandbuttons, for greater flexibility (if you want them grouped, put them in a container).

Is there a Find Dialog class?

If you mean a dialog imitating the native VFP Find dialog invoked from the Edit menu, the answer is yes. If not, the answer is no, and I don't know exactly what you mean.

Is there a Sort Dialog class? If so, how many columns will it sort?

XXFWGRD.VCX/grdGeneral abstracts column-sorting into the grid itself. It supports as many columns as the grid contains. Since the other 2 grid classes in VMP are subclassed from grdBase, all VMP grids inherit this behavior. XXFWGRD.VCX includes a cboGridSortBy dropdown list class, which is "automatically" linked to/coordinated with an associated grid.

Is there a re-sizable Form class? Re-sizable Grid class?

All VMP forms are resizable by default, via an instance of XXFWFRM.VCX/ctrFormSizer added at runtime. If you don't want this behavior, just shut it off. No, grids are not inherently re-sizable in VMP, by themselves.

Is there a Query-by-Example class?  If so, does it allow exclusions as well as inclusions?  Also, if so, does it allow ranges?   Also, if so, does it allow "CONTAINS" values?

VMP includes a set of "selection criteria" classes. You decide how to handle inclusions, ranges, and CONTAINS.

How easy is it to created nested Forms?

I don't understand the term "nested Forms". I think you mean the scenario where a modeless form calls one or more modal "subforms" for data-entry, which VMP supports via 2 custom classes that handle the communication between a main form and its subform(s). 

What means is provided for creating compressed data backup files such as ZIPped files?

You provide those capabilities yourself.  Abstract them and reuse them from app to app or implement the mechanism on an app-by-app basis.

Is there a Report Data Environment class?

I'm not sure what you mean here. Visual FoxPro supports the DataEnvironment for .FRXs. VMP includes a "report object" class based on a private data-session form class that is never made visible (the Session base class was not available back when we designed the report object class), and you are welcome to use the .FRX's DataEnvironment if you want, or put the equivalent code in the report object's custom PrepareData() method.

Is there a Report Session Environment class?

See above.

Are there any business classes for Ageing?

In my experience, aging is a process over which I have no control. I try to eat right, get as much exercise as I can, but I still can't do what I could when I was 25, and my eyesight is getting worse. …<g> Other than that, please clarify what you mean...

How are errors handled when the objects themselves cannot?

VMP error handling is all done by calling XXERROR.PRG. Some future version of VMP may include error handling at the object level, but even then there will be a need for XXERROR.PRG in some cases.

Since the release of VFP8, we prefer to implement TRY/CATCH exception handling when possible.

What End-User Help authoring facilities are there?

Whatever you can find in the 3rd party tools market. We created the online help (.CHM) file for VMP using the excellent West Wind HTML Help Builder tool from West-Wind Technologies, http://www.west-wind.com.

Is there any mechanism to prevent multiple instances of an application by the same user?

Yes, the default behavior in VMP is to prevent multiple logins by the same user at one workstation. If you want to suppress that behavior, just override the method that enforces it.

Is there any logic to determine user rights on a network (rather than the application)?


What are the Application Security components?

VMP includes an entire XXFWSEC.VCX class library of security components, allowing you to secure all components of an app, down to the page/column/control level. XXFWSEC.VCX also includes a set of form classes that provide the interface in which the Administrator can maintain security/permisssions/users/etc. for the application. 

How do Supervisors know which users are in the application?

By asking them <g>. Also, VMP includes a form the Administrator can call that lists all users currently in the system, showing their workstation and login user name.  

Are there any differences using the framework on a Novell server vs. an NT server? If so, what are these differences and how does the framework handle them?

No.  Previous versions of VMP adhered strictly to an 8.3 file naming convention because some Novell networks didn't recognize long filenames properly.  Since VMP 2002 we have been using longer file names, because the (Windows) operating systems that run VFP6/7/8/+ can handle long filenames.  So the VMP framework works on all (Windows) networks that I've heard of. Or at least, there aren't any I've heard of that cannot run a VMP application.

What locking strategies are implemented by the framework?  File, record, field?

The VMP framework exclusively uses VFP buffering, for tables it manages directly (the VMP system tables). Specifically, optimistic table buffering, with one exception, the GeneratePK table which generates unique IDs/PK values, which uses pessimistic row buffering (when GeneratePK is a local VFP table).

Of course, the developer can augment/override as desired, and can do whatever they want. Some do that, executing specific RLOCK()s, etc. where appropriate.

There is an example in the example VM application of re-indexing, which requires EXCLUSIVE use of the tables, but that code, while fully operational, is just and example of how to accomplish that.

If buffering is not enabled for an updateable cursor, the developer is pretty much on their own regarding how to implement locking. Which doesn't make much sense, since you can simply enable buffering and forget about it.

Our application compares and matches transactions in medium-sized datasets, 15-20K transactions. Does the framework have a data environment class that would handle this volume efficiently? What about 100K - 1M transactions?

I'm not quite sure what you mean here. If you mean there are 15-20K /100K-1M records involved in one data-update transaction, then that's a function of VFP, not VMP.

As for a "data-environment class", VMP has no such animal as such. You open the data, either in the Form.Load() or the .SCX-based form DataEnvironment, and when the user decides to <Save> Inserts/Updates/Deletes, all dirty buffers in the current private data session are TableUpdate()d. Any mix of local and/or remote tables (buffered tables, local views, remote views, SPT cursors).

VMP n-Tier services classes provide data behavior and access wrapped in a Business Object.  But again, volumes of updates are ultimately a function of VFP, not VMP.

Does the framework provide objects with the ability to return more than one value? If so, how?

You need to be more specific here, I think. RETURN values are driven by how the developer designs his/her classes. If you need to RETURN multiple values, the simplest way is to construct methods that accept a parameter "object" and update properties of that object.  Or RETURN an object containing the multiple values as custom properties of that object.  The VMP framework neither "enabled" nor "prevents" this technique -- the developer constructs classes and their methods using whatever technique gets the job done.

But that's at the method level, not the object level. So perhaps I am misunderstanding your question.

All but two columns of our most used grid are NOT editable.  Does the framework include a grid class which provides a separate text or background color to indicate an editable column?

The simple answer is "no".  But there are a number of issues here, with respect to VFP grids and the way grid classes/subclasses have to be designed, given that you can't delete members (columns, headers, controls) in a subclass.

In VMP it would be very simple to, at what we refer to as the application-specific" level, set the background color or whatever of each column not containing a "bound"/"editable" control.

There are also any number of alternate ways any particular VMP developer or development team might decide to implement such a visual clue.  It would be a mistake for the framework to employ one specific technique (like a special background color) that would potentially conflict with the needs of any single application.

Which report generator works best with the framework?

I have no idea. That would be a question I think you might better ask at the VMP discussion forum,
http://discussion.visualmaxframe.com, where you'd get answers from VMP developers. I'd guess most are using the VFP Report Designer, but I'm sure many are using other tools, including the Mind's Eye Reporting Engine, FoxFire! and Crystal Reports.

Once a report is generated, can the end-user preview it and select which pages to print?

VMP uses the VFP Report Designer (.FRX files) by default. So whatever is supported by it is what you get. Preview is supported and included in the VMP classes that manage reports, while I think selecting specific pages is another matter altogether. There are so many variations in reporting that I'm not sure coding specific report behaviors is something that a framework should do, but rather allow you to implement whatever you want without getting in the way too much.

How are duplicate entries prevented for non-key fields?  Example: User ID is a primary key, but password is not.  Disallow duplicate passwords.

First, I'd make the password a Candidate Key, to guarantee uniqueness at the database level.

Then, in the validation of the password field, use either of 2 VMP tools to check the uniqueness against the existing data -- X3CKCHEK.PRG or an instance of cusCKCheck class.

The VMP n-Tier services example application also demonstrates using a rule object to enforce CK uniqueness in the middle tier (which also fires automatically from a bound control in the presentation tier) before the data is even sent to the ultimate data source/back end.

Does the framework include a grid class which allows end-users to change column headings?

Not as such. See my response above to your other grid/column question. However, since VMP includes a "user preferences engine", you can hook anything you want into that engine, including custom grid.column.header.Caption text, overriding the default VMP behavior in the SetHeaderCaptions() method of the grid(s) in question.

If you want to allow customized grid.header.caption text at the application level, rather than the user level, you can do so by simply setting Caption properties in the VFP database container (.DBC). Then write your own interface to that property of each field in the database. VMP 'automatically' loads any Caption established in the .DBC when it instantiates grid columns, as the default behavior.