On Sep 27, 2006, at 10:54 AM, Bart Pietercil wrote:
On 27-sep-06, at 18:29, CV wrote:
On Sep 27, 2006, at 8:17 AM, Bart Pietercil wrote:
Hi,
this worked:
defined and filled CurrentStudentRecord as a Dictionary having
the DBColumnName as Key
defined a subclass from editfield named sqlite_field
with an extra property DBColumnName
added an interface to the class with a DisplayStudentInfo method
defined App.StudentFields() As sqlite_fields
in the change event of my listbox the code
for i = 0 to Ubound(App.StudentFields)
App.StudentFields(i).DisplayInfo
next
updates all the sqlite_fields with their appropriate values
JOY
now I want to add some popupmenus to the dance
so I subclassed a popupmenu as sqlite_pumenu that interfaces with
the DisplayStudentInfo method
-------
this does not work and where I am at lost
I cannot add my sqlite_pumenu's to App.StudentFields (it is not a
sqlite_field)
I changed the StudentFieldsArray to type Control. This seems to
work as RB does not complain when I add the sqlite_xxxx to the
array.
However RB does not accept the line App.StudentsFields
(i).Displayinfo . This line only seems to work when the array is
of type sqlite_field
At this point you should be able to cast to expose the subclass
functionality: Sqlite_field(App.StudentsFields(i)).DisplayInfo,
since, as I understand it, App.StudentsFields(i) of data type
Control is actually a Sqlite_field.
Although I hadn't thought about casting this seems to be defying
the purpose since what I want to achieve is an array consisting of
several kinds of controls
(editfields,popupmenu,radios,checkboxes,....) which share (through
the interface) the DisplayInfo method. In this way I hoped to avoid
a lot of "cases" and "Isa's"; If I am to follow your lead on this,
I would still have to introduce "isa sqlite_pumenu" or "isa
sqlite_field" checking , wouldn't I ?
Alternately you could dimension your array to your interface. Then
you could access the interfaced methods directly without casting or
"isa". However, you will have to cast to the subclass that
implemented the interface in order to expose the methods/properties
of that subclass should you need them, and that will require 'isa'.
Best,
Jack
Perhaps a dictionary would be a better design choice than any
array, however.
I've been thinking about this. Since I have already a dictionary
representing the SelectedStudent (key = DBColumnName, Value =
DBValue), I could make a "mirroring" Dictionary built on
DBColumnname and the object representing the info on screen. But
wouldnt I still need to cast ? Or should this work:
myDict.Value("DBColumnName").DisplayInfo ?
No, I think you will have to cast as well. If Value was assigned into
the dictionary as an instance of a subclass that implemented the
interface declaring DisplayInfo then you have to cast to the
subclass. As a somewhat related example:
dim dd as new Dictionary
dd.Value("Element1") = StaticText1 'an instance of MyStaticText, a
subclass of statictext which implements an interface containing the
Display method.
If dd.Value("Element1") IsA StaticText then
MyStaticText((dd.Value("Element1"))).Display
End
_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>
Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>