我目前正在学习McCLIM。试图找出如何定义一个命令,这将反应击键。对于一个名为superapp的应用程序,我有一个函数
(defun show (text)
(lambda (gadget)
(declare (ignore gadget))
(with-slots (text-field) *application-frame*
(setf (gadget-value text-field)
text))))它的屏幕上显示了一些文字。它适用于activate-callback中的窗格按钮。然而,这
(define-superapp-command (com-greet :name t :keystroke (#\g :control)) ()
(show "Hey"))不起作用。我知道我正确地定义了它,因为它在(frame-exit *application-frame*)中运行得很好。所以我不明白别的什么。
编辑:所以,这是工作变体。
(define-application-frame superapp ()
()
(:panes
(tf1
:push-button
:label "Left"
:activate-callback (show "HI"))
(app :application
:display-time nil
:height 400
:width 600)
(screen :text-field))
(:layouts
(default
(with-slots (text-field) *application-frame*
(vertically ()
screen
(tabling (:grid t)
(list tf1 app)))))))
(defun show (text)
(lambda (gadget)
(declare (ignore gadget))
(setf (gadget-value (find-pane-named *application-frame* 'screen))
text)))
(define-superapp-command (com-greet :name t :keystroke (#\g)) ()
(setf (gadget-value (find-pane-named *application-frame* 'screen))
"text"))发布于 2018-11-05 21:14:39
(defun show (text)
(setf (gadget-value (slot-value *application-frame* 'text-field))
text))在上面的函数中,您尝试从一个插槽中获取一个小工具。这不是办法。改为使用“查找窗格”命名。给它一个框架和窗格的名称。它会返回那个窗格。
(define-application-frame superapp ()
((text-field :initform nil))
(:panes
(tf1
:push-button
:label "Left"
:activate-callback (show "HI"))同样,您现在在完全不同的上下文中使用SHOW。现在,它应该返回一个LAMBDA,它将该小工具作为参数。
(app :application
:display-time nil
:height 400
:width 600)
(screen :text-field))
(:layouts
(default
(with-slots (text-field) *application-frame*
(vertically ()
(setf text-field screen)
(tabling (:grid t)
(list tf1 app)))))))现在,:layouts中的代码看起来是错误的。您不应该在那里设置插槽文本字段。实际上,你根本不应该有一个插槽文本字段。只需在回调中使用查找窗格命名的函数。在这里,您只需定义一个布局。
https://stackoverflow.com/questions/53161305
复制相似问题