SSpread

Q1 15
BeforeColMove・BeforeRowMoveイベントの発生タイミング

A1 15
BeforeColMove・BeforeRowMoveイベントは、ドラッグ&ドロップで列・行の移動を行うことで
発生します。
イベントが起きた時点では、列・行の移動は完了しているとは限りません。
このため、BeforeColMove・BeforeRowMoveイベント内でセルに対する操作を行うと、イベント
発生時点でのセルの位置は不定であるため、正しく操作が行われない場合があります。
BeforeColMove・BeforeRowMoveイベント内でのセルに対する操作は、なるべく避けてください。

現象が発生する一例を以下に挙げます。

(1)ドラッグ&ドロップで列を移動した時、移動先の列の最下行セルの内容を取得します。
  列をドラッグ&ドロップすると、BeforeColMoveイベントが発生します。
  
(2)BeforeColMoveイベント内で赤枠のセルの値を取得し、MessageBoxに表示していますが、
  列移動が完了していないため正しく内容が取得できていません。
  
(3)BeforeColMoveイベントから1秒後にTimerイベントで同じセルの値を取得すると、
  正しく取得できています。
  

[サンプルコード]
Form Form1 {
 X = 0;
 Y = 0;
 Width = 420;
 Height = 231;
 
 SSpread SSpread1 {
  X = 15;
  Y = 12;
  Width = 374;
  Height = 194;
  MaxCols = 5;
  MaxRows = 10;
  AllowColMove = $True;
  
  Number c;
  /*BeforeColMoveイベント内*/
  Function OnBeforeColMove( e ) { 
   /*移動先列の最終行の値を取得*/
   var a = getText(e.ColDest,Maxrows);
   c = e.ColDest;
   setTimer(1,$True);
   MessageBox("イベント内で取得 : "+a);
  }
  
  /*BeforeColMoveイベント発生から1秒後*/
  Function OnTimer( e ) {
   /*移動先列の最終行の値を取得*/
   var b = getText(c,Maxrows);
   MessageBox("イベント発生から1秒後に取得 : "+b);
  }
 }
 
 if ( !$DESIGNTIME ) {
  /*値セット*/
  for(var x=1;x<= SSpread1.MaxCols;x++){
   for(var y=1;y<= SSpread1.MaxRows;y++){
    SSpread1.SetText(x,y,str(x)+"-"+str(y));
   }
  }
 }
}
※PC環境によっては、問題が起こりにくい場合もあります。

Biz/Browser V ver 5.0.2.0から追加されたAfterColMoveイベントやAfterRowMoveイベントを利用すれば、 上記のような処理も可能となります。

AfterColMoveイベントについては、
Biz/Browser V・Biz/Designer V TIPS集 > SSpread >
  特定列のドラッグ&ドロップ操作を無効にしたい
をご参照ください。  

管理番号:Sspd50_015
  Biz-Collections Bizの宝箱 トップへ
  Biz/Browser V・Biz/Designer V TIPS集 トップへ