A.D. Tejpal
adtp at airtelmail.in
Mon Aug 13 03:17:54 CDT 2012
J.C., Further to my previous post, sample db named Form_SplitFormSimulated, incorporating the concepts discussed so far under this thread, is now ready and has been placed at Rogers Access Library. It is in access 2000 file format and can be downloaded at the following Link: http://www.rogersaccesslibrary.com/forum/forum_topics.asp?FID=45 A copy of explanatory notes accompanying the sample db is placed below, for ready reference. Interested members of this forum might like to test it and advise whether anything needs further attention. Best wishes, A.D. Tejpal ------------ Form_SplitFormSimulated (Sample Db) Explanatory Notes: =========================== This sample db demonstrates a simulated split form. It has two adjacent subforms, one below the other, separated by a divider bar. Top subform serves as single form while the bottom one represents datasheet portion. There is two way synchronization between single form and datasheet. Comparative vertical space available for the two subforms can be adjusted at run time by dragging the divider bar up or down. Some of the salient features are listed below: 1 - Ease of adaptation: The developer wishing to make an adaptation of this sample db has to simply assign his single form as source object for the top subform. Based upon generic template, datasheet portion of split form gets generated automatically in the bottom subform, displaying columns matching bound controls in the single form above. 2 - Consolidation of code in a wrapper class: Necessary code for integrated coordination between main form as well as its two subforms is consolidated in a wrapper class, instantiated in open event of main form. This class has pointers to both the subforms as well as the main form. Nominal code for raising certain custom events has been added to existing code in single form's module. 3 - No added burden for data loading: Datasheet subform uses the recordset already loaded for single form, thus avoiding any additional burden. 4 - Divider bar: (a) Divider bar can be dragged for dynamic expansion / shrinkage of datasheet and single form heights at run time. (b) On opening the split form, divider bar assumes the position last held in previous session. 5 - Re-sizing of nominated controls on single form: For added convenience, certain controls on single form, e.g. text box bound to memo field or even an image control, can be slated for vertical re-sizing so as to best utilize the available space resulting from divider bar movement. Tag property of such controls should include the word ReSize. In the sample db, such a behavior is demonstrated for control named Synopsis, bound to memo field. 6 - Hiding / Un-hiding of datasheet columns: On opening, datasheet columns matching memo fields are in hidden state. The user can hide any other column by double clicking the same. Similarly, any column can be un-hidden by double clicking the matching bound control on single form. 7 - Auto adjustment of datasheet column widths: (a) At any given stage, the width of displayed columns gets adjusted automatically, so as to ensure optimum utilization of available width of datasheet window, duly taking into account the latest status of hidden / un-hidden columns. (b) For a given single form, on opening for the very first time, datasheet columns assume equal width, suiting available space. Thereafter, if the user has manually adjusted the column widths, any further automated adjustment of column widths in response to hiding / un-hiding of columns is carried out in such a manner as to retain relative proportion of column widths. (c) On click of a command button, the user has the option to reset all column widths equally distributed, as if it were the first opening of form. 8 - Highlights: (a) When a datasheet column is in hidden state, corresponding control in single form gets highlighted in light grey. As and when the column is un-hidden, matching control on single form reverts to its normal color. (b) Current row in datasheet gets highlighted in light green. (c) As the user tabs from one control to the other on single form, matching cell on current row of datasheet gets highlighted in distinct color (say light maroon). 9 - Search Action - Positioning of destination row in datasheet window: Based upon search action performed via suitable controls (like combo box etc) on the single form, the destination row on datasheet gets positioned at middle of display window. This takes into account dynamic height of datasheet window, resulting from movement of divider bar. Usage: 1 - Incorporation of a new single form (other than the one included in this sample) in split form arrangement. 1.1 - Place following two statements in declarations section of VBA module pertaining to the form planned to be used as single form. Public Event EvFilter() Public Event EvSearchDone(fm As Access.Form, AbsPos As Long) 1.2 - In single form's VBA module, insert the following statement after each code block that affects form's filter state: RaiseEvent EvFilter 1.3 - Similarly, insert the following statement after the code block meant for performing search action: RaiseEvent EvSearchDone(Me, Me.Recordset .AbsolutePosition) 1.4 - In declarations section of code module for class C_SplitForm, modify the following statement so as to match the name of single form actually used by you: Private WithEvents msfmSF2 As Form_FSub_Single (For example, if your form's name is MyForm, it will read Private WithEvents msfmSF2 As Form_MyForm) 2 - Integrated wrapper class C_SplitForm is incorporated in the module of main form F_Main as follows: 2.1 - Following statement is in F_Main's declarations section: Private mfm As C_SplitForm 2.2 - Following code is in F_Main's open event: Set mfm = New C_SplitForm mfm.P_Init Me, Me.SF_A, Me.SF_B, Me.SF_Ref, Me.LbDiv Note: (a) Subform control at top, i.e. SF_A holds the single form while SF_B holds the datasheet form. (b) Hidden subform control named SF_Ref holds a single record subform for storing the position of divider bar as well as name of single form - at close of session. (c) Label LbDiv serves as the divider bar. It can be dragged up & down as desired. (d) Setting of mfm to Nothing is carried out in close event of mfmMain in wrapper class C_SplitForm, so as to ensure proper termination of the class. (Care should be exercised Not To set mfm to Nothing in real form's module, for example in its close event, as that would interfere with smooth termination of wrapper class. - Also see remarks in close event of mfmMain in this class). (e) Class C_SplitFormControls is a child class of wrapper class C_SplitForm. (f) Generic datasheet form used in bottom subform control (SF_B) has no code in its VBA module. It has 200 unbound text boxes along with corresponding attached labels so as to cater up to 200 columns. Version: Access 2000 file format. References: DAO 3.6 A special note of thanks to John W. Colby (of Colby Consulting) for kindly providing valuable insights and willingly sharing his vast expertise in the field of classes. ==================================