覆盖球拍中的按钮回调
Overriding a buttons callback in Racket
我正在编写一个计算器应用程序,当单击它们时,编号按钮会将其值附加到文本字段。我正在尝试创建一个新按钮 class,其回调被覆盖,因此我不必为按钮的每个实例化添加相同的 lambda 函数,也不必为所有按钮添加最小宽度。在 canvas% 中,我可以通过覆盖 on-paint 来做到这一点,因为 on-paint 调用了 paint-callback,但我没有在按钮中找到类似的解决方案。
(define number-button% (class button%
(super-new)
(inherit get-label)
(init [min-width 30])
(define/override (callback)
(let ([value (send input-screen get-value)])
(send input-screen set-value (string-append value (get-label)))))))
还有一个我试图避免的例子
(define 7button (new button% [label "7"] [parent second-row]
[callback (λ (b e)
(let ([value (send input-screen get-value)] [b-label (send b get-label)])
(send input-screen set-value (string-append value b-label))))]))
有人有什么想法吗?如果有必要,我会写一个宏。
事后看来这是很明显的,但是通过传递我想要自动分配给超级 class 的初始化参数,也就是按钮,我可以创建一个已经有一个 class最小宽度,并定义了回调。
(define number-button% (class button%
(super-new [callback (λ (b e)
(let ([value (send input-screen get-value)] [b-label (send b get-label)])
(send input-screen set-value (string-append value b-label))))]
[min-width 30])))
然后我可以像这样实例化按钮。
(define 7button (new number-button% [label "7"] [parent second-row]))
(define 8button (new number-button% [label "8"] [parent second-row]))
(define 9button (new number-button% [label "9"] [parent second-row]))
如果我愿意,我可以进一步修改新按钮% class 以自动成为第二行的父级,但这可能限制太多
我正在编写一个计算器应用程序,当单击它们时,编号按钮会将其值附加到文本字段。我正在尝试创建一个新按钮 class,其回调被覆盖,因此我不必为按钮的每个实例化添加相同的 lambda 函数,也不必为所有按钮添加最小宽度。在 canvas% 中,我可以通过覆盖 on-paint 来做到这一点,因为 on-paint 调用了 paint-callback,但我没有在按钮中找到类似的解决方案。
(define number-button% (class button%
(super-new)
(inherit get-label)
(init [min-width 30])
(define/override (callback)
(let ([value (send input-screen get-value)])
(send input-screen set-value (string-append value (get-label)))))))
还有一个我试图避免的例子
(define 7button (new button% [label "7"] [parent second-row]
[callback (λ (b e)
(let ([value (send input-screen get-value)] [b-label (send b get-label)])
(send input-screen set-value (string-append value b-label))))]))
有人有什么想法吗?如果有必要,我会写一个宏。
事后看来这是很明显的,但是通过传递我想要自动分配给超级 class 的初始化参数,也就是按钮,我可以创建一个已经有一个 class最小宽度,并定义了回调。
(define number-button% (class button%
(super-new [callback (λ (b e)
(let ([value (send input-screen get-value)] [b-label (send b get-label)])
(send input-screen set-value (string-append value b-label))))]
[min-width 30])))
然后我可以像这样实例化按钮。
(define 7button (new number-button% [label "7"] [parent second-row]))
(define 8button (new number-button% [label "8"] [parent second-row]))
(define 9button (new number-button% [label "9"] [parent second-row]))
如果我愿意,我可以进一步修改新按钮% class 以自动成为第二行的父级,但这可能限制太多