規定時間からピースをはみ出させたく無いのですが、実現可能でしょうか。
2017年10月10日
説明
タイムビューのイベントをハンドリングして、はみ出しをチェックするコードを記述することである程度可能です。
しかしながらタイムビューがこれを自動で行うという機能は現在のところありません。
対応
はみ出し抑制のコード記述は、ユーザーに提供するUI毎に行います。
ピース追加UI:AfterPieceAddイベント
ピース同位置アイテム内移動UI:AfterPieceMoveイベント
ピース開始、または終了時間の変更UI:AfterPieceTimeChangeイベント
ドラッグアンドドロップUI:OLEDragOverイベント
※ドラッグアンドドロップUIの仕様を有効にしている場合、AfterPieceMoveイベントは発生しません。
※コードを記述しても ドラッグアンドドロップUI以外のUIでは、残念ながらUIの最中に対する、はみ出しの抑制はできません。
(例)はみ出しの抑制のサンプルコード
Private sDate As String
Private dtViewStart As Date
Private dtViewFinish As Date
Private Sub Form_Load()
sDate = “2000/7/21″
dtViewStart = sDate & ” 8:30″
dtViewFinish = DateAdd(“d”, 1, dtViewStart)
Dim i As Integer
With KnTView1
With .TimeScale
With .Small
.Unit = tivScaleUnitHour
.Interval = 1
.SubUnit = tivScaleUnitMinute
.SubInterval = 30
End With
With .Medium
‘文字目盛り表示は中区分のみで行う
.Unit = tivScaleUnitHour
.Interval = 1
.Format = “H”
End With
With .Large
‘目盛りを30分間隔にする。
.Unit = tivScaleUnitMinute
.Interval = 30
‘この大区分の目盛りはWindowFitのための設定になってしまい
‘目盛り表示の設定としては具合が悪い(画面が狭い状態で
’30分間隔で”8:00″,”8:30″と目盛り表示されると目盛りどうし
‘かさなったりする)。そのため非表示。
.Hidden = True
End With
‘WindowFitを利用するように指示する。
.WindowFit = tivWindowFitLargeScale
‘大区分目盛り48個分(24時間=30分×48)を一画面に表示する。
.WindowFitNumScales = 48
End With
.ViewTopTime = dtViewStart
For i = 1 To 10
.Items.Add
Next
End With
End Sub
Private Sub KnTView1_AfterPieceAdd( _
ByVal Cancel As KnTViewLib.ReturnBoolean, _
ByVal Start As KnTViewLib.ReturnDate, _
ByVal Finish As KnTViewLib.ReturnDate, _
ByVal Item As KnTViewLib.Item)
If Start < dtViewStart Then
MsgBox "開始側の時間が目盛りを超えました。" & _
"追加操作をキャンセルします。"
Cancel = True
End If
If dtViewFinish < Finish Then
MsgBox "終了側の時間が目盛りを超えました。" & _
"追加操作をキャンセルします。"
Cancel = True
End If
End Sub
Private Sub KnTView1_AfterPieceMove( _
ByVal Cancel As KnTViewLib.ReturnBoolean, _
ByVal Minutes As Long)
Dim pce As KnTViewLib.Piece
Dim dtNewStart As Date
Dim dtNewFinish As Date
Set pce = KnTView1.SelectedPieces(1)
dtNewStart = DateAdd("n", Minutes, pce.Start)
dtNewFinish = DateAdd("n", Minutes, pce.Finish)
If dtNewStart < dtViewStart Then
MsgBox "開始側の時間が目盛りを超えました。" & _
"移動操作をキャンセルします。"
Cancel = True
End If
If dtViewFinish < dtNewFinish Then
MsgBox "終了側の時間が目盛りを超えました。" & _
"移動操作をキャンセルします。"
Cancel = True
End If
End Sub
Private Sub KnTView1_AfterPieceTimeChange( _
ByVal Cancel As KnTViewLib.ReturnBoolean, _
ByVal Which As Integer, _
ByVal Time As KnTViewLib.ReturnDate)
If Which = tivStart Then
If Time < dtViewStart Then
MsgBox "開始側の時間が目盛りを超えました。" & _
"開始時間変更の操作をキャンセルします。"
Cancel = True
End If
Else
If dtViewFinish < Time Then
MsgBox "終了側の時間が目盛りを超えました。" & _
"終了時間変更の操作をキャンセルします。"
Cancel = True
End If
End If
End Sub
Private Sub KnTView1_OLEDragOver(Data As KnTViewLib.DataObject, _
ByVal Effect As KnTViewLib.ReturnLong, _
Button As Integer, Shift As Integer, _
X As Single, Y As Single, _
ByVal State As KnTViewLib.ReturnInteger, _
ByVal LocalDragDrop As Boolean)
If Data.GetFormat(5050) And LocalDragDrop Then
Dim MinuteInterval As Long
Dim selPcs As SelectedPieces
Dim pce As Piece
Dim dtNewStart As Date
Dim dtNewFinish As Date
'ピースコレクションを取得
Set selPcs = Data.GetData(5050)
'ドラッグの移動量を分数で求める
MinuteInterval = KnTView1.CalcDragMinuteInterval(X, Y, _
selPcs.DragPiece, selPcs.DeltaX)
For Each pce In selPcs
'移動後の日時
dtNewStart = DateAdd("n", MinuteInterval, pce.Start)
dtNewFinish = DateAdd("n", MinuteInterval, pce.Finish)
'オーバードラッグの調整
ViewFinishTime = DateAdd("d", 1, KnTView1.ViewTopTime)
If dtNewStart < dtViewStart Then
'目盛りからはみ出しているのでドロップを受付けないフラグを設定
Effect.Value = 0
ElseIf dtViewFinish < dtNewFinish Then
'目盛りからはみ出しているのでドロップを受付けないフラグを設定
Effect.Value = 0<
