tcl tk将<control-v>绑定到表列表中的单元格

时间:2016-06-24 08:35:43

标签: tcl tk

我使用以下代码创建一个表列表(由Nehmeti提供):

set _bvnr(tbl1) [tablelist::tablelist $_bvnr(fr2).tbl1 \
   -columns {0 "OID vmbust" \
             0 "OID vmflst" \
             0 "Flurstück" \
             0 "Buchungsblatt" \
             0 "Buchungsart" \
             0 "Laufende Nummer"} \
   -background white\
   -labelborderwidth 1\
   -selectborderwidth 0\
   -selectmode single \
   -exportselection 0\
   -labelfont $tabuefont\
   -font $tabinfont\
   -selectforeground $vmVConfig::setVar(activeFG)\
   -selectbackground $vmVConfig::setVar(activeBG)\
   -stretch all\
   -height 8\
   -setfocus 0\
   -forceeditendcommand 1 \
   -editstartcommand [itcl::code $this editStartTbl1] \
   -editendcommand [itcl::code $this editEndTbl1] \
   -xscrollcommand [list vmTkTools::configSB "h" $_bvnr(fr2).scrbx1]\
   -yscrollcommand [list vmTkTools::configSB "v" $_bvnr(fr2).scrby1]\
   -showarrow 0]

我可以通过

编辑第5列
$_bvnr(tbl1) columnconfigure 5 -editable no -name bgb -editwindow entryfield

editstart命令的方法如下:

itcl::body vmBVNummer::editStartTbl1 {tbl row col txt} {

   set _bvnr(tblCPath1) [$tbl editwinpath]

   # Entryfield erstellen
   $_bvnr(tblCPath1) configure -highlightthickness 2 \
                               -borderwidth 0 \
                               -selectbackground $vmVConfig::setVar(activeBG) \
                               -selectforeground $vmVConfig::setVar(activeFG) \
                               -state normal \
                               -textfont $entfont \
                               -validate "[list vmTclTools::valInteger2 %P] " \
                               -textbackground white

   set _bvnr(editLnr) $txt

bind [$tbl entrypath] <Control-v> [itcl::code $this pasteGrber]
   return $txt
}

通过绑定方法“pasteGrber”,我试图阻止“selection get”中的文本可以粘贴在entryfield中,如果它不是整数(在vmTclTools :: valInteger中检查)

itcl::body vmBVNummer::pasteGrber {} {

   set tbl [getTbl1Path]

   set cursorPos [[$tbl entrypath] index insert]
   if {[catch {selection get} txt]} {
      #puts "FEHLER: >>$txt<<"
   }

   if {[vmTclTools::valInteger2 $txt] == 1} {
      $_bvnr(tblCPath1) insert $cursorPos $txt
      clipboard clear
      selection clear
      return 1
   } else {
      bell
      return 0
   }
}

方法getTbl1Path只给出tablelist的Path。 valInteger仅返回0或1。

每当我将一些文本粘贴到已编辑的单元格时,都会执行pasteGrber方法,但无论如何都会粘贴复制的文本。我怎么能避免这个?

1 个答案:

答案 0 :(得分:0)

要停止正常绑定触发,您需要使绑定脚本执行break。这意味着你应该让pasteGrber方法在它想要抑制可能触发的其他绑定时执行此操作:

return -code break

使调用上下文执行break(因为break确实会生成一种特殊类型的异常)。