home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 January
/
VPR9701A.ISO
/
PROJ95
/
EXAMPLES
/
TIMETRAK
/
GRIDFUNC.BAS
< prev
next >
Wrap
BASIC Source File
|
1996-08-21
|
16KB
|
553 lines
'GRIDFUNC.BAS - このモジュールには、すべての主要なグリッドの
'"プロパティ"、"メソッド"、および妥当性検査のための関数が含まれます。
'
Option Explicit
Option Compare Text
'この配列は、グリッド内でどのセルが編集可能かを確認します。
'グリッド内の各セルには、CellEditTable と同じ値が入力されて
'います。グリッドに値を書き込むプロシージャでは、CellEditTable を
'チェックして、指定されたセルが変更可能なものかどうかを確認します。
'入力値 "True" は編集が可能であることを示し、"False" は編集できない
'ことを示します。
Dim mabCellEditTable() As Integer
'この配列は、mabCellEditTable に類似していますが、
'mabCellEditTable とは異なり、指定されたセルの内容を
'ユーザーが変更したかどうかを示します。
Dim mabCellChangedTable() As Integer
'グリッドが空の場合、True を返します。
Dim mbGridEmpty As Integer
'グリッドのタイトル行 (列見出し)
Const TITLE_ROW = 0
'ColAlignment、FixedAlignment プロパティ
Const GRID_ALIGNLEFT = 0
Const GRID_ALIGNRIGHT = 1
Const GRID_ALIGNCENTER = 2
'Fillstyle プロパティ
Const GRID_SINGLE = 0
Const GRID_REPEAT = 1
'ユーザーが TInfo フォームを編集した後の
'グリッドの行のデータを含みます。
'been edited by the user.
Type utRowRec
nAUID As Integer '割り当ての固有 ID
nTID As Integer 'タスク ID
nActWork As Integer 'リソースの実績作業時間
nRemWork As Integer 'リソースの残存作業時間
nAddWork As Integer '追加作業時間
bAddWorkDirty As Integer 'ユーザーが AddWord フィールドを編集したかどうかを示すフラグ
nETC As Integer '残存作業時間の新しい見積り
bETCDirty As Integer 'ユーザーが ETC フィールドを編集したかどうかを示すフラグ
dtStart As Variant 'リソースがタスクの作業を開始する日付
bStartDirty As Integer 'ユーザーが [開始日] フィールドを編集したかどうかを示すフラグ
dtFinish As Variant 'リソースがタスクの作業を終了する日付
bFinishDirty As Integer 'ユーザーが [終了日] フィールドを編集したかどうかを示すフラグ
End Type
'この構造は、frmTaskInfo の編集を元に戻すためのバッファとして使用します。
Type utUndo
sUndo As String '元に戻す文字列
nRow As Integer 'nRow と nCol を使用して、sUndo の値の
nCol As Integer 'グリッドの座標を保存します。
nTag As Integer '元に戻す文字列が含まれていたコントロールの種類。0 = 無効な内容、1 = グリッド、2 = テキスト ボックス
End Type
'iCol および iRow で指定したセルの CellEditTable への入力を行います。
'bEdit の値によって、指定したセルが編集可能かどうかが決まります。
'True = 編集可能、False = 編集不可
'
'iCol = -1 かつ iRow = -1 の場合、AllowCellEditing では、
'グリッドで現在選択されているセルの座標が使用されます。
'
Sub AllowCellEditing (ByVal iCol As Integer, ByVal iRow As Integer, bEdit As Integer)
Dim F As frmTInfo
Set F = frmTInfo
'引数をチェックします。
Select Case iCol
Case -1
iCol = F!Grid.SelStartCol
Case AUID To FINISH
'OK!
Case Else
'値が範囲外です。
Error 9
End Select
Select Case iRow
Case -1
iRow = F!Grid.SelStartRow
Case 1 To UBound(mabCellEditTable, 2)
'OK!
Case Else
'値が範囲外です。
Error 9
End Select
mabCellEditTable(iCol, iRow) = bEdit
End Sub
Function CellIsDirty (ByVal iCol As Integer, ByVal iRow As Integer) As Integer
Dim F As frmTInfo
Set F = frmTInfo
'引数をチェックします。
Select Case iCol
Case -1
iCol = F!Grid.SelStartCol
Case ADDWORK To FINISH
'OK!
Case Else
'値が範囲外です。
Error 9
End Select
Select Case iRow
Case -1
iRow = F!Grid.SelStartRow
Case 1 To UBound(mabCellChangedTable, 2)
'OK!
Case Else
'値が範囲外です。
Error 9
End Select
CellIsDirty = mabCellChangedTable(iCol, iRow)
End Function
'指定されたセル座標に対する CellEditTable で、編集が可能かどうかを
'返します。iCol = -1 かつ iRow = -1 の場合、グリッドで現在選択
'されているセルの座標が使用されます。
'
Function CellIsEditable (iCol, iRow) As Integer
Dim F As frmTInfo
Set F = frmTInfo
'引数をチェックします。
Select Case iCol
Case -1
iCol = F!Grid.SelStartCol
Case AUID To FINISH
'OK!
Case Else
'値が範囲外です。
Error 9
End Select
Select Case iRow
Case -1
iRow = F!Grid.SelStartRow
Case 1 To UBound(mabCellEditTable, 2)
'OK!
Case Else
'値が範囲外です。
Error 9
End Select
CellIsEditable = mabCellEditTable(iCol, iRow)
End Function
'グリッドの入力値を検査します。入力値が有効な場合は True を返し、
'無効な場合は False を返します。
'
Function CheckEdit () As Integer
Dim F As frmTInfo
Dim iRow As Integer
Dim iCol As Integer
Dim sGridText As String
Dim iTmpCol As Integer
Dim dtStart As Variant
Dim dtFinish As Variant
Dim tmp As Variant
Dim nAddWork As Integer
Dim nETC As Integer
On Error GoTo CheckEditError
Set F = frmTInfo
iRow = F!Grid.Row
iCol = F!Grid.Col
sGridText = F!Grid.Text
Select Case iCol
Case ADDWORK
2010 nAddWork = goProjApp.DurationValue(sGridText)
Select Case nAddWork
Case Is < 0
'入力値が無効な場合
Beep
MsgBox MB_LESS_THAN_ZERO, MB_ICONEXCLAMATION, MB_TIMESHEET
CheckEdit = False
Case Is = 0
'残存作業時間を ETC にコピーします。
F!Grid.Col = REMWORK
tmp = F!Grid.Text
F!Grid.Col = ETC
F!Grid.Text = tmp
F!Grid.Col = iCol
CheckEdit = True
Case Is > 0
'残存作業時間から追加作業時間を引き、
'その計算結果を ETC に入力します。
F!Grid.Col = ETC
tmp = goProjApp.DurationValue(F!Grid.Text)
tmp = tmp - nAddWork
If tmp > 0 Then
F!Grid.Text = goProjApp.DurationFormat(tmp, gnDefWorkUnit)
Else
F!Grid.Text = "0" + gsDefWorkUnit
AllowCellEditing FINISH, -1, True
End If
F!Grid.Col = iCol
CheckEdit = True
End Select
Case ETC
2020 nETC = goProjApp.DurationValue(sGridText)
Select Case nETC
Case Is < 0
'入力値が無効な場合
Beep
MsgBox MB_LESS_THAN_ZERO, MB_OK + MB_ICONEXCLAMATION, MB_TIMESHEET
CheckEdit = False
Case Is = 0
'ETC = 0 の場合、終了日の編集を可能にします。
AllowCellEditing FINISH, -1, True
CheckEdit = True
Case Is > 0
'入力値が有効な場合
AllowCellEditing FINISH, -1, False
CheckEdit = True
Case Else
'入力値が無効な場合
Beep
MsgBox MB_UNRECOGNIZED_ENTRY, MB_OK + MB_ICONEXCLAMATION, MB_TIMESHEET
CheckEdit = False
End Select
Case Start
2030 Select Case DateValue(sGridText)
Case Is >= DateValue(goActiveProj.Start)
CheckEdit = True
Case Else
Beep
MsgBox MB_START_NOT_VALID, MB_OK + MB_ICONEXCLAMATION, MB_TIMESHEET
CheckEdit = False
End Select
Case FINISH
'終了日に開始日より後の日付が指定されているかどうかを確認します。
2040 dtFinish = DateValue(sGridText)
F!Grid.Col = Start
2050 dtStart = DateValue(F!Grid.Text)
If DateDiff("d", dtStart, dtFinish) < 0 Then
Beep
MsgBox MB_FINISH_NOT_VALID, MB_OK + MB_ICONEXCLAMATION, MB_TIMESHEET
CheckEdit = False
Else
CheckEdit = True
End If
F!Grid.Col = iCol
End Select
Exit Function
CheckEditError:
Select Case Erl
Case 2010, 2020
'入力値が正しくない場合
Beep
MsgBox MB_UNRECOGNIZED_ENTRY, MB_OK + MB_ICONEXCLAMATION, MB_TIMESHEET
CheckEdit = False
Case 2030, 2040
'日付の形式が正しくない場合
Beep
MsgBox MB_BAD_DATE_FORMAT, MB_ICONEXCLAMATION, MB_TIMESHEET
CheckEdit = False
Case 2050
'日付の形式が正しくない場合
F!Grid.Col = iTmpCol
Beep
MsgBox MB_BAD_DATE_FORMAT, MB_ICONEXCLAMATION, MB_TIMESHEET
CheckEdit = False
Case Else
'予期しないエラー
CheckEdit = False
End Select
Exit Function
End Function
'autInfo 配列に格納されている行のカウントを返します。
'autInfo 配列は、ReDim を使用して修正します。
'
Function GetGridInfo (autInfo() As utRowRec) As Integer
Dim oApp As object 'Winproj アプリケーション オブジェクト
Dim F As frmTInfo 'frmTInfo フォームのオブジェクト
Dim nRows As Integer 'グリッド内の行数
Dim iRow As Integer 'グリッド内の行にインデックスを付けるためのループ カウンタ
Dim iCol As Integer 'グリッド内の列にインデックスを付けるためのループ カウンタ
Dim vntGVal As Variant 'グリッドの文字列または値
Dim tmp As Variant '雑多な値を保存するための一時的な変数
On Error GoTo GetGridInfoError
Set oApp = goProjApp
Set F = frmTInfo
'グリッドが空かどうかを確認し、空の場合は終了します。
If mbGridEmpty Then
GetGridInfo = 0
Exit Function
End If
nRows = F!Grid.Rows
ReDim autInfo(1 To nRows - 1) As utRowRec
For iRow = 1 To nRows - 1
For iCol = AUID To FINISH
F!Grid.Row = iRow
F!Grid.Col = iCol
vntGVal = F!Grid.Text
Select Case iCol
Case AUID
autInfo(iRow).nAUID = vntGVal
Case TASKID
autInfo(iRow).nTID = vntGVal
Case TASKNAME
'タスク名は必要ではありません。
Case ACTWORK
tmp = oApp.DurationValue(vntGVal)
autInfo(iRow).nActWork = CInt(tmp)
Case REMWORK
tmp = oApp.DurationValue(vntGVal)
autInfo(iRow).nRemWork = CInt(tmp)
Case ADDWORK
tmp = oApp.DurationValue(vntGVal)
autInfo(iRow).nAddWork = CInt(tmp)
autInfo(iRow).bAddWorkDirty = CellIsDirty(iCol, iRow)
Case ETC
tmp = oApp.DurationValue(vntGVal)
autInfo(iRow).nETC = CInt(tmp)
autInfo(iRow).bETCDirty = CellIsDirty(iCol, iRow)
Case Start
autInfo(iRow).dtStart = vntGVal
autInfo(iRow).bStartDirty = CellIsDirty(iCol, iRow)
Case FINISH
autInfo(iRow).dtFinish = vntGVal
autInfo(iRow).bFinishDirty = CellIsDirty(iCol, iRow)
End Select
Next iCol
Next iRow
GetGridInfo = nRows
Exit Function
GetGridInfoError:
Beep
MsgBox MB_GENERIC_ERROR + " Err#" + Str$(Err), MB_ICONEXCLAMATION, MB_TIMESHEET
TerminateApplication
End Function
Sub GridAddRow (utRowInfo As utAssignment)
Dim iCurRow As Integer
Dim oApp As object
Dim F As frmTInfo
Set F = frmTInfo
Set oApp = goProjApp
If mbGridEmpty Then
F!Grid.Row = 1
Else
F!Grid.Rows = F!Grid.Rows + 1
F!Grid.Row = F!Grid.Rows - 1
ReDim Preserve mabCellEditTable(AUID To FINISH, TITLE_ROW To F!Grid.Row) As Integer
ReDim Preserve mabCellChangedTable(ADDWORK To FINISH, 0 To F!Grid.Row) As Integer
End If
iCurRow = F!Grid.Row
F!Grid.Col = AUID
F!Grid.Text = utRowInfo.nAUID
AllowCellEditing AUID, iCurRow, False
F!Grid.Col = TASKID
F!Grid.Text = utRowInfo.nTID
AllowCellEditing TASKID, iCurRow, False
F!Grid.Col = TASKNAME
F!Grid.Text = utRowInfo.sTName
AllowCellEditing TASKNAME, iCurRow, False
F!Grid.Col = ACTWORK
F!Grid.Text = oApp.DurationFormat(utRowInfo.nActWork, gnDefWorkUnit)
AllowCellEditing ACTWORK, iCurRow, False
F!Grid.Col = REMWORK
F!Grid.Text = oApp.DurationFormat(utRowInfo.nRemWork, gnDefWorkUnit)
AllowCellEditing REMWORK, iCurRow, False
F!Grid.Col = ADDWORK
F!Grid.Text = "0"
AllowCellEditing ADDWORK, iCurRow, True
MarkCellDirty ADDWORK, iCurRow, False
F!Grid.Col = ETC
F!Grid.Text = oApp.DurationFormat(utRowInfo.nRemWork, gnDefWorkUnit)
AllowCellEditing ETC, iCurRow, True
MarkCellDirty ETC, iCurRow, False
F!Grid.Col = Start
F!Grid.Text = utRowInfo.dtStart
'実績作業時間が 0 の場合にのみ、
'実績開始日の入力を可能にします。
If utRowInfo.nActWork > 0 Then
AllowCellEditing Start, iCurRow, False
Else
AllowCellEditing Start, iCurRow, True
End If
MarkCellDirty Start, iCurRow, False
F!Grid.Col = FINISH
F!Grid.Text = utRowInfo.dtFinish
'残存作業時間が 0 の場合にのみ、
'実績終了日の入力を可能にします。
If utRowInfo.nRemWork > 0 Then
AllowCellEditing FINISH, iCurRow, False
Else
AllowCellEditing FINISH, iCurRow, True
End If
MarkCellDirty FINISH, iCurRow, False
mbGridEmpty = False
End Sub
'グリッドの現在の内容をクリアし、行のプロパティを 2 に戻します。
'また、mabCellEditTable と mbGridEmtpy を変更します。
'列見出しへの影響はありません。
'
Sub GridReset ()
Dim iCol As Integer, iRow As Integer, i As Integer
Dim F As frmTInfo
Set F = frmTInfo
F!Grid.Rows = 2
F!Grid.Row = 1
For i = AUID To FINISH
F!Grid.Col = i
F!Grid.Text = ""
Next i
'CellEditTable を更新します。
ReDim mabCellEditTable(AUID To FINISH, TITLE_ROW To 1) As Integer
For iCol = AUID To FINISH
For iRow = TITLE_ROW To 1
mabCellEditTable(iCol, iRow) = False
Next iRow
Next iCol
'CellChangedTable を更新します。
ReDim mabCellChangedTable(ADDWORK To FINISH, TITLE_ROW To 1) As Integer
For iCol = ADDWORK To FINISH
For iRow = TITLE_ROW To 1
mabCellChangedTable(iCol, iRow) = False
Next iRow
Next iCol
'現在グリッドが空であることを示します。
mbGridEmpty = True
End Sub
'Grid コントロールの列の見出しと幅を設定します。
'また、mabCellEditTable と mbGridEmtpy の初期値を
'設定します。InitializeGrid は、TInfo フォームの
'ロード プロシージャから呼び出されます。
'
Sub InitializeGrid ()
Dim F As frmTInfo, iGCol As Integer, iCol As Integer, iRow As Integer
Set F = frmTInfo
Const TITLE_ROW = 0
F!Grid.Row = TITLE_ROW
F!Grid.Col = AUID
F!Grid.Text = "auid"
F!Grid.Col = TASKID
F!Grid.Text = GRID_TASKID
F!Grid.Col = TASKNAME
F!Grid.Text = GRID_TASKNAME
F!Grid.Col = ACTWORK
F!Grid.Text = GRID_ACTWORK
F!Grid.Col = REMWORK
F!Grid.Text = GRID_REMWORK
F!Grid.Col = ADDWORK
F!Grid.Text = GRID_ADDWORK
F!Grid.Col = ETC
F!Grid.Text = GRID_ETC
F!Grid.Col = Start
F!Grid.Text = GRID_START
F!Grid.Col = FINISH
F!Grid.Text = GRID_FINISH
F!Grid.RowHeight(TITLE_ROW) = 500
F!Grid.ColWidth(AUID) = 1 'この列はユーザーには見えません。
F!Grid.ColWidth(TASKID) = 500
F!Grid.ColWidth(TASKNAME) = 2200
For iGCol = ACTWORK To FINISH
F!Grid.ColWidth(iGCol) = 900
Next iGCol
'グリッドが空であることを示します。
mbGridEmpty = True
F!Grid.Row = 1
F!Grid.Col = ADDWORK
End Sub
Sub MarkCellDirty (ByVal iCol As Integer, ByVal iRow As Integer, bDirty As Integer)
Dim F As frmTInfo
Set F = frmTInfo
'引数をチェックします。
Select Case iCol
Case -1
iCol = F!Grid.SelStartCol
Case ADDWORK To FINISH
'OK!
Case Else
'値が範囲外です。
Error 9
End Select
Select Case iRow
Case -1
iRow = F!Grid.SelStartRow
Case 1 To UBound(mabCellChangedTable, 2)
'OK!
Case Else
'値が範囲外です。
Error 9
End Select
mabCellChangedTable(iCol, iRow) = bDirty
End Sub