Bob Bedell
bobbedell15 at msn.com
Sat Jun 7 18:17:43 CDT 2003
Hi Shamil, Didn't mean to delay letting you know how this worked for me, but I was out of town yesterday and most of today. Just pulled in. I'm looking forward to catching up. (Seems like you and John have been batting this around a bit). Interestingly, ADH demonstrates (while neither endorsing nor disapproving) the work-around you argue against (relying on features available in VB6 that aren't supported by VBA) for a purpose other than exposing classes. It shows how to edit a class's source file on disk in a way that emulates setting procedure attributes with the Procedure Attributes dialog available in the VB IDE. Same work-around, different use (though thery're both concerned with setting attributes of one sort or another that the VBA IDE can't access). I'll let you know how I make out with your class factory suggestion. Thanks for the help. Bob >From: "Shamil Salakhetdinov" <shamil at smsconsulting.spb.ru> >Reply-To: accessd at databaseadvisors.com >To: accessd at databaseadvisors.com >Subject: Re: [AccessD] Where does WithEvents go? >Date: Fri, 6 Jun 2003 22:27:40 +0400 > > > I think the Access Developer's Handbook > > has a sentence or several on this too. >Bob, > >I've never read ADH for Acc97 and up so I can only guess what it states but >I can publicly bet (:)) a box of famous here now after Gustav Brock's >promotion Nevskoye beer vs. a bottle of Tequila(it's expensive in Russia) >that you can do what you need using Public Not Creatable classes - I mean >EXACTLY the same you can do if you write an ActiveX dll EXCEPT only one >thing you'll have to create AT LEAST one (class factory) class instance >using wrapper/helper function/sub from standard module - ALL THE REST can >be >in your custom classes including public events, which can be raised from >them and captured(/sunk) in the the form from your frontend... > >e.g. you can create in your lib database a custom class Class1 with >PublicNotCreatable instancing: > >Public Event abc() > >Public Function FireAbc() > RaiseEvent abc >End Function > >and a standard module with a wrapper function: > >Public Function getABC() As Class1 > Set getABC = New Class1 >End Function > >and then in your front-end form you can write: > >Private WithEvents a As Class1 > >Private Sub Form_Load() > Set a = getAbc >End Sub > > >Private Sub a_abc() > MsgBox "ABC fired" >End Sub > >Private Sub Command0_Click() > a.FireAbc >End Sub > >If this isn't what you're looking for then the please clarify in more >details what is the task, which you'd like to solve and why >PublicNonCreatble instancing isn't enough to solve it. > >Shamil > >----- Original Message ----- >From: "Bob Bedell" <bobbedell15 at msn.com> >To: <accessd at databaseadvisors.com> >Sent: Friday, June 06, 2003 5:13 PM >Subject: Re: [AccessD] Where does WithEvents go? > > > > Hi Shamil, > > > > Thanks for the thought. My Instancing property is, unfortunately, >already > > set to PublicNotCreatable. My > > calling database can see and call an instance of GetclsInventory fine. >The > > wrapper function returns an > > object with ten fingers and toes. All properties and methods, except the > > custom event, work fine. > > Here's the wrapper again (just for the sake of pointing out one thing): > > > > Public Function GetclsInventory() > > Dim objInventory As clsInventory > > Set GetclsInventory = New clsInventory > > End Function > > > > It seems that in order for GetclsInventory to be able to raise a custom > > event, the Dim line here would > > have to read: > > > > Dim WithEvents objInventory As clsInventory > > > > That, I assume, is where WithEvents would need to go: with the object > > declaration. But I can't do that > > here because I have the wrapper in a standard code module, and with >events > > can only be used in form > > and class modules. So my options seem to be (none of which I have been >able > > to make work) to > > declare objInventory in either my calling form class somehow (can't come >up > > with a visible global > > variable), or in another class module in the library or calling >database, >or > > in the clsInventory class itself. I > > was just hoping someone would say, "Oh sure, wrapper function, goes in >class > > w in component x. Call it > > with y in component z.", or "Sorry, can't raise custom events from an >Access > > library database.", etc. > > >From what little I've been able to read on the subject (I found a whole > > paragraph in one of Wrox's > > Access books), the wrapper should go in a standard module in the library > > database. That, however, rules > > out the use of custom events with WithEvents). I think the Access > > Developer's Handbook has a > > sentence or several on this too. Compiling an ActiveX dll is always >another > > option. But I wanted to give > > the Access library a test drive. > > > > Thanks again for the reply. > > > > Bob > > > > > > >From: "Shamil Salakhetdinov" <shamil at smsconsulting.spb.ru> > > >Reply-To: accessd at databaseadvisors.com > > >To: accessd at databaseadvisors.com > > >Subject: Re: [AccessD] Where does WithEvents go? > > >Date: Fri, 6 Jun 2003 12:55:25 +0400 > > > > > >Bob, > > > > > >You can set your class module's Instancing property to > > >'2-PublicNotCreatable' then you can continue to use it the way you used >it > > >without library - you will just need to get its instance by your > > >wrapped/helper function GetclsInventory... > > > > > >HTH, > > >Shamil > > > > > >----- Original Message ----- > > > From: Bob Bedell > > > To: accessD at databaseadvisors.com > > > Sent: Friday, June 06, 2003 10:21 AM > > > Subject: [AccessD] Where does WithEvents go? > > > > > > > > > I hope I can make this intelligible. Info on this issue seems a bit > > >sparse. I have a custom class and a form that work fine together. The >class > > >declares a custom event using Public Event syntax in the general > > >declaration and Raise syntax in a method. The calling class (the form) > > >declares a private instance of the class using WithEvents and >instantiates > > >it. No problems. > > > > > > > > > > > > Now I'm trying to import the class into a library (mda.) and set a > > >reference to it in the database that contains the calling form. It's my > > >understanding that my calling application can't instantiate the class > > >directly, and needs to use a wrapper function. So I added a standard >module > > >to the calling application that calls a function in the library >database > > >which returns a copy of the object. The calling database then has a >public, > > >shared copy of the object to work with. The standard module in the >calling > > >database is: > > > > > > > > > > > > Public g_oInventory As clsInventory > > > > > > > > > > > > Public Sub Startup() > > > > > > ' Get handles to shared objects > > > > > > Set g_objInventory = GetclsInventory > > > > > > > > > > > > DoCmd.OpenForm "frmInventory" > > > > > > End Sub > > > > > > > > > > > > The standard module in the library database (where the class is >located) > > >is: > > > > > > > > > > > > Public Function GetclsInventory() > > > > > > Dim objInventory As clsInventory > > > > > > Set GetclsInventory = New clsInventory > > > > > > End Function > > > > > > > > > > > > Here's my problem. Using the library scenario, I can't find any >place >to > > >put my WithEvents statement. The old declaration (before seperating the > > >class and the form) was in the forms general declaration: > > > > > > > > > > > > Private WithEvents m_objProduct As clsInventory > > > > > > > > > > > > But now (library scenario) the declaration needs to be global, >needs >to > > >include WithEvents, and needs to be in a class or form module >(WithEvents > > >won't work in a standard module). > > > > > > > > > > > > Should I do a VB ActiveX component instead? I'm kinda' at a loss >here. > > >Real limited experience with classes/libraries stuff. Thanks to anyone >who > > >can make heads or tails of that. > > > > > > > > > > > > Bob > > > > > > > > > > > > > > > > > > >--------------------------------------------------------------------------- >--- > > > > > > > > > _______________________________________________ > > > AccessD mailing list > > > AccessD at databaseadvisors.com > > > http://databaseadvisors.com/mailman/listinfo/accessd > > > Website: http://www.databaseadvisors.com > > > > > >_______________________________________________ > > >AccessD mailing list > > >AccessD at databaseadvisors.com > > >http://databaseadvisors.com/mailman/listinfo/accessd > > >Website: http://www.databaseadvisors.com > > > > _________________________________________________________________ > > MSN 8 with e-mail virus protection service: 2 months FREE* > > http://join.msn.com/?page=features/virus > > > > _______________________________________________ > > AccessD mailing list > > AccessD at databaseadvisors.com > > http://databaseadvisors.com/mailman/listinfo/accessd > > Website: http://www.databaseadvisors.com > >_______________________________________________ >AccessD mailing list >AccessD at databaseadvisors.com >http://databaseadvisors.com/mailman/listinfo/accessd >Website: http://www.databaseadvisors.com _________________________________________________________________ STOP MORE SPAM with the new MSN 8 and get 2 months FREE* http://join.msn.com/?page=features/junkmail