3

我目前正在尝试使用球拍图形界面工具在球拍中创建一个信息网格。唯一可用的真实表格是列表框%(参考链接

要填写表格,我需要使用:

 (send a-list-box set choices ...) → void?
      choices : (listof label-string?)

选择是列表,是每列的列表。问题是我有可变数量的列。我当前的数据格式如下(list (list 1 2 3) (list 4 5 6))目标是执行此命令:(send table set (list 1 2 3) (list 4 5 6)

我已经尝试过的

我做了一个函数,女巫给了我这个输出:"(list 1 2 3) (list 4 5 6)" 想法是然后使用以下命令执行这个字符串命令:

(send table set (eval (call-with-input-string "(list 1 2 3) (list 4 5 6)" read)

我也试过这个:

(eval (call-with-input-string "(send table set (list 1 2 3) (list 4 5 6))" read) 但这给了我一个错误table: undefined; cannot reference an identifier before its definition

如果您没有看到问题,但现在使用内置 GUI 在球拍中显示数据网格的另一种方式,请分享。谢谢

测试代码

`#lang racket
(require racket/gui/base)

(define frame (new frame% 
                  [label "myTable"]
                  [width 800]
                  [height 600]
                  ))

(define table (new list-box%
                 [parent frame]
                 [choices (list )]
                 [label "Test"]
                 [style (list 'single 'column-headers 'variable-columns)]
                 [columns (list "C1" "C2" "C3")]))

(define data (list (list "1" "2" "3")
                   (list "4" "5" "6")
                   (list "6" "8" "9")))


(send table set (list-ref data 0) (list-ref data 1) (list-ref data 2));--> Works but needs to be aple to handle variable lengtho of data
;(apply send table set data) ;--> ERROR: send: bad syntax

;(map (lambda (element)
;             (send table set element)) ;--> ERROR: set in list-box%: column count doesn't match argument count  column count: 3  argument count: 1
;     data)

(send frame show #t)`
4

3 回答 3

2

看起来send/apply就是你想要的。

(send/apply table set data)
于 2013-05-20T18:16:30.053 回答
1
(define your-listbox-var (new list-box%
                      (label "")
                      (parent YOUR MAIN FRAME OR NULL)
                      (choices '("" "" "") )
                      (style (list 'single ; je kunt ze nog veranderen
                                   'variable-columns
                                   'column-headers))
                      (columns (list "Column1" "Column2" "Column3" ))))

如果您以这种方式定义您的变量,并且如果您调用

(send your-listbox-var set  (list 1 2 3)  (list 1 2 3))

在定义变量之后,它将起作用。

于 2013-05-20T12:22:39.370 回答
1

尝试这个:

(define data '((1 2 3) (4 5 6)))
(apply send table set data) ; same as (send table set '(1 2 3) '(4 5 6))

apply当您的输入参数到达未知大小的列表并且过程接受可变数量的参数时使用。举一个更简单的例子:

(define data '(1 2 3))
(apply + data) ; same as (+ 1 2 3)
=> 6

你可以想象它apply“删除”了它最后一个参数周围的额外括号,所以 this:(apply + '(1 2 3))变成了 this: (+ 1 2 3)

更新

鉴于这send是一个,而不是我错误假设的过程,以上将不起作用。我想出了一个我不引以为豪的解决方案,使用eval(这是邪恶的)和列表拼接 - 我希望有人可以提出一个更清洁的解决方案,但这会奏效:

(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))
(eval `(send table set ,@'data) ns)
于 2013-05-20T13:38:59.020 回答