• ベストアンサー

Tcl/Tkのリストボックスでcurselectionの結果が1個おきになる

Tcl/Tkでリストボックスの内容を一括削除するために curselectionコマンドを使って set selected [.listbox curselection] foreach i $selected {   .listbox delete $i } と削除機能を実装しました。 ところが、curselectionで取得した選択範囲のインデックスが なぜか1個おきになっているらしく、 1回の操作で選択範囲の半分しか削除されません。 上記の実装に何か抜けている点などがありましたら、 御指摘お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

リストボックスの最初の状態が 0: AAA 1: BBB 2: CCC 3: DDD 4: EEE 5: FFF だったとします。(最初の0:等は行番号のつもりです。) このとき、$selectedは0,1,2,3,4,5になります。 この状態から、foreachの最初のループを実行すると、$i=0ですので最初の行が削除され、リストボックスの状態は 0: BBB 1: CCC 2: DDD 3: EEE 4: FFF になります。 次のループでは$i=1ですので2行目が削除されます。が、この「2行目」は「当初のリストボックスの内容の2行目」ではなく「現在のリストボックスの内容の2行目」になり、実行結果は 0: BBB 1: DDD 2: EEE 3: FFF となり、「当初のリストボックスの内容」で言えば3行目が削除されることになります。 これを繰り返せば、1行おきに削除されることになるわけです。

etendard
質問者

お礼

御回答ありがとうございます。 実装方法以前に機能理解の方に問題があったのですね。 foreachループは今まで使ったことがなかったもので、 先入観で同時実行だと思い込んでいました。 どうもありがとうございました。

関連するQ&A