[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Useful RfCon
- To: blakem@world.std.com
- Subject: Useful RfCon
- From: Bill St. Clair <bill>
- Date: Wed, 15 Aug 90 14:55:38 -0400
- Cc: info-macl
- In-reply-to: Blake Meike's message of Wed, 15 Aug 90 10:46:25 -0400 <9008151446.AA29362@world.std.com>
Date: Wed, 15 Aug 90 10:46:25 -0400
From: blakem@world.std.com (Blake Meike)
The story so far: I asked how to save object pointers in
control refcons, Andrew pointed out that after a garbage collection
any such pointer would be junk.
Uh, oh. Ok, I won't try that.
Well, the idea was to provide a scroll bar action proc with a way
of getting in touch with the object that represents it in the Lisp
world. I just looked at some other examples of how to do this,
and to my huge surprise, I found this:
(defobfun (do-scroll *scroll-bar*) ()
(....))
(defpascal scroll-proc ((my-control :ptr) (partCode :word))
(do-scroll))
Why does this work? Why doesn't scroll-proc have
to (ask <somebody> (do-scroll))?
I think it accomplishes what I want to accomplish, but I sure
blazes don't see why.
Blake Meike
blakem@world.std.com
The answer is that the scroll-proc is passed to _TrackControl from
inside an OBFUN for *scroll-bar*. Hence, the current object is bound
when the toolbox calls scroll-proc. Effectively, you're getting
something like this (except the binding of *current-object* is
implicit in the entry to the defobfun):
(defobfun (track-scroll-bar *scroll-bar*) ()
(let ((*current-object* scroll-bar))
(declare (special *current-object*))
(_TrackControl ... :ptr scroll-proc ...)))
(defpascal scroll-proc ((my-control :ptr) (partCode :word))
(declare (special *current-object*))
(ask *current-object* (do-scroll)))
Bill St. Clair
bill@cambridge.apple.com