William Hindman
wdhindman at bellsouth.net
Tue Jan 13 09:14:33 CST 2004
...great thread ...every once in a while I still manage to learn something from you :) William Hindman ----- Original Message ----- From: "John W. Colby" <jwcolby at colbyconsulting.com> To: "Access Developers discussion and problem solving" <accessd at databaseadvisors.com> Sent: Tuesday, January 13, 2004 9:43 AM Subject: RE: [AccessD] =function() in .onclick > Chris, > > I credit Shamil with teaching me everything I know about Withevents. I > would never have discovered them, and would not be where I am today in > Access without his examples and his prodding to look at WithEvents. > > If you looked at Shamil's stuff you will see where he places the [Event > Procedure] in the control's event procedure using code inside the Init event > of the class itself as the class instantiates. That is where I learned to > do this and one reason I so dislike developers putting function calls in > those properties. > > I used to use the tag property a lot using ADH code to set and read them. > Once I started using classes I moved away from that to either setting > properties directly in the class init or (in the case of my scanner, where > it's more generic) using class properties to set these values later. There > are pluses and minuses to using the tag - the control carries it's > initialization properties with it, but if any other developer uses the tag > yours can get trashed. I finally just stopped using it although there is > still ONE place I do, and that is in my Just In Time form loading, where I > place the form name in the tag. If it's there it will do JIT, otherwise it > just loads normally. > > I would like to thank you though for the hint about input masks. My users > have been pushing me to "standardize" the date inputmasks and using my > framework I can do just that quite easily. > > John W. Colby > www.ColbyConsulting.com > > -----Original Message----- > From: accessd-bounces at databaseadvisors.com > [mailto:accessd-bounces at databaseadvisors.com]On Behalf Of > chris at thecube.net > Sent: Tuesday, January 13, 2004 8:00 AM > To: accessd at databaseadvisors.com > Subject: RE: [AccessD] =function() in .onclick > > > John, > > Very similar to my method, but with a few slight differences, i may have > missed out on new methods > of using withevents, but i instantiate a class for the form, and instantiate > classes for each of > the controls (unless i exclude them) i control the behaviour of the controls > using a list of > parameters in the tag property so an entire data form could look like this > behind the scenes. > > Dim DEEP As New clsFormControls > > Private Sub Form_Load() > DEEP.Init Me > End Sub > > Private Sub Form_Close() > DEEP.Terminate > End Sub > > and then i have a range of parameters for each of the controls: > > Text Boxes: > > DateControl=True applies a common input mask and formatting, as well as > adding double-click > functionality that pops up a calendar > > FilterForm=True;FilterField=<MyField> Dynamically filters the Form Data > > QuickSearch=True;SearchCtl=ControlName for doing a quick search > (suprisingly) > > I have made various of other additions but i must mention that my code is > largely based on Shamil > Salakhetdinov's external events programming but i feel quite pleased with my > modifications > > ----- Original Message ----- > From: John W. Colby > To: "Access Developers discussion and problem > solving"<accessd at databaseadvisors.com> > Sent: Tue, 13 Jan 2004 06:32:48 -0500 > Subject: RE: [AccessD] =function() in .onclick > > Chris, > > >do you have a lot of variants for say textboxes or do you prefer to add > parameters at runtime to sink different events / control behavior? > > I actually have an entire framework that does all of this stuff. I have a > form class that sinks all of the form's events. That class has a collection > which holds a class instance for each control found on the form. I then > have classes for each control type which implement standard behaviors which > I find useful - dblclick for a combo can open a list form for entering or > correcting data contained in the combo, NotInList can add data to the table > behind the combo and requery the combo when done etc. The form class has a > scanner that cycles through all the controls in its form's control > collection, instantiating a class for each control found (that I have a > class for anyway). > > IOW, as the form loads, it scans for all controls, loads a class for each > control found and saves a pointer to that control in the control class > collection in the form's header. > > I then use what I call SysVars or System Variables to enable / disable > specific form / control functionality. It turns out I have to "set up" > things like the double click and NotInList for a combo anyway, i.e. I have > to tell the combo the name of the form or the name of the table and the > field in the table to place data in NotInList. My form open ends up looking > something like: > > Option Compare Database > Option Explicit > Public WithEvents fclsFrm As dclsFrm > > Private Sub Form_Open(Cancel As Integer) > On Error GoTo Err_Form_Open > Set fclsFrm = New dclsFrm > fclsFrm.Init Nothing, Me, Cancel > If Cancel Then Exit Sub > 'init the combo dbl-click and NotInList > On Error Resume Next > With fclsFrm.Children > .Item("cboCountry").NotInListData "", "", "lfrmCountry" > .Item("cboState").NotInListData "", "", "lfrmState" > End With > 'look for the lfrm used by these combos. > 'fclsFrm.Children("cboCountry").LFrm = "lfrmCountry" > 'fclsFrm.Children("cboState").LFrm = "lfrmState" > Exit_Form_Open: > Exit Sub > Err_Form_Open: > Select Case Err > Case 0 '.insert Errors you wish to ignore here > Resume Next > Case Else '.All other errors will trap > Beep > MsgBox Err.Description, , "Error in Sub tfrmClients.Form_Open" > Resume Exit_Form_Open > End Select > Resume 0 '.FOR TROUBLESHOOTING > End Sub > > As you can see, I dim a class for the form (fclsFrm), then in OnOpen I > instantiate it. By the time the form class init returns all the control > classes have been loaded and are sitting in the children collection keyed on > control name. I then "set up" things like NotInList by calling a function > in the combo's class passing in the name of the form (and also table / field > for single field list tables). Sometimes I want the NotInList to open a > form (it is complex data with many fields), sometimes I want it to just > enter the data into a specific field in the table (it is a simple list like > titles or colors). > > So, the answer to your question is, I have the generic functionality I need > for the controls already in the class for that control type. I can use it > or not depending on whether I tell the class to do so. Very form / > application specific behaviors I will generally program out in a separate > class. > > John W. Colby > www.ColbyConsulting.com > > -----Original Message----- > From: accessd-bounces at databaseadvisors.com > [mailto:accessd-bounces at databaseadvisors.com]On Behalf Of > chris at thecube.net > Sent: Tuesday, January 13, 2004 6:08 AM > To: accessd at databaseadvisors.com > Subject: RE: [AccessD] =function() in .onclick > > > John, > > Thanks for the 'warm' response <g>. > > I think i will get on and write the checkbox class to handle all of the > checkboxes, on the subject > of WithEvents/DEEP, do you have a lot of variants for say textboxes or do > you prefer to add > parameters at runtime to sink different events / control behaiviour? > > Cheers John > > Chris > ----- Original Message ----- > From: John W. Colby > To: "Access Developers discussion and problem > solving"<accessd at databaseadvisors.com> > Sent: Tue, 13 Jan 2004 05:39:56 -0500 > Subject: RE: [AccessD] =function() in .onclick > > I can't help you as to why it sometimes works and others it doesn't. > However I'd like to say I HATE it when developers do this (and I have to > maintain it). I routinely use the find dialog to find instances of code. > Doing it like that means that I have to use a find and replace utility > instead which is much more intrusive to my development effort. > > Another thing is that if you ever intend to use Withevents, they don't fire > unless the words [Event Procedure] are in the property. If you have an > event stub, you can use withevents (sink the event in a class) and the event > handler in the form at the same time - the event handler in the class simply > gets control first. Doing it with the function call in the property > prevents sinking that control's events anywhere else. > > Now... > > If you ever handed that application off to someone like myself (who uses > withevents), I build a class that directly pokes the words [Event Procedure] > into the control's event property (to make sure the event fires) and now MY > class works but your functionality abruptly ceases to work. > > Just thought I'd throw that out there. > > If I were you I'd probably write a class that handles those checkboxes, > either individually or en mass. > > John W. Colby > www.ColbyConsulting.com > > -----Original Message----- > From: accessd-bounces at databaseadvisors.com > [mailto:accessd-bounces at databaseadvisors.com]On Behalf Of > chris at thecube.net > Sent: Tuesday, January 13, 2004 5:24 AM > To: accessd at databaseadvisors.com > Subject: [AccessD] =function() in .onclick > > > Hi All, > > Instead of writing 54 event procedures, i simply iterate through a > collection of checkboxes and set > their AfterUpdate property to a function like so: > > for index = 1 to 54 > me("chkTemplate" & index).Afterupdate = "=toggleTemplate(" & index & ")" > next > > now, on some Access 2000 installs this works fine, yet on others it baulks > at trying to put a > function straight into the event like above. > > Am I doing anything wrong? > > Cheers > > Chris > > > > _______________________________________________ > AccessD mailing list > AccessD at databaseadvisors.com > http://databaseadvisors.com/mailman/listinfo/accessd > Website: http://www.databaseadvisors.com