- Local time
- Today, 23:20
- Joined
- Jul 9, 2003
- Messages
- 16,957
Well, I haven't been so absorbed in programming since my early days, when I discovered you could assign objects to an object variable and do some wonderful code with it!
I had dabbled with class modules, but I never found a really useful use for a class module, until now!
I was going to say I couldn't have done it without ChatGPT, but I'm pretty sure I could have done it on my own. It would have just taken me a week instead of a couple of evenings!
I like walking through objects with a For next loop, and operating on a set of objects simultaneously.
I also have a situation on a form where I have a pair of objects, a TextBox and an OptionGroup. The TextBox provides the search term, and the OptionGroup provides the type of search you want to operate:
But then ChatGPT suggested I put them in a collection. Now I remember a thread a while back where Mark said that he often uses collections (If I recall correctly)... Further interrogation of ChatGPT led to the idea of building a class module to hold details of the object and a collection to retain the objects, and a custom property to fill the collection.
See how short, condensed, and tidy the code now becomes!
I had dabbled with class modules, but I never found a really useful use for a class module, until now!
I was going to say I couldn't have done it without ChatGPT, but I'm pretty sure I could have done it on my own. It would have just taken me a week instead of a couple of evenings!
I like walking through objects with a For next loop, and operating on a set of objects simultaneously.
I also have a situation on a form where I have a pair of objects, a TextBox and an OptionGroup. The TextBox provides the search term, and the OptionGroup provides the type of search you want to operate:
- Option 1: Wildcard search, ends with (e.g., 'abc*'): SQL: LIKE 'abc*'.
- Option 2: Wildcard search, contains (*abc*): SQL: LIKE '*abc*'.
- Option 3: Wildcard search, starts with ('*abc'): SQL: LIKE '*abc'.
- Option 4: Null search (IS NULL): SQL: [Field] IS NULL.
- Option 5: Exact match ('abc'): SQL: = 'abc' (no wildcards).
Naming Convention
- My original code used a customised naming convention to match the controls. The later version now uses the Tag property. The Textbox Tag property contains the name of the field to be searched, it was a logical step to move away from the customised naming convention and add the search field name to both the text box and option group tag property to link each TextBox to its corresponding OptionGroup. This way, I know which pairs to operate on.
But then ChatGPT suggested I put them in a collection. Now I remember a thread a while back where Mark said that he often uses collections (If I recall correctly)... Further interrogation of ChatGPT led to the idea of building a class module to hold details of the object and a collection to retain the objects, and a custom property to fill the collection.
Benefits of the Class Module
- The class module encapsulates both the TextBox and OptionGroup into a single entity, so I don't need to worry about handling them separately.
- Encapsulation allows me to treat the pair as a standalone object, making the code simpler and more maintainable.
Here is the Old Code to set the text boxes to an empty string and return the option groups to option one:
Code:
Dim ctlTxt As Control
Dim ctlOpt As Control
Dim intTxtPrefixLen As Integer
Dim intOptPrefixLen As Integer
intTxtPrefixLen = Len(conTxtPrefix)
intOptPrefixLen = Len(conOptPreFix)
For Each ctlTxt In Me.Controls
If ctlTxt.ControlType = acTextBox Then 'Find text boxes only
If Left(ctlTxt.Name, intTxtPrefixLen) = conTxtPrefix Then 'that are prefixed conTxtPrefix
ctlTxt.Value = "" 'Clear out the Text Box
End If
End If
For Each ctlOpt In Me.Controls
If ctlOpt.ControlType = acOptionGroup Then 'only select option groups
If Right(ctlOpt.Name, Len(ctlOpt.Name) - intOptPrefixLen) = ctlTxt.Name Then 'where the name matches the text box
ctlOpt.Value = 1 'Set the leftmost option button
End If
End If
Next ctlOpt
Next ctlTxt
Here is the New Code
Code:
Dim ctrlCriteria As clsSearchCriteria
' Loop through the collection of SearchCriteriaCollection objects
For Each ctrlCriteria In Me.SearchCriteriaCollection
' Clear the TextBox value
ctrlCriteria.TextBox.Value = "" ' Clear the TextBox
' Reset the OptionGroup to the default option (leftmost button)
ctrlCriteria.OptionGroup.Value = 1 ' Reset to the first option
Next ctrlCriteria
See how short, condensed, and tidy the code now becomes!
Further Benefits
- Simplifies code reuse for multiple TextBox and OptionGroup pairs.
- No need to worry about handling TextBox and OptionGroup separately—it's all in one object via the class module.
Last edited: