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>

Reply via email to