[plt-scheme] Trouble with GUI

From: Daniel Silva (daniel.silva at gmail.com)
Date: Sat Oct 16 14:27:23 EDT 2004

On Fri, 15 Oct 2004 17:46:50 -0500, Arctic Fidelity <af at aaronhsu.com> wrote:
>   For list-related administrative tasks:
>   http://list.cs.brown.edu/mailman/listinfo/plt-scheme
> 
> On 15 Oct 2004 at 8:49, Matthew Flatt wrote:
> 
> > At Fri, 15 Oct 2004 08:46:13 -0500, "Arctic Fidelity" wrote:
> > > I think I have the ouput buffer okay, but what's getting me is
> > > processing the keys. I understand how I would process the buttons,
> > > but how would I capture the key events from anywhere but the
> > > output field, and then according to what key was pressed, update
> > > my disabled text-field appropriately.
> > >
> > > The plan I had was to create a procedure for the main window
> > > which would take the input from the keys, and process it from there.
> > > However, I cannot seem to figure out how to use "on-subwindow-
> > > char" or how to change what happens with that, as the frame% has
> > > nowhere that I can specify a callback procedure.
> >
> > I think you're on the right track with `on-subwindow-char'. You need to
> > derive a subclass of frame% that overrides `on-subwindow-char'.
> 
> I was afraid you were going to say that, I was actually hoping there
> was a way I could do that without having to override the defaults,
> but I suppose that's just what happens. ;-)

Try using a Java-style new operator too :)
Examples in the test function:

(module overriding-new mzscheme
  
  (provide overriding-new)
  
  (require (lib "class.ss"))
  
  (define-syntax (overriding-new stx)
    (syntax-case stx (local inherit)
      [(_ super%
          (local (inherit-field super-field ...) (define (fn args ...)
bodies ...) ...)
          (field value) ...)
       #`(new (class super%
                (inherit-field super-field ...)
                (begin
                  (define/override (fn args ...)
                    bodies ...) ...)
                (super-new))
              (field value)
              ...)]
      [(_ super%
          (local (define (fn args ...) bodies ...) ...)
          (field value) ...)
       #`(_ super% (local (inherit-field) (define (fn args ...) bodies
...) ...) (field value) ...)]
      ))
  
  (define (test)
    (define C%
      (class object%
        (init-field x)
        (define/public (add y)
          (+ x y))
        (define/public (sub y)
          (- x y))
        (super-new)))
    
    (define c (new C% (x 1)))
    ;; oops, turn addition into multiplication, sub. into mult.
    (define d (overriding-new C%
                              (local
                                  (inherit-field x)
                                  (define (add y)
                                    (* x y))
                                  (define (sub y)
                                    (/ x y)))
                              (x 1)))
    
    (define (check expected actual)
      (unless (= expected actual)
        (error 'check (format "expected ~a, got ~a"
                              expected actual))))
    
    (check 3 (send c add 2))
    (check -1 (send c sub 2))
    (check 2 (send d add 2))
    (check 1/2 (send d sub 2)))
  
  )


Posted on the users mailing list.