我使用以下代码创建一个表列表(由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方法,但无论如何都会粘贴复制的文本。我怎么能避免这个?
答案 0 :(得分:0)
要停止正常绑定触发,您需要使主绑定脚本执行break
。这意味着你应该让pasteGrber
方法在它想要抑制可能触发的其他绑定时执行此操作:
return -code break
使调用上下文执行break
(因为break
确实会生成一种特殊类型的异常)。