databaseview_project.tcl

来自「一个跨平台的TCL/TK可视开发环境类似VC. TCL/TK是一个跨平台的脚本」· TCL 代码 · 共 827 行 · 第 1/2 页

TCL
827
字号
    namespace eval ::widgets::$site_3_0.not81 {

        array set save {-height 1 -width 1}

        namespace eval subOptions {

            array set save {-text 1}

        }

    }

    set site_5_0 [$site_3_0.not81 getframe page1]

    namespace eval ::widgets::$site_5_0 {

        array set save {-borderwidth 1}

    }

    set site_5_0 $site_5_0

    namespace eval ::widgets::$site_5_0.tab82 {

        array set save {-columns 1}

    }

    set site_5_1 [$site_3_0.not81 getframe page2]

    namespace eval ::widgets::$site_5_1 {

        array set save {-borderwidth 1}

    }

    set site_5_0 $site_5_1

    namespace eval ::widgets::$site_5_0.scr79 {

        array set save {}

    }

    namespace eval ::widgets::$site_5_0.scr79.f.tab80 {

        array set save {-columns 1}

    }

    namespace eval ::widgets::$base.meg80 {

        set sourceFilename "D:/cygwin/home/cgavin/vtcl/demo/tutorial/megawidgets/databaseview/databaseview_compound.tcl"

        set compoundName {Database View}

    }

    namespace eval ::widgets::$base.ent79 {

        array set save {-background 1 -textvariable 1}

    }

    namespace eval ::widgets::$base.but80 {

        array set save {-command 1 -pady 1 -text 1}

    }

    namespace eval ::widgets_bindings {

        set tagslist _TopLevel

    }

    namespace eval ::vTcl::modules::main {

        set procs {

            init

            main

            ::database_view::init

            ::database_view::main

            ::database_view::configureCmd

            ::database_view::myWidgetProc

            ::database_view::cgetCmd

            ::database_view::openCmd

            ::database_view::layoutTable

            ::database_view::closeCmd

            ::database_view::fillLayout

            ::database_view::fillData

            ::database_view::dataTable

        }

        set compounds {

        }

        set projectType single

    }

}

}



#################################

# USER DEFINED PROCEDURES

#

#############################################################################

## Procedure:  main



proc ::main {argc argv} {

## init is automatically called when using the megawidget, but

## not in design mode, so we call it here

::database_view::init [MegaWidget1]



## for my own testing

Toplevel1 setvar ent79 "test.mk"

}

#############################################################################

## Procedure:  ::database_view::init



namespace eval ::database_view {

proc init {w} {

    ## this procedure is executed before the megawidget UI gets created

    ## you can prepare any internal data here

    package require Mk4tcl

    

    ## for data storage

    namespace eval ::database_view::${w} "variable tag; set tag {}"

    namespace eval ::database_view::${w} "variable filepath; set filepath {}"

}

}

#############################################################################

## Procedure:  ::database_view::main



namespace eval ::database_view {

proc main {w} {

    ## this procedure is called after the megawidget UI gets created

}

}

#############################################################################

## Procedure:  ::database_view::configureCmd



namespace eval ::database_view {

proc configureCmd {w args} {

    ## TODO: handle megawidget configuration here

    ##

    ## examples of args:

    ##    -background white -foreground red

    ##        configure the -background and -foreground options

    ##    {}

    ##        empty list to return all options

    ##    -background

    ##        returns the -background configuration option

}

}

#############################################################################

## Procedure:  ::database_view::myWidgetProc



namespace eval ::database_view {

proc myWidgetProc {w args} {

    ## this is the widget procedure that receives all the commands

    ## for the megawidget

    set command [lindex $args 0]

    set args [lrange $args 1 end]



    ## all commands are suffixed with "Cmd" so the call to the

    ## given command is straightforward

    return [eval ${command}Cmd $w $args]

}

}

#############################################################################

## Procedure:  ::database_view::cgetCmd



namespace eval ::database_view {

proc cgetCmd {w args} {

    set option $args

    ## TODO: return the value for the option $option

}

}

#############################################################################

## Procedure:  ::database_view::openCmd



namespace eval ::database_view {

proc openCmd {w args} {

## store the tag to allow closing the database later

upvar ::database_view::${w}::tag tag

upvar ::database_view::${w}::filepath filepath



## already opened?

if {$tag != ""} {

    error "Database already open!"

}



set filepath [lindex $args 0]

set tag [mk::file open db $filepath]



## assume we have a one view database, otherwise use the first view

set views [mk::file views $tag]

set view [lindex $views 0]



## assume flat layout (eg. no fields containing other fields)

set layout [mk::view layout $tag.$view]

fillLayout $w $layout

fillData $w $view

puts "Database $filepath opened successfully."

}

}

#############################################################################

## Procedure:  ::database_view::layoutTable



namespace eval ::database_view {

proc layoutTable {w args} {

return $w.not81.fpage1.tab82

}

}

#############################################################################

## Procedure:  ::database_view::closeCmd



namespace eval ::database_view {

proc closeCmd {w args} {

upvar ::database_view::${w}::tag tag

upvar ::database_view::${w}::filepath filepath



## already closed?

if {$tag == ""} {

    return

}



mk::file close $tag

set tag ""

puts "Database $filepath closed."

}

}

#############################################################################

## Procedure:  ::database_view::fillLayout



namespace eval ::database_view {

proc fillLayout {w layout} {

set t [layoutTable $w]

$t delete 0 end



set columns "0 Name left 0 Type left"

$t configure -columns $columns



foreach field $layout {

    set values [split $field :]

    set name [lindex $values 0]

    set type [lindex $values 1]

    $t insert end [list $name $type]

}



## prepare the data table

set dt [dataTable $w]



set columns ""

foreach field $layout {

    set values [split $field :]

    set name [lindex $values 0]

    lappend columns 0 $name left

}

$dt configure -columns $columns

}

}

#############################################################################

## Procedure:  ::database_view::fillData



namespace eval ::database_view {

proc fillData {w view} {

upvar ::database_view::${w}::tag tag



set dt [dataTable $w]

set rows [mk::select $tag.$view]



$dt delete 0 end

foreach row $rows {

    set data [mk::get $tag.$view!$row]

    set line {}

    foreach {property value} $data {

        lappend line $value

    }

    $dt insert end $line

}

}

}

#############################################################################

## Procedure:  ::database_view::dataTable



namespace eval ::database_view {

proc dataTable {w} {

return $w.not81.fpage2.scr79.f.tab80

}

}



#############################################################################

## Initialization Procedure:  init



proc ::init {argc argv} {}



init $argc $argv



#################################

# VTCL GENERATED GUI PROCEDURES

#



proc vTclWindow. {base} {

    if {$base == ""} {

        set base .

    }

    ###################

    # CREATING WIDGETS

    ###################

    wm focusmodel $top passive

    wm geometry $top 200x200+88+100; update

    wm maxsize $top 1284 1006

    wm minsize $top 111 1

    wm overrideredirect $top 0

    wm resizable $top 1 1

    wm withdraw $top

    wm title $top "vtcl"

    bindtags $top "$top Vtcl all"

    vTcl:FireEvent $top <<Create>>

    wm protocol $top WM_DELETE_WINDOW "vTcl:FireEvent $top <<DeleteWindow>>"



    ###################

    # SETTING GEOMETRY

    ###################



    vTcl:FireEvent $base <<Ready>>

}



proc vTclWindow.top79 {base} {

    if {$base == ""} {

        set base .top79

    }

    if {[winfo exists $base]} {

        wm deiconify $base; return

    }

    set top $base

    ###################

    # CREATING WIDGETS

    ###################

    vTcl:toplevel $top -class Toplevel

    wm focusmodel $top passive

    wm geometry $top 521x461+280+200; update

    wm maxsize $top 1284 1006

    wm minsize $top 111 1

    wm overrideredirect $top 0

    wm resizable $top 1 1

    wm deiconify $top

    wm title $top "Database View Widget Design"

    vTcl:DefineAlias "$top" "Toplevel1" vTcl:Toplevel:WidgetProc "" 1

    bindtags $top "$top Toplevel all _TopLevel"

    vTcl:FireEvent $top <<Create>>

    wm protocol $top WM_DELETE_WINDOW "vTcl:FireEvent $top <<DeleteWindow>>"



    vTcl::widgets::core::megawidget::createCmd $top.meg80 \

        -widgetProc ::database_view::myWidgetProc 

    vTcl:DefineAlias "$top.meg80" "MegaWidget1" vTcl::widgets::core::megawidget::widgetProc "Toplevel1" 1

    bind $top.meg80 <Destroy> {

        ## close the database in case it was open

%W widget close

    }

    set site_3_0 $top.meg80

    NoteBook $site_3_0.not81 \

        -height 200 -width 300 

    vTcl:DefineAlias "$site_3_0.not81" "NoteBook1" vTcl:WidgetProc "Toplevel1" 1

    $site_3_0.not81 insert end page1 \

        -text Layout 

    $site_3_0.not81 insert end page2 \

        -text Records 

    set site_5_0 [$site_3_0.not81 getframe page1]

    ::tablelist::tablelist $site_5_0.tab82 \

        -columns {0 Name left 0 Type left} 

    vTcl:DefineAlias "$site_5_0.tab82" "Tablelist1" vTcl:WidgetProc "Toplevel1" 1

    $site_5_0.tab82 columnconfigure 0 \

        -title Name 

    $site_5_0.tab82 columnconfigure 1 \

        -title Type 

    bind [$site_5_0.tab82 bodypath] <Configure> {

        tablelist::adjustSepsWhenIdle [winfo parent %W]

    }

    pack $site_5_0.tab82 \

        -in $site_5_0 -anchor center -expand 1 -fill both -side top 

    set site_5_1 [$site_3_0.not81 getframe page2]

    vTcl::widgets::bwidgets::scrolledwindow::createCmd $site_5_1.scr79

    vTcl:DefineAlias "$site_5_1.scr79" "ScrolledWindow1" vTcl:WidgetProc "Toplevel1" 1

    ::tablelist::tablelist $site_5_1.scr79.f.tab80 \

        -columns {0 first left 0 last left 0 shoesize left} 

    vTcl:DefineAlias "$site_5_1.scr79.f.tab80" "Tablelist2" vTcl:WidgetProc "Toplevel1" 1

    $site_5_1.scr79.f.tab80 columnconfigure 0 \

        -title first 

    $site_5_1.scr79.f.tab80 columnconfigure 1 \

        -title last 

    $site_5_1.scr79.f.tab80 columnconfigure 2 \

        -title shoesize 

    bind [$site_5_1.scr79.f.tab80 bodypath] <Configure> {

        tablelist::adjustSepsWhenIdle [winfo parent %W]

    }

    pack $site_5_1.scr79.f.tab80 -fill both -expand 1

    $site_5_1.scr79 setwidget $site_5_1.scr79.f

    pack $site_5_1.scr79 \

        -in $site_5_1 -anchor center -expand 1 -fill both -side top 

    $site_3_0.not81 raise page1

    pack $site_3_0.not81 \

        -in $site_3_0 -anchor center -expand 1 -fill both -side top 

    entry $top.ent79 \

        -background white -textvariable "$top\::ent79" 

    vTcl:DefineAlias "$top.ent79" "Entry1" vTcl:WidgetProc "Toplevel1" 1

    button $top.but80 \

        \

        -command {## just in case

MegaWidget1 widget close



## now we can open it

MegaWidget1 widget open [Toplevel1 setvar ent79]} \

        -pady 0 -text Open! 

    vTcl:DefineAlias "$top.but80" "Button1" vTcl:WidgetProc "Toplevel1" 1

    ###################

    # SETTING GEOMETRY

    ###################

    place $top.meg80 \

        -in $top -x 18 -y 16 -width 486 -height 391 -anchor nw \

        -bordermode ignore 

    place $top.ent79 \

        -in $top -x 20 -y 417 -width 416 -height 19 -anchor nw \

        -bordermode ignore 

    place $top.but80 \

        -in $top -x 445 -y 415 -width 59 -height 21 -anchor nw \

        -bordermode ignore 



    vTcl:FireEvent $base <<Ready>>

}



#############################################################################

## Binding tag:  _TopLevel



bind "_TopLevel" <<Create>> {

    if {![info exists _topcount]} {set _topcount 0}; incr _topcount

}

bind "_TopLevel" <<DeleteWindow>> {

    if {[set ::%W::_modal]} {

                vTcl:Toplevel:WidgetProc %W endmodal

            } else {

                destroy %W; if {$_topcount == 0} {exit}

            }

}

bind "_TopLevel" <Destroy> {

    if {[winfo toplevel %W] == "%W"} {incr _topcount -1}

}



Window show .

Window show .top79



main $argc $argv

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?