[comp.sys.mac.hypercard] Two

gft_robert@gsbacd.uchicago.edu (01/09/90)

Date:  8 JAN 90 14:15:23    
Organization:  University of Chicago Graduate School of Business
-----------

I'm writing a moderately complicated stack and I've run into a strange problem:
my stack behaves differently when it's started up by itself (that is, when the
stack itself is double-clicked) than when it's launched once one is already in
HyperCard.

Specifically, in my openStack handler, I set userModify to TRUE (this will
eventually be running off a write-protected server) and I click in a particular
field so that the user can immediately enter data.  This works find if I launch
the stack from within HyperCard or if I move to it from another stack.  But if
I launch the stack itself from the Finder, things _seem_ to get set up right
(the I-bar appears in the proper field and userModify is set right), but right
after openStack there's a bit of disk-trashing, and my I-bar disappears and
userModify is set back to FALSE.

Yo no comprendo.  What could be executing after openStack?  I checked the home
card for the startUp handler, but it didn't really seem to contain anything
that would cause this.  What am I missing?

Any info appreciated!

Robert
 
============================================================================
= gft_robert@gsbacd.uchicago.edu * generic disclaimer: * "It's more fun to =
=            		         * all my opinions are *  compute"         =
=                                * mine                *  -Kraftwerk       =
============================================================================

ldo@waikato.ac.nz (Lawrence D'Oliveiro) (01/13/90)

I've come across similar behaviour myself, and I think I know what's
happening: HyperCard is going to the Home stack and invoking the
OpenStack handler there, *after* it's done the same for your stack!

There seem to be all kinds of problems with the order in which
HyperCard invokes various handlers. One case that's been bugging
me for a long time now is that, when I create a new card, the
OpenCard message is sent *before* the NewCard one! The way I
get around this is to check, in my OpenCard handler, if certain
important fields (which should have been initialised in NewCard)
are still empty; if so, OpenCard exits without doing anything.
Also, my NewCard handler ends with an explicit call to OpenCard.

Yuk.

All I can suggest is, stick a few "Answer" statements inside various
handlers to help you determine the order in which HyperCard is
calling them; once you've done that, *then* you can sit down and
figure out what to do about it.

Lawrence

taylorj@yvax.byu.edu (01/15/90)

You were on the right track when you looked at the startUp handler in the Home
stack--it's part of the problem.  The main difference between starting a stack
from another stack or starting it (and HyperCard) from the Finder is that the
startUp message is added.  When you start up a stack from the Finder, the
system messages are as follows:

  openStack
  openBackground
  openCard
  startUp

The problem is that startUp is sent AFTER openStack.  Because there is a
handler for it in the Home stack, HyperCard temporarily leaves your stack to
run the startUp handler.  This causes the insertion point (I-bar) to go away,
and also causes userModify to be set back to false.

You'd think that the easiest way to get around the problem would be to simply
intercept the startUp message, but that doesn't work (I'm not sure why).  The
way I solved this very problem is with the following scripts in the first card
of the stack:

  on openCard
    click at the loc of card field "Name"
    set the userModify to true
    -- any other initial stuff
  end openCard

  on startUp
    global initialize
    put "do it" into initialize
    pass startUp  -- let the Home stack do its thing
  end startUp

  on idle    --it's not a good idea to put this in the stack script
    global initialize
    if initialize is "do it" then
      openCard
      put "did it" into initialize
    end if
    pass idle
  end idle

This is the best solution I've come up with so far.  If anyone else has a
better solution, or knows more about why we have to do these silly things to
make it work right, I'd appreciate hearing about it.


Jim Taylor
Microcomputer Support for Curriculum   |
Brigham Young University               |   Bitnet: taylorj@byuvax.bitnet
101 HRCB, Provo, UT  84602             |   Internet: taylorj@yvax.byu.edu