2011-01-06 16 views
0

私はExercise 22.3.3 from HtDPを試していますが、クリックされたボタンのラベルを取得する方法はわかりません。私は文字列が必要だと示唆しているようですが、私はクラスのインスタンスを取得しているこのメッセージdraw-message: expected <string> as second argument, given: (instantiate (class ...) ...)を取得します。コールバックの答えは?もしそうなら、どのように私はそれを構造化解除するのですか?Racket/PLT-Schemeでボタンのラベルを取り出す方法は?


これは私がこれまで持っているものです。

(define pad1 
    '((1 2 3) 
    (4 5 6) 
    (7 8 9) 
    (\# 0 *))) 

(define pad2 
    '((1 2 3 +) 
    (4 5 6 -) 
    (7 8 9 *) 
    (0 = \. /))) 

(define (title t) 
    (make-message t)) 

(define display 
    (make-message "")) 

(define (pad->gui p) 
    (cond 
    [(empty? p) empty] 
    [else (cons (button-maker (first p)) 
       (pad->gui (rest p)))])) 

;; make buttons out of a list 
(define (button-maker a-list) 
    (cond 
    [(empty? a-list) empty] 
    [(number? (first a-list))(cons (make-button (number->string (first a-list)) call-back) 
            (button-maker (rest a-list)))] 
    [(symbol? (first a-list))(cons (make-button (symbol->string (first a-list)) call-back) 
            (button-maker (rest a-list)))])) 

(define (call-back b) 
    (draw-message display ...)) 


(create-window 
(append (list (list (title "Virtual Phone"))) 
     (list (list display)) 
     (pad->gui pad1))) 

私が正しく物事を理解していれば、それが押されたときに、各ボタンがcall-backを呼び出します。これは、テキストを更新するdisplayを呼び出す必要があります。しかし、私は発信者のラベルを取得する方法を理解していません。例えばボタン「9」を押すと、call-backが呼び出されます。しかし、私はどのように値 "9"を取得するのですか?これは私が確信していることです。

答えて

3

正しい。 draw-message関数は、 'window'と 'string'を消費します。これは、図62の同じセクションに記載されています。あなたはそれを「ボタンオブジェクト」に適用しているようです。また、このようになります。これは、同じセクションの例2を参照してください。

(define a-text-field 
    (make-text "Enter Text:")) 

(define a-message 
    (make-message "`Hello World' is a silly program.")) 

(define (echo-message e) 
    (draw-message a-message (text-contents a-text-field))) 

(define w (create-window 
      (list (list a-text-field a-message) 
       (list (make-button "Copy Now" echo-message))))) 

は、あなたが「今コピー」ボタンをクリックすると、エコーmesssageは、表示を変更する方法を参照してください。

ヒント:ボタンごとに1つのコールバックがあるため、ボタンコールバックから表示する文字列を正確に知ることができます。

修正:本の例1が壊れています。代わりに

(define u 
    (create-window (list (list (make-button "Close" (lambda (x) (hide-window u))))))) 

を使用してください。

+0

マティアス、私はあなたが本の著者の一人であると思っています。ご回答いただきありがとうございました。また、Racket/Schemeを学ぶための優れたリソースもあります。私は上記の私の質問を修正しました、それを見てくださいすることができれば、私が間違って行って参照してください。ところで、セクション24までは 'lambda 'は導入されていないので、言語が「Advanced」以上に設定されていなければ修正された例1は機能しません。 – Greenhorn

+0

私は[マクロを使ったグレートアプリケーションとプログラムの収集](http://stackoverflow.com/q/4548768/298282)も面白いかもしれないと思います。 –

+0

ヒント:4つのスペースでインデントされたテキストはコードとしてレンダリングされます。 – erjiang

関連する問題