[AccessD] Building a control class

Jim Dettman jimdettman at verizon.net
Tue Mar 3 15:29:44 CST 2009


 
<<    What I have in mind is a generic class, that morphs into a dedicated
type as per the control passed to it. For example, if a text box is passed
as argument, it acts as pure text box class. Similarly, for a combo box, it
functions as pure combo box class.>>

  If VBA had full inheritance, then you could do that.  But since it does
not, you can't truly build a class hierarchy such as this.

  A good example of what your thinking might be a date only control.  Really
it's a text control that only allows dates to entered.  If VBA really had
inheritance, then you would have your class of TextControl, which you'd
inherit and override to get the date only behavior. 

  I've worked in VFP for a few years now and everything in VFP is built on
top of base classes.  In fact, for the framework I use, it breaks out like
this:

VFP Base Classes
   VMP Base Classes (framework that I use)
      OCS Base Classes (my classes)
         App specific classes.

  So if I want to change the way a text control works in every application
that I write (say to add a security feature), then I change the OCS base
classes.  Every app then gets the behavior.

Jim.

-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of A.D.Tejpal
Sent: Tuesday, March 03, 2009 1:54 PM
To: Access Developers discussion and problem solving
Subject: Re: [AccessD] Building a control class

John,

    What I have in mind is a generic class, that morphs into a dedicated
type as per the control passed to it. For example, if a text box is passed
as argument, it acts as pure text box class. Similarly, for a combo box, it
functions as pure combo box class.

    No doubt, the code content for such a class is more than that in tailor
made class for single control. However, it offers the advantage of a common
place to manage the code. Duplication of certain content across multitude of
classes can be avoided. If any common improvement  / enhancement in class
code is found necessary, it can be done conveniently at one place. No need
to edit all the scattered classes for individual controls.

Best wishes,
A.D. Tejpal
------------

  ----- Original Message ----- 
  From: jwcolby 
  To: Access Developers discussion and problem solving 
  Sent: Tuesday, March 03, 2009 18:54
  Subject: Re: [AccessD] Building a control class


  A.D.

   >If a single class covering all controls (complete with events) were to
be devised, could there be any reason not to prefer it over a host of
classes control-wise?

  Unfortunately a generic control object cannot be dimensioned WithEvents,
which is what is required in order to be able to sink the events for a
control.

  If you think about it, each control can have completely different events.
Take the combo control for example, it can raise a NotInList event.  The
only other control that has this event is the list control.  The data
controls have dirty, undo and change events whereas the command button does
not.

  So, you cannot pass in a control object (as opposed to a textbox object or
a combo object or a command button object) and then save it to a control
object variable WithEvents.  So you cannot sink the events inside of the
class.

  Aside from that there are indeed good reasons to have a class for each
object.  A class is supposed to model an object.  A command button is not a
combo.  A tab page is not a text box.  Each of these things has specific
things that you need to handle.  The combo is going to have a NotInList
which you will need to sink and run code for.  A text box may want to drill
down to discover its bound field data type so that it can set a specific
date format (just an example), whereas a tab page will not need that.  

  So if you did try to create a single generic control class (and could
somehow sink 
  the events) you would still end up with code and variables for a mish-mash
of objects, and your class would become a nightmare.  A text box may want to
build an audit trail system whereas a command button wouldn't.

  You would not create a single class to represent a bank, account, customer
and check, even though they are all parts of a bank system.  Aside from the
event sink quandary, controls are simply too different to model them all in
one class.

   >While assigning "[Event Procedure]" to various events, it seems
desirable to make it conditional to the event not already having been
assigned some function (e.g. =MyFunction()) as otherwise the latter stands
suppressed.

  That is true.  OTOH, once you start building a true framework where the
form class scans for controls and automatically assign classes to the
controls, you are going to want to find and at least discover what these
MyFunction() thingies do.  Probably you will want to migrate their
functionality into the control classes.

  I have an ideological resistance to using that =MyFunction() method of
hooking events.  My problem with the method is that is almost impossible to
discover what control uses MyFunction() without a search and replace
program.  Even with said program how do you discover every event in the
program hooked in such a manner?  It is a maintenance nightmare.  By using a
class for each control, you can place all such functions directly in the
class, build the event sinks to call the functions in the class, and have a
single place to go to maintain all that code.

  If you are going to work in a system that contains such event hooks, you
will probably have to write code to open every form, scan all of it's
events, then scan every control on each form checking all of their events
specifically looking for such hooks and recording them in a table for
cleanup.

  One of the objectives of a framework is to have a consistent user
interface across the application. While MyFunction() might accomplish some
specific piece of the interface precisely as intended, as you move to a
framework it becomes tough to extend the interface since you expect your
control classes to provide the functionality.  The form class control
scanner will automatically find and hook events, whereas the MyFunction()
method depends on the developer remembering to do that.  If a new developer
comes in (s)he may not even know to go hook up all of the events as (s) adds
a control to the form.

  John W. Colby
  www.ColbyConsulting.com


  A.D.Tejpal wrote:

  > John,
  > 
  >     If a single class covering all controls (complete with events) were
to be devised, could there be any reason not to prefer it over a host of
classes control-wise ?
  > 
  >     While assigning "[Event Procedure]" to various events, it seems
desirable to make it conditional to the event not already having been
assigned some function (e.g. =MyFunction()) as otherwise the latter stands
suppressed.
  > 
  > Best wishes,
  > A.D. Tejpal
  > ------------
-- 
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com




More information about the AccessD mailing list