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.
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:
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:
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?
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?
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