Posted to tcl by aspect at Tue Jul 10 06:42:32 GMT 2007view pretty

## apply.tcl
# from: http://wiki.tcl.tk/4884
proc apply {fun args} {
    set len [llength $fun]
    if {($len < 2) || ($len > 3)} {
        error "can't interpret \"$fun\" as anonymous function"
    }
    lassign $fun argList body ns
    set name ::$ns::[getGloballyUniqueName]
    set body0 {
        rename [lindex [info level 0] 0] {}
    }
    proc $name $argList ${body0}$body
    set code [catch {uplevel 1 $name $args} res opt]
    return -options $opt $res
}   


## schema.tcl
# source apply.tcl

set schema_names(ID)   "Reg No"
set schema_names(name) "Name" 
set schema_names(gender)   "Sex"
set schema_names(father)   "Father's Name"
set schema_names(mother)   "Mother's Name"
set schema_names(spouse)   "Spouse's Name"
set schema_names(address)  "Address"
set schema_names(first_visit)  "First Visit"
set schema_names(age_years) "Age (y)"
set schema_names(age_months)   "Age (m)"

proc schema_widget {name} {
    switch $name {
        "gender" {
            set moreargs [list -values [list "" "M" "F"]]
            proc gender_spinbox {args} {
                return [apply spinbox [concat args moreargs]]
            }
            return gender_spinbox
        }
        default {
            return entry   
        }
    }
}

## editor.tcl
# source schema.tcl

foreach {name label} [array get schema_names] {
    label .l_$name -text $label
    set widget [schema_widget $name]
    $widget .w_$name
    grid .l_$name .w_$name
}

Comments

Posted by error message at Tue Jul 10 06:48:46 GMT 2007 [text] [code]

Error in startup script: wrong # args: should be "catch command ?varName?" while compiling "catch {uplevel 1 $name $args} res opt" while compiling "set code [catch {uplevel 1 $name $args} res opt]" (compiling body of proc "apply", line 12) invoked from within "apply spinbox [concat args moreargs]" (procedure "gender_spinbox" line 2) invoked from within "$widget .w_$name" ("foreach" body line 4) invoked from within "foreach {name label} [array get schema_names] { label .l_$name -text $label set widget [schema_widget $name] $widget .w_$name grid .l_$name .w_$name }" (file "a.tcl" line 51)