2016-06-24 15 views
0

ich ein table (von Nehmeti) mit dem folgenden Code erstellen:tcl tk binden <Control-v> an eine Zelle in einem table

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] 

Ich mache die 5. Spalte bearbeitet von

$_bvnr(tbl1) columnconfigure 5 -editable no -name bgb -editwindow entryfield 

Verfahren für die editstartcommand ist folgende:

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 
} 

die Methode „pasteGrber“ Durch die Bindung ich versuche, dass t zu verhindern er Text in „Schaffe“ kann in der entryfield eingefügt werden, wenn es keine ganze Zahl ist nur (die in vmTclTools :: valInteger geprüft)

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 
    } 
} 

Das Verfahren getTbl1Path gibt den Pfad des table. valInteger gibt nur 0 oder 1 zurück

Immer wenn ich etwas Text in die bearbeitete Zelle einfüge, wird die Methode pasteGrber ausgeführt, aber der kopierte Text wird trotzdem eingefügt. Wie kann ich das vermeiden?

Antwort

0

Um zu verhindern, dass die normalen Bindungen ausgelöst werden, müssen Sie das Haupt- Bindungsskript einen break machen. Das heißt, sollten Sie die pasteGrber Methode, dies machen tun, wenn es will, die anderen Bindungen zu unterdrücken, die Feuer könnte:

return -code break 

, die die Aufruf Kontext macht tun ein break (als break wirklich eine besondere Art von Ausnahme erzeugt) .