Here is the complete transcript from the 2nd Conference on the Gupta
Forum hosted by Peter Hazlehurst of Phoenix International on Monday,
December 13th, 1993.

Please read this transcript as if it were a hall-way conversation;
its not meant to be a statement of direction or an authoritative
source of information, but rather as a snapshot of what was on people's
minds 11/29/93 at about 4-6 pm Pacific Time.  You will find plenty of
typographical errors due to participant's focuses upon typing quickly 
rather than 'publishing' their words.

If you would like to know more about anything that was said here,
consider contacting any of the individuals via forum message or
CIS Mail.

Dave Karow - Primary Sysop - Gupta Forum
Technical Support Operations

********** 12/13/93 3:56 PM  Forum CO
R 3  : *SYSTEM*             | Switching to SQLWindows/Quest
       Dave Karow [Gupta]   | Greetings "AC"   Peter will be "in" shortly.
                            | Have you come for the conference?
       AC                   | Thanks. My first time to the forum.
                            | I found the notes from the last forum very 
                            | interesting.
       Dave Karow [Gupta]   | Great.  Would you mind using your full first 
                            | and last
                            | name?  We try to avoid 'aliases' or company 
                            | names when
                            | possible.  I can give instructions if you 
                            | need assistance
                            | changing your nickname.
       AC                   | No problem. Let me try it.
                            | Is there a limit to the number of people in 
                            | this room?
       Dave Karow [Gupta]   | Not realistically.  We could have upwards of 
                            | a hundred or
                            | more.  From a control and chaos standpoint, 
                            | really -large-
                            | conferences are held in CompuServe's 
                            | "Conference
                            | Center" which has enhanced large group 
                            | management.
       Vik C [Gupta]        | Hi all -- this the SQLWindows conference?
       Dave Karow [Gupta]   | PS: You are still showing up as "AC".  Have 
                            | you found the
                            | nickname entry in Special, Preferences, 
                            | Forums, More yet?
       Chris Crawford       | I'm ready for it.
       Dave Karow [Gupta]   | Hi Vik.. Yes this is the right place.  Peter 
                            | will be with us in
                            | a moment or two.
       Chris Crawford       | I'm using CIM, and show up as Chris Crawford 
                            | on my screen...
       Dave Karow [Gupta]   | As you do on mine now Chris.  Sorry for the 
                            | false alarm.
       Chris Crawford       | Dave, will you be 'recording' this for later?
       Dave Karow [Gupta]   | Hello Mike E.  Peter Hazlehurst, the host of 
                            | this
                            | conference will be here soon.
       Dieter Muench        | Hi,
       Dave Karow [Gupta]   | Chris: Yes.  I'm recording.
                            | Hello Dieter.  Settle on in.  We'll start 
                            | soon. 
       Peter H @Phoenix     | Welcome all!!!!
                            | That was quick huh dave!!!
       Dave Karow [Gupta]   | Welcome, Mr Host.
       Dieter Muench        | I was in the TeamWindows room who is there ? 
                            | i'm in a conferenc in CS for the first time
       Mike Engstrom        | Hi,  I am Mike Engstrom from Linc Systems in 
                            | Bloomfield, CT.  I am also here with
                            | several other SQLWindows Developers from Linc 
                            | Systesm...
       Peter H @Phoenix     | Hello Linc... is my mate there??>>>???
       Mike Engstrom        | Who is your mate....
       Chris Crawford       | Hi, I'm Chris Crawford with Andersen 
                            | Consulting in Chicago IL.
       Richard Laughlin     | I amHello, I'm Richard Laughlin in Syracuse NY
       Peter H @Phoenix     | good question... he's a big guy with a Beard!?
       Mike Engstrom        | George or Chris?
       Peter H @Phoenix     | George!
       Dieter Muench        | good bye, i enter later again
       Richard Laughlin     | [B
       Hitomi Eura(AP-Labs  | HI! I'm Hitomi Eura, SQLWindows Developer in 
                            | Japan.
                            | This is the first time attending CIS 
                            | conference.
       Mike Engstrom        | No, George could not attend.
       Peter H @Phoenix     | Konban wa Hitomi
       Vik C [Gupta]        | Hi all -- I'm Vik Chaudhary with Gupta.
                            | Product-Manager-of-SQLWindows-and-its-Team-Pro
                            | grammi
                            | ng-Component-called-TeamWindows.
       Peter H @Phoenix     | I think we shall wait about 5 more minutes 
                            | and then get rolling
                            | is that ok?
       Hitomi Eura(AP-Labs  | Good moring Peter. It's 9:10.
       Dave Karow [Gupta]   | FYI: the AGENDA can be viewed by Library, 
                            | Search,
                            | CA1213.txt <return>, "View".  You can then 
                            | minimize it
                            | and keep it handy on your forum "desktop".
       Peter H @Phoenix     | oops Hitomi... time zones get confusing!
       Mike Engstrom        | We just launched the first Southern New 
                            | England Gupta User Group meeting here...
       Vik C [Gupta]        | 5 minutes... good, I have to reboot my 
                            | computer.
       Peter H @Phoenix     | victim of an RC Vik?
       Chris Crawford       | RC?
       Mike Engstrom        | Vic,  Are you running Team Windows????
       Peter H @Phoenix     | Release Candidate.... (nasty call Mike!) <G>
       Dave Karow [Gupta]   | I'll repeat this a couple of times so all who 
                            | are running
                            | WINCIM and entering late can see it:  FYI: 
                            | the AGENDA
                            | can be viewed by Library, Search, CA1213.txt 
                            | <return>,
                            | "View".  You can then minimize it and keep it 
                            | handy on
                            | your forum "desktop".
       Peter H @Phoenix     | Dave... how do we capture?
       Dave Karow [Gupta]   | Special, Forums..., More, [x]Room
       Peter H @Phoenix     | merci
       Dave Karow [Gupta]   | Special, Preferences, Forums..., More, [x] 
                            | Room, actually.
       Peter H @Phoenix     | Ok everyone... 5 minutes is just about up... 
                            | so start taking some deep breaths because we
                            | are just about to start!
                            | Do most people have SQLWindows running?...
       Mike Engstrom        | Will someone put the capture of this 
                            | confernce on CompuServe like the last one?
       Dave Karow [Gupta]   | Dave Karow and Peter H are both capturing.  
                            | We'll do our
                            | best not to GPF and therefore have it for you 
                            | soon!
       Mike Engstrom        | Thanx...
       Peter H @Phoenix     | ok world... let's roll...
                            | First of all... Welcome to the first of a 
                            | series of Training courses/classes about OOP
                            | programming in SQLWindows
       Dieter Muench        | Hi, I'm here again
       Peter H @Phoenix     | I'm neither going to assume you are a genius 
                            | nor a beginner.
       Dieter Muench        | In Getrmany it'late in the night
       Peter H @Phoenix     | If we go a little fast raise your hands (or 
                            | type on the computer)!!!
       Dieter Muench        | beginner
                            | trhnaks
                            | thanks
                            | go
       Peter H @Phoenix     | So lets start with the basics... what do you 
                            | want classes for?????
                            | weeeellelelelelelel.... that's a big question!
       Dave Karow [Gupta]   | Hello Dieter.  Lets all try to hang back and 
                            | let Peter
                            | "speak" a bit.  Then we can each chime in.  
                            | Also, we'd all
                            | do well to have a peek at the agenda, which 
                            | you can do
                            | without leaving the conference as follows: 
                            | FYI: the
                            | AGENDA can be viewed by Library, Search, 
                            | CA1213.txt
                            | <return>, "View".  You can then minimize it 
                            | and keep it
                            | handy on your forum "desktop".
       Peter H @Phoenix     | But for me the best things about classes are 
                            | ease of maintenance and better team
                            | programming
       Dieter Muench        | ok
       Peter H @Phoenix     | This course is going to work towards building 
                            | a 'Class Library' that you will be able to use
                            | as the basis of development of your systems
                            | Unfortunately the first few weeks of this are 
                            | going to be a little dry because they will 
                            | focus
                            | on the foundations to your library.
                            | However, I promise that in the weeks to come 
                            | you will see some really cool stuff and you
                            | will benefit from this interactive learning.
                            | Now... let's get to the mega basics... Is 
                            | everyone a SQLWindows user?
       Richard Laughlin     | IYes
       Mike Engstrom        | Yes.... for 4 years
       Hitomi Eura          | Yes
       Chris Crawford       | Yes
       Thom Loring          | Yes, 6 months
       Vik [Gupta]          | Yes
       Brian Beauchine [Ly  | Yes
       Dieter Muench        | i'm abeginner
       Dave Karow [Gupta]   | Yes.  Been through a week of training.
       Peter H @Phoenix     | Ok... well I'm going to assume that everyone 
                            | is comfortable with the basics of message
                            | passing and so on.
                            | The messaging system is going to be at the 
                            | core of this class library that we are working
                            | on.
                            | Why???
       Dieter Muench        | but in OOP I know C++ sincs half a year
       Peter H @Phoenix     | Well.... two reasons (1)... because that's 
                            | how of structured the course <G>
       Mike Engstrom        | So,  Can we chime in with questions at 
                            | anytime, or should we wait awhile?
       Peter H @Phoenix     | and (2) because I think that using a message 
                            | interface is the cleanest and safest way to
                            | implement an OOP library which is CORBA in 
                            | style
                            | (mike: chime in at any time)
                            | CORBA BTW stands for Common Object Request 
                            | Brokering Architecture (or something like
                            | that) and is a standard that is being adopted 
                            | to ensure clean interfaces between various
                            | OOP languages
       Mike Engstrom        | Chime, Chime, Chime,..... Is there a way to 
                            | set up Class constructors for Functional
                            | Classes?  I know you can for Message Classes 
                            | by using SAM_Create....
       Peter H @Phoenix     | ok...
                            | Chime Chime... not really... however, if you 
                            | have a look at the way I've designed this 
                            | stuff...
                            | Class constructors are sorta implicit...
                            | Mike: in a future version of SQLWindows there 
                            | will be a basic class that will be like a
                            | functional class but have a message actions 
                            | section... this is the key to that sort of 
                            | stuff.
                            | Anyway moving right along....
       Mike Engstrom        | Are you referring to your work in Griffon?  
                            | If not what Design?
       Peter H @Phoenix     | No... the design of the class libraries we 
                            | are working on.
       Mike Engstrom        | What messages would a functional class 
                            | receive?
       Peter H @Phoenix     | I believe that you will be able to code the 
                            | generic window class for any message
       Mike Engstrom        | Where do I find the design you are talking 
                            | about?
       Peter H @Phoenix     | The point man on this is the guy that came 
                            | from Taligent?... who's that vik?
       Vik [Gupta]          | Charles Niemier
       Peter H @Phoenix     | thanks vik
                            | ok... back to the good stuff....
       Crew Reynolds        | Hello all from Dallas.
       Peter H @Phoenix     | Hello crew...
                            | anyway... before we go too deep let's just 
                            | talk for a second about naming conventions and
                            | that sort of stuff...
                            | I know it's kinda boring but it *IS* 
                            | important and it should be documented
                            | So here it is:  for all my classes I prefix 
                            | them with a lower case 'c' so that a standard 
                            | data
                            | field class is denoted as 'cdfStandard'
       Mike Engstrom        | Thats what I have been using also...
       Peter H @Phoenix     | Next:  Messages... NO PROGRAMMER is ALLOWED 
                            | to TRAP SAM_* messages when
                            | using the class libraries
                            | heresy?... not at all...
                            | The trick is to have a clearly defined 
                            | PROGRAMMER interface to the classes
                            | So we will be developing classes that have 
                            | the following messaging traits:
       Richard Laughlin     | In most other naming conventions for Class a 
                            | class is noted with a capital C (MS Class 
                            | libs..
       Peter H @Phoenix     | capital C is just as valid... you may use 
                            | whichever you prefer... I chose lower case 
                            | because
                            | my variables and classes tended to be overly 
                            | StrOpPed <G>
                            | OK... back to messages:  SAM_* messages are 
                            | trapped by the classes
       Crew Reynolds        | SAM_ msgs... Is there a way to use SAM_ msgs 
                            | in the instance but invoke them from the 
                            | class?  Kinda like a pass-through.
       Peter H @Phoenix     | If a programmer interface is required then a 
                            | PAM_* message is sent from the class to
                            | hWndItem
                            | (Crew: yes you can with SalSendClassMessage( 
                            | SAM_*, wParam, lParam )
       Crew Reynolds        | So the programmer would always look for 
                            | PAM_Create... etc.
       Peter H @Phoenix     | at the instance level that is
                            | You got it crew...
                            | The programmer is NOT ALLOWED to trap SAM_* 
                            | messages...
       Crew Reynolds        | That's sounds like a must do.
       Peter H @Phoenix     | This means that in our classes we can do 
                            | whatever we like either side of a programmer'
                            | s actions and then still have control
                            | If the programmer was overriding SAM_* 
                            | messages then there is the possibility that 
                            | in an
                            | instance they would fail to send a class 
                            | message
                            | Finally:  within the classes we have an 
                            | internal API of PM_* messages that are used
                            | between the classes... (and in some cases the 
                            | programmer may envoke class behavior
                            | through this interface)
                            | Is everyone pretty happy with the why, and 
                            | how of the messages?
       Crew Reynolds        | Would it be an enhancement to have the 
                            | compiler tell us if we've overriden a class 
                            | message at the instance?
       Chris Crawford       | Yep, but I'll have a hard time convincing my 
                            | programmers not to use SAM_ Messages.
       Peter H @Phoenix     | Chris... it's just a case of enforcing 
                            | standards...
                            | You have to have a documented interface to 
                            | your classes
                            | and if people don't play by the rules... give 
                            | them 'guidance'
                            | <G>
       Chris Crawford       | <g>
       Peter H @Phoenix     | The other *VERY* important trick to know 
                            | about a message interface relates to return
                            | values.
                            | Typically as SQLWindows programmers we are 
                            | more comfortable with a positive return (ie.
                            | Return TRUE) for message processing to 
                            | continue
                            | This is seriously flawed when it comes to 
                            | designing a class library
                            | the reason is that if an object for whatever 
                            | reason doesn't process a given message it
                            | returns FALSE.
                            | So for example... say you wanted to send a 
                            | PAM_SQL message to every object on the form
                            | You might do it by:
                            | Set hWndChild = SalGetFirstChild( hWndForm, 
                            | TYPE_Any )
                            | While hWndChild != hWndNULL
                            | If SalSendMsg( hWndChild, PAM_SQL, wParam, 
                            | lParam )
                            | Set hWndChild = SalGetNextChild( hWndChild, 
                            | TYPE_Any )
                            | Else
                            | Set hWndCHild = hWndNULL
                            | everyone:
                            | Please note that indentation doesn't show 
                            | up... because CIS doesn't like tabs!
                            | anyway...
                            | If a programmer puts an object on the form 
                            | that doesn't belong to our class library 
                            | 9which is
                            | valid in some circumstances) it will not 
                            | process PAM_SQL and our loop stops
                            | somebody say something cis may be dying on me
       Crew Reynolds        | something
       Chris Crawford       | What about wParam and lParam? Pass through 
                            | from the original SAM_ message? Or use what 
                            | ever is required?
       Peter H @Phoenix     | ok... here's the rule... after about a page 
                            | of blabber from me somebody say something
                            | otherwise CIS refuses to scroll my conference 
                            | window:
                            | Thanks <G>
                            | Chris: wParam and lParam were just pass 
                            | throughs for that example
       Crew Reynolds        | I've never done that before.  I've always 
                            | used a SalSendMsgToChildren approach.  Is 
                            | this flawed?
       Peter H @Phoenix     | anyway... the solution is to reverse all your 
                            | returns and have them defined through clearly
                            | documented interface
                            | Crew: SalSendMsgToChildren is asynchronous so 
                            | you can't test what each object returned
                            | to you...
       Ed Abadzic           | Hi, calling from Germany.... About the SAM & 
                            | PAM messages... I
                            | just joined you when you were talking about 
                            | this subject.. and to
                            | me it does not really make sense.....
                            | In one way it does make sense... not 
                            | overriding the SAM
                            | messages...
       Crew Reynolds        | True for testing, but I don't see why I need 
                            | to check RCsunder normal circumstances
       Ed Abadzic           | but why would you write in your code
       Peter H @Phoenix     | ok the point here is to build a class library 
                            | that is completely error proof and programmer
                            | proof
       Ed Abadzic           | ON SAM_Create
       Peter H @Phoenix     | go ahead ed
       Ed Abadzic           | and thn call the PAM_Create
                            | especially if you have zillions of the same 
                            | class in your app
       Peter H @Phoenix     | the trick is that the classes will be doing 
                            | their own stuff *as well* on the 
                            | SAM_Create... this
                            | is sort of Class construction
                            | without really having it
       Ed Abadzic           | Does this not mean more code??
       Peter H @Phoenix     | Not really Ed... because as you will see when 
                            | we are done you very rarely do anything on
                            | PAM_Create anyway
                            | The interface is there for completeness of 
                            | programmer interface
                            | However:  IT IS POSSIBLE to do this class 
                            | library other ways
       Ed Abadzic           | Sorry, missed you on this point...  what 
                            | interface?
       Peter H @Phoenix     | What I am suggesting is one method that I 
                            | have found useful.
       Crew Reynolds        | As stated earlier, it's just a pass thorugh 
                            | in case you need to do something ON 
                            | SAM_Create, only you do it on PAM_Create.
       Peter H @Phoenix     | thanks Crew...
                            | The class library that we are going to build 
                            | is one that is pretty similar to the one in 
                            | use at
                            | Phoenix International
                            | This is the core of a Mega-App... some 6 
                            | modules... each about 2M when as an EXE
       Ed Abadzic           | OK...
       Peter H @Phoenix     | anyway... here are some example constants for 
                            | you that you might find of interest:
                            | !
                            |  ! These are the returns from PAM_SQLStart so 
                            | that we know what to do
                            | Number: SQLStart_Ok  = 0
                            | Number: SQLStart_Cancel  = 1
                            | !
                            |  ! These are the returns from PAM_SQLError so 
                            | that we know what to do
                            | Number: SQLError_Ignored  = 0
                            | Number: SQLError_Processed = 1
                            | !
                            |  ! These are the returns from PM_NullTest so 
                            | that we know what to do
                            | Number: NullTest_Pass  = 0
                            | Number: NullTest_Fail  = 1
                            | !
       Mike Engstrom        | From the class, if we want to "send" a 
                            | message like PAM_Create, should we send or
       Peter H @Phoenix     |  ! These are for returns from PAM_ValidateForm
       Mike Engstrom        | post this message to the class instance?
       Peter H @Phoenix     | Number: ValidateForm_Ok  = 0
                            | Number: ValidateForm_Cancel = 1
                            | oops mike...
                            | we send the message to the instance so that 
                            | it processes synchronously and the
                            | PROGRAMMER's interface is largely the same as 
                            | if it were a SAM_Create
                            | if we posted the PAM_Create the form would 
                            | get created before the programmer had a
                            | chance to actually envoke code!...
                            | make sense?
       Brian Beauchine [Ly  | Sure
       Mike Engstrom        | Yes,  Thats what I thought but I just wanted 
                            | to see if that was how you would do it.
       Peter H @Phoenix     | ok... moving on...
       Crew Reynolds        | I have a need to create a column class under 
                            | a standard table window.  If I'm not 
                            | mistaken, this can't be done in 4.0.1, true?
       Chris Crawford       | If I can't use the SAM messages, does that 
                            | mean my class must re-post all possible SAM 
                            | messages as PAM messages?
       Peter H @Phoenix     | Crew: you are quite right... however... 
                            | column classes aren't going to be discussed 
                            | very
                            | much here...
                            | sorry<G>
                            | Chris:  yes that's basically how it's going 
                            | to work
       Chris Crawford       | Performance?
       Crew Reynolds        | OK, just wanted to make sure I wasn't missing 
                            | something...
       Peter H @Phoenix     | performance is fine except on mega-huge forms 
                            | (100+ objects)... where you have to write
                            | workarounds... but as you will see... when we 
                            | get there!... it's not too bad at all
                            | OK... what's the basis of our whole class 
                            | library... well it's a functional class
                            | And I've named it cfcVariables for want of a 
                            | better name
       Mike Engstrom        | (I know this is off the subject...) We have 
                            | created column classes on standard table
                            | windows.
       Peter H @Phoenix     | cool... how did you do it Mike?
                            | Crew's point relates to dynamically creating 
                            | columns through SalTblCreateColumn BTW
       Mike Engstrom        | Sorry, I must have missed that....
       Peter H @Phoenix     | no problems...
       Mike Engstrom        | I was referring to Static columns...
       Peter H @Phoenix     | ok... this functional class has 8 variables:
                            | String: sObjectName 
                            | String: sProperName
                            | String: sStatusLine
                            | !
                            | Boolean: bCanBeNull
                            | Boolean: bNullWhenDisabled
                            | !
                            | Number: nMyType
                            | Number: nMyDataType
                            | Number: nReturnCode
                            | (a few tics for everyone to write them down 
                            | if they want)
       Chris Crawford       | go
       Crew Reynolds        | Uh, actually no.  But we can discuss column 
                            | classes later Mike.
       Mike Engstrom        | Ok
       Peter H @Phoenix     | (bear in mind that this functional class is 
                            | inherited by *every* other class we are
                            | developing)...
                            | The use for these variables is as follows:
                            | sObjectName:  Is the outline name of the 
                            | object eg 'df1' and is used when binding into 
                            | SQL
                            | statements
                            | sProperName:  Is a programmer supplied 'name' 
                            | for the object such that any messages
                            | like warning and so on have useful and 
                            | relevant titles
       Vik [Gupta]          | (sneaking out... I have to go, Peter, thanks, 
                            | and talk to you again!)
       Peter H @Phoenix     | see ya vik
                            | sStatusLine:  Is a programmer supplied Status 
                            | line message that will be set whenever
                            | focus changes to the object
                            | bCanBeNull:  indicates whether the object is 
                            | allowed to be null or not (ie... when it comes
                            | time to building a SQL statement we can apply 
                            | a business or database rule to enforce user
                            | entry into a given field)
                            | bNullWhenDisabled:  If an object is disabled 
                            | should it be inserted as a NULL value into the
                            | database.  This is important because when a 
                            | field is disabled by the classes it still 
                            | retains
                            | it's current value
                            | nMyType:  What sort of object am I?
                            | nMyDataType:  For objects that can have more 
                            | than one datatype (eg datafields) what's
                            | my datatype
                            | and finally: nReturnCode is just a variable 
                            | for private use by the functional class
                            | everyone comfortable with these?
       Richard Laughlin     | Y
       Ed Abadzic           | Great.....
       Chris Crawford       | Can't some of these variables be figured out 
                            | at run time? (e.g. sObject name and nMyType?)
       Mike Engstrom        | If sStatus line is set when a field has 
                            | focus,  How do reset sStatusLine if the user
                            | selects a menu item and then cancels out of 
                            | the menu?
       Brian Beauchine [Ly  | Yup.
       Peter H @Phoenix     | Chris:  Yes they can... but for reasons such 
                            | as repetitive hits to the same functions they
                            | have been built into the class and are 
                            | initialized on SAM_Create
       Chris Crawford       | Thx
       Peter H @Phoenix     | Mike:  Good point...
                            | ummm errr... there's no particular code to 
                            | handle this...  so I guess you'd have to 
                            | include it
                            | in your Menu class <G>...  (but there isn't 
                            | one <G>)
                            | you could (if you really wanted to) have a 2 
                            | second timer that just sent a SAM_SetFocus to
                            | SalGetFocus every now and then... but this is 
                            | a bit of overkill...
                            | I guess it just depends on whether you want 
                            | the feature or not?
       Mike Engstrom        | Just a bit....  what happens if you are 
                            | typing? <G>
       Peter H @Phoenix     | ummm.... err.... stop asking hard questions 
                            | <G>
       Ed Abadzic           | <G>
       Peter H @Phoenix     | you could have the timer re-initiated on 
                            | SAM_AnyEdit... such that for any keystroke it 
                            | kills
                            | the previous timer... that way if the user 
                            | stops typing they'll get their status line 
                            | back...
       Mike Engstrom        | Ok
       Peter H @Phoenix     | (I implemented this by the way on a Name 
                            | searching system... It allowed the operator to
                            | type in a few letters and then a listbox 
                            | would repopulate when the timer expired)
                            | <<any other questions??>>
       Ed Abadzic           | Cool idea....!
       - Visitor            | How do you relate the class and SQL column?
                            | I guess it's better if the class has SQL 
                            | column name.
       Peter H @Phoenix     | aha... now " - Visitor" you are jumping the 
                            | gun... however... we have a message
                            | PAM_SetSQLNames that the programmer receives 
                            | to do this sort of stuff
                            | Each object BTW also inherits from another 
                            | functional class cfcSQLVariables which has
                            | just the sort of thing you are talking 
                            | about... but more on that later
       Crew Reynolds        | I treat the SQL column as just another 
                            | property on my data field class and set it ON 
                            | AM_SetProperties.
       - Visitor            | I see. Thaks.
       Peter H @Phoenix     | Similar idea Crew... except our SQL class 
                            | objects will be able to be related to 
                            | *multiple*
                            | columns because cfcSQLVariables instantiates 
                            | another functional class cfcDBVariables
                            | which is actually a multi-dimensional array...
                            | We'll get to that stuff soon... I promise...
       Mike Engstrom        | I think this stuff is great,  but isn't it 
                            | going to be difficult to implement "Complex" 
                            | SQL
                            | i.e. OuterJoins, Unions, Sub Queries,   
                            | etc....
       Peter H @Phoenix     | Trust mike to come up with the hard q's!....
                            | Yes you're right... however, there's some 
                            | code to handle the "Complex" stuff in that 
                            | when
                            | you have built the query you are still able 
                            | to append a "Complex" where clause if you 
                            | wish.
                            | The primary focus of this functional class is 
                            | the 95% of your system edit Windows and
                            | related tables (in master-detail relationship)
                            | The classes can be extended to cater for the 
                            | more complex stuff but that's a little beyond
                            | the scope of this course
                            | <<is that an appropriately non-answer answer 
                            | <G>>>
                            | (Is Dave still here?)
       Mike Engstrom        | I suppose <g> .... The type of business 
                            | applications we develop fall in the other 5%.
       Crew Reynolds        | I need to learn some basics on functional 
                            | classes.  So, for now, you might say that I'm 
                            | still cfc-free.  <g>
       Peter H @Phoenix     | I know what you mean Mike...
       Chris Crawford       | Me too. It's like the last 2 minutes of a 
                            | football game...
       Peter H @Phoenix     | huh chris?... no using non-univeral analogies 
                            | here <G>
       Chris Crawford       | Sorry. "The last 5% takes 75% of the work"
       Mike Engstrom        | Right on!!!
       Peter H @Phoenix     | aha!... now I see what you mean
                            | well....
                            | ummmmmmmm..... errr....
                            | I hope you guys get *something* out of this...
                            | Anyway... back to the basics:
                            | The functional class besides having 8 or so 
                            | variables has 9 core functions:
       Dave Karow [Gupta]   | Hey gang.  I just lost a couple of minutes 
                            | due to lost
                            | connection to compuserve.  Last I saw was 
                            | question from
                            | "visitor" to Peter...  miss much?
       Peter H @Phoenix     | nope not to much...
                            | Dave... can you check that all the other 
                            | people out there know where we are...????
       Dave Karow [Gupta]   | great.  Now back to the (captured) action
                            | Do you want me to look outside the conf?
       Peter H @Phoenix     | Yep... just talk to them... I think some of 
                            | them were going to come but don't know where 
                            | to
                            | look
       Dave Karow [Gupta]   | will do.
       Peter H @Phoenix     | thanks
                            | now the core functions are designed to handle 
                            | basic object functionality...
                            | The trick is that if a programmer wants to 
                            | envoke these functions they typically do it 
                            | through
                            | the sending of a message.
       Mike Engstrom        | W'ell I must get back to coding my 75%.  This 
                            | was infomative.  When is the next one?
       Peter H @Phoenix     | This is what CORBA is all about
                            | Mike: in about a week I expect
       Mike Engstrom        | Thanks.... When will we talk about columns 
                            | and column classes...  guess there were
                            | some outstanding questions?
       Peter H @Phoenix     | Mike: do you mean relating SQL columns to 
                            | data objects?
                            | That will be in the next lesson so to speak
                            | I'll post an agenda in a few days
       Mike Engstrom        | Ok.... BYE All.....
       Peter H @Phoenix     | This lesson is going to wrap up in 15 minutes 
                            | or so anyway
                            | <<Q:  what are the basic things almost all 
                            | objects do?>>
                            | hello world.....
       Richard Laughlin     | Hello Peter..
       Brian Beauchine [Ly  | Process Messages...
       Ed Abadzic           | I am listening... was this a question for us??
       Brian Beauchine [Ly  | Send Messages
       Peter H @Phoenix     | As an Example:  most objects need to be 
                            | Enabled and Disabled at some time
                            | BTW:  questions are enclosed in << >>
       Brian Beauchine [Ly  | They have to *DO* something, Else why would 
                            | they be there?
       Chris Crawford       | Cleared...
       Ed Abadzic           | Ok.... first time for me to join a 
                            | conference... Sorry <G>
       Peter H @Phoenix     | Other ideas:  Shown and Hidden
                            | ?
       Ed Abadzic           | I would vote on CLEAR...
       Peter H @Phoenix     | good idea
                            | and not hard to implement
                            | anything else?
                            | oops
                            | << Anything Else?>>
       Ed Abadzic           | <G>
       Richard Laughlin     | Toggle labels , 
       Chris Crawford       | Set and clear status bar
       Peter H @Phoenix     | yeah... you mean like changing the object's 
                            | label on the fly?
       Richard Laughlin     | Yes .. or even its graphic
       Peter H @Phoenix     | Status bar is also a good idea
       Brian Beauchine [Ly  | How 'bout init and terminate?
       Peter H @Phoenix     | AHA... Brian the master!!!!!!!!
                            | We have to have clearly defined functions 
                            | that interface with our variables
                            | We generally don't want a programmer 
                            | manipulating a variable directly
                            | The programmer should be shielded from the 
                            | internals of the class wherever possible
                            | <<any suggestions on why?>>
       Chris Crawford       | To this end, we start all our instance 
                            | variable names with 'iv_' and class variables 
                            | with 'cv_' Makes violators stand out better...
       Peter H @Phoenix     | good idea chris
       Brian Beauchine [Ly  | Well, I would think that in the event of a 
                            | programmer messing with the class internals,
                            | we may not get the messaging taken to it's 
                            | rightful end.
                            | We may get interrupted.
       Peter H @Phoenix     | Kinda Brian... what we are trying to do is 
                            | provide a neat, clean interface to our data
                            | structures.
       Chris Crawford       | Also, you may want to change the classes 
                            | internals. Can't do that if you cheat.
       Peter H @Phoenix     | The programmer need not be concerned with how 
                            | the data is stored.
                            | Chris::.... Masterful observation!
                            | that's just what I was going to say!
       Sundar Rajan         | aa
       Peter H @Phoenix     | hi Sundar... (testing?)
                            | anyway.... here's the first function that we 
                            | will develop... and it is called on 
                            | SAM_Create of a
                            | class:
                            | surprisingly its called:  clsInitialize( )
                            | A NOTE ON FUNCTION NAMING:  Int = Internal 
                            | Function in Global Decs;  Loc = Local
                            | Function on a Form and cls = class function
                            | <<cool??>>
       Brian Beauchine [Ly  | Great. 
       Peter H @Phoenix     | ok... clsInitialize does the following:
                            | Call SalGetItemName( hWndItem, sObjectName )
                            | Set bCanBeNull = TRUE
                            | Set nMyType = SalGetType( hWndItem )
                            | Set nMyDataType = SalGetDataType( hWndItem )
                            | Return TRUE
                            | <<Not really all that much huh>>
                            | <<??>>
                            | <<Is everyone comfortable with this stuff?>>
       Chris Crawford       | Why wouldn't bCanBeNull be set on the 
                            | instance level?
       Richard Laughlin     | Y
       Chris Crawford       | Is this a default?
       Peter H @Phoenix     | Chris... it is set on the instance level... 
                            | but you are right that is the default
                            | (rather it *can* be set on the instance level)
       Brian Beauchine [Ly  | ok <G>.
       Dave Karow [Gupta]   | Peter: FYI: I've chatted with most of those 
                            | members who
                            | are outside the room.  Some were 'listening' 
                            | which is why
                            | they didn't show up, others are not lost, so 
                            | all is well...
       Peter H @Phoenix     | And since you brought it up Chris... the 
                            | primary (and usually the only) function that 
                            | is called
                            | on a PAM_Create by the programmer is 
                            | clsSetObjectStatus( )
                            | (thanks dave)
                            | clsSetObjectStatus has three parameters:
                            | bOk = clsSetObjectStatus( pnCanBeNull, 
                            | pnCanShowObject, pnCanEnableObject )
                            | NOTE: naming of variables:  'p' designates a 
                            | parameter
                            | THIS IS MOST IMPORTANT and something I 
                            | RECOMMEND THAT YOU ALL DO
                            | also:  'r' designates a receive parameter
       Ed Abadzic           | good idea...!
       Chris Crawford       | Having one function to set three unrelated 
                            | variables seems like a Bad Thing.
       Peter H @Phoenix     | clsSetObjectStatus is the programmer's 
                            | interface to the variable bCanBeNull and 
                            | allows
                            | the programmer on PAM_Create to control 
                            | whether an object is shown/hidden; 
                            | enabled/disabled
                            | Chris:  they're related by the fact that you 
                            | want to usually control this behavior on
                            | PAM_Create
                            | <<ok?>>
       Chris Crawford       | Other than reducing the n umber of functions, 
                            | why not three functions?
       Peter H @Phoenix     | Just that... it reduces the number of 
                            | functions... and we want to keep our classes 
                            | as lean
                            | and mean as we can...
       Chris Crawford       | I have gone to the extreme of writing a 
                            | 'Get...' and 'Set...' function for all the 
                            | instance variables that require a public 
                            | interface.
       Peter H @Phoenix     | That's a very good idea Chris and 
                            | very-CORBA... it does however introduce a 
                            | minor
                            | overhead
                            | in both memory and in performance...
       Chris Crawford       | True.
       Peter H @Phoenix     | I.e. generally you want to set these three 
                            | things all in one go... and in those cases 
                            | you save
                            | 2 function calls
       Chris Crawford       | However, I have always labored under the 
                            | impression that functions in SQLWin are 
                            | brought in as needed.
                            | While Message Actions are always hanging out 
                            | in memory.
       Peter H @Phoenix     | Chris: in terms of memory requirements you 
                            | are right that SQLWin only brings in a 
                            | function
                            | as required... however, 3 functions is 
                            | generally bigger in overall memory consumed at
                            | APP_Startup than 1 function
                            | Ok...
       Dave Karow [Gupta]   | Housekeeping Question: who is capturing and 
                            | plans to
                            | stick around?  (This Wizop has to leave 
                            | -soon-)
       Peter H @Phoenix     | I'm still capturing I think...
       Brian Beauchine [Ly  | I am (at least I think I am)
       Peter H @Phoenix     | at least I did what you said
       Chris Crawford       | I'm getting tired (2:12:10 on my meter.)
       Brian Beauchine [Ly  | It the capture supposed to ask for a filename?
       Peter H @Phoenix     | ok...
                            | we'll wrap up in 5 mins...
       Dave Karow [Gupta]   | No.  The file name is "channel.log" in your 
                            | SUPPORT
                            | directory.
       Brian Beauchine [Ly  | OK!
       Dave Karow [Gupta]   | Great peter.  This is GOOD stuff by the way!
       Ed Abadzic           | Ok..
       Peter H @Phoenix     | Notice how the clsSetObjectStatus has numbers 
                            | instead of booleans?
                            | as parameters?
                            | This is because the programmer has a few 
                            | options in each place... and they are defined
       Ed Abadzic           | Yep...
       Peter H @Phoenix     | through constants:
                            | The first parameter pnCanBeNull takes three 
                            | values:
                            | NULL = TRUE;  NOT_NULL = FALSE and DEFAULT = 
                            | -1
                            | This allows the programmer to pass in a 
                            | DEFAULT so that this option is not changed 
                            | when
                            | the function is called...
                            | so the code looks like this:
                            | If pnCanBeNull > -1
                            |  Set bCanBeNull = pnCanBeNull
                            | <<OK??>>
       Brian Beauchine [Ly  | Cool <G>
       Thomas Engelbrecht   | tricky
       Peter H @Phoenix     | the second parameter works in the same 
                            | fashion:
                            | where SHOW = TRUE; HIDE = FALSE; and DEFAULT 
                            | = -1
                            | eg:
                            | If pnCanShowObject > -1
                            |  If pnCanShowObject
                            |   Call clsShow( )
                            |  Else
                            |   Call clsHide( )
                            | <<OK?>>
       Brian Beauchine [Ly  | OK.
       Peter H @Phoenix     | The third and final parameter is the coolest 
                            | <G>
       Ed Abadzic           | Yes.
       Peter H @Phoenix     | It has four options:  DISABLE = FALSE; ENABLE 
                            | = TRUE; DISABLE_SHOW_TEXT = 2 and
                            | DEFAULT = -1
                            | The DISABLE_SHOW_TEXT allows us to DISABLE an 
                            | object and still show the text in it.
                            | This is useful for display only fields.
                            | The code for this param is as follows:
                            | If pnCanEnableObject > -1
                            |  If pnCanEnableObject = DISABLE
                            |   Call clsDisable( DISABLE )
                            |  Else If pnCanEnableObject = ENABLE
                            |   Call clsEnable( )
                            |  Else
                            |   Call clsDisable( DISABLE_SHOW_TEXT )
                            | ok...
       Brian Beauchine [Ly  | ok, I am beginning to understand.   Thats OK!
       Peter H @Phoenix     | well that just about wraps up the basics that 
                            | I wanted to cover today.
                            | I hope it has been informative
       Ed Abadzic           | Why not use a CASE statement instead of the 
                            | IF stuff...
       Dave Karow [Gupta]   | Kids... its getting late.  Time for dinner!
       Peter H @Phoenix     | CASE statements are compiled out to If... 
                            | Else...
                            | anway Ed... besides SQLWin doesn't support 
                            | String Case statements
                            | (which you will need later)
                            | Finally: In the next lesson we will start 
                            | with the functions clsShow and clsEnable
       Ed Abadzic           | I see.....
                            | Thaks
       Brian Beauchine [Ly  | BTW, I took the 'idle' time during this 
                            | conference to download Griffon.  
       Peter H @Phoenix     | and you guys can write clsHide, and clsDisable
       Brian Beauchine [Ly  | I'll let you know...
       Peter H @Phoenix     | thanks brian.
                            | We will also discuss the functional class as 
                            | an object store and starting to instantiate 
                            | the
                            | classes with objects
       Hitomi Eura          | (I have to go. I'm impressed. See you next 
                            | time! And
                            | sorry I've interrupted.)
       Brian Beauchine [Ly  | Thanks for a great lesson!
       Peter H @Phoenix     | I'll post an agenda in a few days.
                            | Bye to everyone...
       Richard Laughlin     | Bye... thanxs see you
       Ed Abadzic           | Thnanks Peter...
       Dave Karow [Gupta]   | And the capture will be similar in name to 
                            | last time's...
       Richard Laughlin     | T
       Dave Karow [Gupta]   | expect it by wednesday...
       Peter H @Phoenix     | sure ... (and goto bed Ed! <G>)
       Ed Abadzic           | I know, getting late again..... !!<G>
       Richard Laughlin     | ++
       Ed Abadzic           | ++
       Peter H @Phoenix     | +|++
       Thomas Engelbrecht   | this was a very informativ mornig, thanks
       Dave Karow [Gupta]   | For peter, you're welcome.  Have a good one...
                            | Thats it all.  Hope you enjoyed it.  I'll be 
                            | pushing "stop" on
                            | the ol' recorder now...
