tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル所定の位置に「×」ではなく数字に置き換えるには?
記事No11599
投稿日: 2008/03/01(Sat) 22:55
投稿者tea
ある所定の位置に横1列に「×」もしくは「=」を7つ表示させるよう
にしてあるんですが、これを「×」の箇所のみを設定した時間から経過
した時間を引いて最初の1文字(例えば3など)を表示するようにした
いんです。

現状では以下のようなコードが思い浮かばないんです。

'チャージドタイムアウト時の残り時間
Public Function TimeOutMin()
Dim A As Integer
Dim b As Integer
Dim c As Integer

    A = Left(vsGameTime.Value / 60, 1)
    b = Game.Setting.QuarterMinutes
    
    c = b - A
    
End Function

「×」を表示するコードは

RScoreSheeetCommanderクラス内の以下の箇所にあります。
また関係するコードも記載します。

Option Explicit

Implements IPrintCommander
Private Type URunningScore

    ColWidth As Single
    RowHeight As Single
    MarginWidth As Single
    RowsInDivide As Long
End Type

Private Type URScoreSheetCommander
    Game As Game
    RunningScore As URunningScore
End Type

Private mp As URScoreSheetCommander

Private Sub drawTeam(ByVal PE As PrintEngine, _
                     ByVal Left As Single, ByVal Top As Single, _
                     ByVal LeftColWidth As Single, _
                     ByVal RightColWidth As Single, _
                     ByVal TeamFoulMarginWidth As Single, _
                     ByVal TeamFaulColWidth As Single, _
                     ByVal RowHeight As Single, _
                     ByVal TeamMarginHeight As Single)
    Dim i As Long
    Dim j As Long
    
    Dim ixTeam As Long
    Dim ixQuarter As BBQuarter
    Dim ixPlayer As Long
    Dim cRows As Long, cCols As Long
    Dim cLefts As Long, cRights As Long
    Dim ixCol As Long, ixRow As Long
    Dim ixCoach As Long, oCoach As Player
    
    Dim w As Single, h As Single
    Const cNameCols = 8
    
    With PE
        For ixTeam = 0 To 1
            '---チャージドタイムアウトの表示。-------------------------                  ixRow = ixRow + 1
            
        For i = bbTimeOutMin To bbTimeOutMax
                .DrawMatrixBox i, ixRow, 1, 1
                
                If mp.Game.Team(ixTeam).TimeOutted(i) Then
                  '---以下が「×」を表示するコードですが、.DrawMatrixCross
          の代わりに経過時間を表示させる。---
                    .DrawMatrixCross i, ixRow, 1, 1, colorByQuarter _
                    (mp.Game.Team(ixTeam).TimeOutted(i))
                Else
                    '「=」ダブルラインを表示する。
                    .DrawMatrixCenterDoubleLine i, ixRow, 1, 0.95, _
                     colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
                End If
                
            Next
            
.DrawMatrixCrossはPrintEngineクラス内に

Option Explicit

Private Type UMatrix
    Left As Single
    Top As Single
    CellWidth As Single
    CellHeight As Single
End Type
    
Private Type UPrintEngine
    Canvas As Object
    BlackAndWhite As Boolean
    Ratio As Single
    ScaleRight As Single
    ScaleBottom As Single
    
    XOffset As Single
    YOffset As Single
    
    Matrix As UMatrix
    
    LastForeColor As Long
    LastFont As StdFont
    LastDrawWidth As Long
    LastFillStyle As Long
    LastFillColor As Long
End Type

Private mp As UPrintEngine

Public Sub DrawMatrixCross(ByVal Col As Single, _
                           ByVal Row As Single, _
                           ByVal Cols As Single, _
                           ByVal Rows As Single, _
                           Optional ByVal Color As Variant = Empty)
    With makeMatrixRect(Col, Row, Cols, Rows)
        drawLine .Left, .Top, .Right, .Bottom, False, Color
        drawLine .Left, .Top, .Right, .Bottom, True, Color
    End With
  
End Sub

makeMatrixRectは同じクラス内にあり・・・
Private Function makeMatrixRect(ByVal Col As Single, _
                                ByVal Row As Single, _
                                ByVal Cols As Single, _
                                ByVal Rows As Single) As UPrintRectangle
    With mp.Matrix
        makeMatrixRect.Left = .Left + (Col - 1) * .CellWidth
        makeMatrixRect.Top = .Top + (Row - 1) * .CellHeight
        makeMatrixRect.Right = makeMatrixRect.Left + .CellWidth * Cols
        makeMatrixRect.Bottom = makeMatrixRect.Top + .CellHeight * Rows
    End With
End Function

以上なんですが、わかっていることは前述の.DrawMatrixCrossを置き換えること
で対処できると思うんですが、その方法がわかりません。

基礎的な事柄かもしれませんが教えてください。
よろしくお願いします。

[ツリー表示へ]
タイトルコードをよく見直してから再度投稿させていただきます。
記事No11605
投稿日: 2008/03/02(Sun) 15:37
投稿者tea
コードをよく見直してから再度投稿させていただきます。

[ツリー表示へ]
タイトル再度、質問させていただきます。
記事No11611
投稿日: 2008/03/03(Mon) 14:41
投稿者tea
PictureBoxの所定の位置に「×」というかクロスの線を引くようにするため
のコードで、コマンドボタンをクリックするとこで「クロス線」を表示する
のですが、これをTimerの経過時間に置き換えたいと思っています。

経過時間は以下のコードで求めることが出来るのですが、
Left(vsGameTime.Value / 60, 1) - Game.Setting.QuarterMinutes
これをどのようにして.DrawMatrixCrossと置き換えたらよいのかが
わかりません。
初歩的な事柄で申し訳ありませんが、どうか教えてください。
よろしくお願いします。

Public Sub DrawMatrixCross(ByVal Col As Single, _
                           ByVal Row As Single, _
                           ByVal Cols As Single, _
                           ByVal Rows As Single, _
                           Optional ByVal Color As Variant = Empty)
    With makeMatrixRect(Col, Row, Cols, Rows)
        drawLine .Left, .Top, .Right, .Bottom, False, Color
        drawLine .Left, .Top, .Right, .Bottom, True, Color
    End With
  
End Sub

Private Sub drawLine(ByVal Left As Single, _
                     ByVal Top As Single, _
                     ByVal Right As Single, _
                     ByVal Bottom As Single, _
                     Optional ByVal Flip As Boolean = False, _
                     Optional ByVal Color As Variant = Empty, _
                     Optional ByVal DrawWidth As Variant = Empty)
    
    With mp
        pushForeColor Color
        pushDrawWidth DrawWidth

        If Not Flip Then
            .Canvas.Line (.XOffset + Left, .YOffset + Top)- _
        (.XOffset + Right, .YOffset + Bottom), .Canvas.ForeColor

        Else
            .Canvas.Line (.XOffset + Right, .YOffset + Top)- _
        (.XOffset + Left, .YOffset + Bottom), .Canvas.ForeColor
        End If
        popForeColor Color
        popDrawWidth DrawWidth
    End With
End Sub

[ツリー表示へ]
タイトルRe: 再度、質問させていただきます。
記事No11613
投稿日: 2008/03/03(Mon) 15:50
投稿者
> Public Sub DrawMatrixCross(ByVal Col As Single, _
>                            ByVal Row As Single, _
>                            ByVal Cols As Single, _
>                            ByVal Rows As Single, _
>                            Optional ByVal Color As Variant = Empty)
>     With makeMatrixRect(Col, Row, Cols, Rows)
>         drawLine .Left, .Top, .Right, .Bottom, False, Color
>         drawLine .Left, .Top, .Right, .Bottom, True, Color
>     End With
>    
> End Sub

線を引く際に座標を指定しているということは
「それが何番目のクロス線なのか」は判っていると思われます。

PictureBox上にLabelなりTextBoxなりを配置して

> Left(vsGameTime.Value / 60, 1) - Game.Setting.QuarterMinutes

の結果を入れてあげるってのはどうでしょう?

[ツリー表示へ]
タイトルRe^2: 再度、質問させていただきます。
記事No11615
投稿日: 2008/03/03(Mon) 16:53
投稿者tea
琴さん、回答をいただき本当にありがとうございます。

下記のアイデアは考え付きませんでした。

ただ、琴さんのアイデアを取り入れるとタブ1上のコマンドボ
タンをクリックした後にタブ4上のPictureBoxに毎回切り替え
て「経過時間」を選択しなければならないので2度手間なんで
す。
せっかくアイデアをいただいたのに勝手を言ってすいません。

なんとかしてタブ1上のコマンドボタンをクリックした場合に
同時にタブ4上のPictureBox内の「クロス線」ではなく「経過
時間」を表示できるようにしたいんです。
よろしくお願いします。


> 線を引く際に座標を指定しているということは
> 「それが何番目のクロス線なのか」は判っていると思われます。
>
> PictureBox上にLabelなりTextBoxなりを配置して
>
> > Left(vsGameTime.Value / 60, 1) - Game.Setting.QuarterMinutes
>
> の結果を入れてあげるってのはどうでしょう?

[ツリー表示へ]
タイトルRe^3: 再度、質問させていただきます。
記事No11616
投稿日: 2008/03/03(Mon) 17:37
投稿者リル
指定のコマンドボタンを押すと、
PictureBox内の「クロス線」で表示されている部分を
「経過時間」が表示されるようにしたいんですよね?

琴さんが提案している手法で、
VisibleプロパティがFalseのテキストボックスもしくはラベル等を
「クロス線」が表示されている部分に配置して
コマンドボタンを押すと、配置したコントロールのVisibleプロパティをTrue にし、
コントロールの中身(経過時間)をタイマー処理などで随時表示していく。
という手法ではダメなんでしょうか?

teaさんが「2度手間」と言われている内容を、私が理解できていないのでしたら
申し訳ない。

[ツリー表示へ]
タイトルRe^3: 再度、質問させていただきます。
記事No11617
投稿日: 2008/03/03(Mon) 18:46
投稿者
> ただ、琴さんのアイデアを取り入れるとタブ1上のコマンドボ
> タンをクリックした後にタブ4上のPictureBoxに毎回切り替え
> て「経過時間」を選択しなければならないので2度手間なんで
> す。

ん〜タブを切り替えなくても別タブにあるコントロールは操作できると思いますが。
ちょっと「毎回切り替え」と「2度手間」のイメージがつかめないです。
現に切り替えなくてもライン線はPicture1に描けてるんですよね?
これを「n番目のLabel(またはTextBox)に経過時間を表示」とするだけのような…。

> なんとかしてタブ1上のコマンドボタンをクリックした場合に
> 同時にタブ4上のPictureBox内の「クロス線」ではなく「経過
> 時間」を表示できるようにしたいんです。

.CurrentXと.CurrentYで座標を指定してあげて
(ライン引く時に座標指定してるから大丈夫ですよね?)
.Paintで取得した経過時間を直接描画してあげるとか?

ただこの方法だと表示が変わる時(カウントダウン等)は
ピンポイントで消去する必要がある等、色々面倒だと思いますが。

[ツリー表示へ]
タイトル考えが浅はかで失礼しました。
記事No11618
投稿日: 2008/03/03(Mon) 19:15
投稿者tea
リルさん、琴さん、回答をいただき本当にありがとうございます。

創意工夫が足りないため考え方が浅はかでした。
回答を読んで私がイメージしたものは連動性がなく、仮にコマンド
ボタンをクリックしたら手動でタブ4に移動してPictureBox内に貼
り付けたリストボックスから数字を選択して・・・と考えていまし
た。

本当にすいません。
まずは教えていただいた方法を試したいと思います。

ただPictureBox内の表示されたものを印刷できるようにもしていま
すが、何か問題はないでしょうか?

教えてください。
よろしくお願いします。

[ツリー表示へ]
タイトルRe: 考えが浅はかで失礼しました。
記事No11627
投稿日: 2008/03/04(Tue) 09:02
投稿者
> ただPictureBox内の表示されたものを印刷できるようにもしていま
> すが、何か問題はないでしょうか?

LabelやTextBoxに経過時間を入れた場合は
当然PictureBox自体には描画してませんから印刷しても何も出ないような。
それなりの改修は必要だと思いますよ。

[ツリー表示へ]
タイトルRe^2: 考えが浅はかで失礼しました。
記事No11629
投稿日: 2008/03/04(Tue) 11:51
投稿者tea
琴さん、回答をいただき本当にありがとうございます。
とにかくやってみます。

> LabelやTextBoxに経過時間を入れた場合は
> 当然PictureBox自体には描画してませんから印刷しても何も出ないような。
> それなりの改修は必要だと思いますよ。

[ツリー表示へ]
タイトルとりあえず、ここまでは出来たんですが・・・
記事No11634
投稿日: 2008/03/04(Tue) 15:31
投稿者tea
琴さんのご意見を参考にコードを以下のように改良しました。
結果はPictureBox内の所定の位置に、数字1文字が配置されるように
はなりました。

ただ、実は配置する位置は全部で7箇所あります。

1番目から7番目までの順にあるんですが、現状のコードでは時間が
経過するごとにコマンドボタンをクリックすると所定の1番目の位置に
時間が正しく表示されますが、その後2回目をクリックすると1番目の
位置と2番目の所定の位置に両方に経過時間が表示はされるんですが、
経過時間は2番目の時間が1番目にも表示されるようになってしまいま
す。

下記のRScoreSheetCommanderフォーム内のコードも合わせて記載させて
いただきましたが、どちらかのコードをさらに書き換えればいいのでは
と思うものの、うまくいえないんですがここからどうしたらよいかがわ
かりません。
教えてください。
よろしくお願いします。

PrintEngineクラスに新たにコードを追加。

Option Explicit

'ユーザー定義型変数を宣言'
Private Type UPrintEngine
    A As Integer
End Type

Friend Sub TimeOutMinutes(ByVal Col As Single, _
                           ByVal Row As Single, _
                           ByVal Cols As Single, _
                           ByVal Rows As Single, _
                           Optional ByVal Color As Variant = Empty, _
                           Optional ByVal Font As Object = Nothing)
Dim Text As Integer
Dim A, b, c, d As Integer
Dim Alignment As EAlignment33
    
    b = Game.Setting.QuarterMinutes
    c = Left(frmMain.vsGameTime.Value / 60, 1)

    d = b - c
    mp.A = d
    Text = mp.A
        
    With makeMatrixRect(Col, Row, Cols, Rows)
        drawText .Left + 0.2, .Top + 0.05, .Right, .Bottom, _
                 Text, Alignment, Color, Font
    End With
    
End Sub

標準モジュールには
Public Const bbTimeOutMin = 1
Public Const bbTimeOutMax = 7

RScoreSheetCommanderフォーム内の経過時間を表示するコードです。

            ixRow = ixRow + 1
            For i = bbTimeOutMin To bbTimeOutMax
                .DrawMatrixBox i, ixRow, 1, 1
                
                If mp.Game.Team(ixTeam).TimeOutted(i) Then
                    .TimeOutMinutes i, ixRow, 1, 1,_
             colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
                Else
                    '「=」ダブルラインを表示する。
                    .DrawMatrixCenterDoubleLine i, ixRow, 1, _
            0.95, colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
                End If
                
            Next

[ツリー表示へ]
タイトルRe: とりあえず、ここまでは出来たんですが・・・
記事No11640
投稿日: 2008/03/04(Tue) 16:57
投稿者
> 1番目から7番目までの順にあるんですが、現状のコードでは時間が
> 経過するごとにコマンドボタンをクリックすると所定の1番目の位置に
> 時間が正しく表示されますが、その後2回目をクリックすると1番目の
> 位置と2番目の所定の位置に両方に経過時間が表示はされるんですが、
> 経過時間は2番目の時間が1番目にも表示されるようになってしまいま
> す。

とりあえず落ち着いて、箇条書きでもいいんで判りやすく説明してください。
少なくとも理想的な正しい動作と現在のおかしい動作の違いがはっきりしないことには…。
 ・表示は7箇所、1番目から順に表示していく。
 ・1回目のボタン押下で1番目の場所に経過時間を表示(他は変化なし?)
 ・2回目のボタン押下で2番目の場所に経過時間を表示(その時1番目の内容は「=」?)
 ・現在は2回目の押下で1番目と2番目両方に同じ経過時間が表示される(1番目に「=」が表示されない?)
ってことでいいんでしょうか?


> Dim A, b, c, d As Integer

これだと d だけInteger型で A b c はVariant型になっちゃいますけど意識されてますか?
別にエラーになったりはしませんがちょっと気になりました。

>             ixRow = ixRow + 1
>             For i = bbTimeOutMin To bbTimeOutMax
>                 .DrawMatrixBox i, ixRow, 1, 1
>                
>                 If mp.Game.Team(ixTeam).TimeOutted(i) Then
>                     .TimeOutMinutes i, ixRow, 1, 1,_
>              colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
>                 Else
>                     '「=」ダブルラインを表示する。
>                     .DrawMatrixCenterDoubleLine i, ixRow, 1, _
>             0.95, colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
>                 End If
>                
>             Next

外にもう一つループがありそうな感じですね。
mp.Game.Team(ixTeam).TimeOutted(i) が False なら
ダブルラインを表示するようですが、このループの過程で
mp.Game.Team(ixTeam).TimeOutted(i) = False は
行われているんでしょうか?

[ツリー表示へ]
タイトルRe^2: とりあえず、ここまでは出来たんですが・・・
記事No11644
投稿日: 2008/03/04(Tue) 17:23
投稿者tea
琴さん、回答をいただき本当にありがとうございます。
わかりずらい説明で大変申し訳ありません。

>  ・表示は7箇所、1番目から順に表示していく。
>  ・1回目のボタン押下で1番目の場所に経過時間を表示(他は変化なし?)
>  ・2回目のボタン押下で2番目の場所に経過時間を表示(その時1番目の内容は「=」?)
>  ・現在は2回目の押下で1番目と2番目両方に同じ経過時間が表示される(1番目に「=」が表示されない?)
> ってことでいいんでしょうか?

表示は7箇所で、1番目から順に7番目まで表示します。
・1回目のボタンをクリックすることで経過時間(例えば「2」)を1番目の場所に
表示します(他は6箇所はダブルラインで埋めます)。
・その後、数十秒後に2回目のボタンをクリックしたら経過時間(例えば「3」)を
2番目の場所に表示します。(他の5箇所はダブルラインです。)

1番目の表示は「2」のはずですが、なぜか1番目の場所と2番目の場所の表示が、
ともに「3」になってしまいます。

ボタンは一定時間内に最大で7回クリックできます。
また、ダブルラインは一定の時間内にボタンをクリックしなかった場合にのみ「ダブ
ルライン」として表示します。

7つの場所の表示の例としては以下のような感じで、数字が入っているものがボタン
をクリックして経過時間を表示したもので、ダブルラインはボタンをクリックしなか
った場合です。
「6」「=」「8」「10」「=」「=」「5」
ですから他に
「=」「=」「1」「=」「2」「=」「=」
などのようになる場合もあり、全くボタンをクリックしなければ7箇所すべてが「=」
もあります。

以下の事項は知りませんでした。
修正しておきます。

> > Dim A, b, c, d As Integer
>
> これだと d だけInteger型で A b c はVariant型になっちゃいますけど意識されてますか?
> 別にエラーになったりはしませんがちょっと気になりました。




> >             ixRow = ixRow + 1
> >             For i = bbTimeOutMin To bbTimeOutMax
> >                 .DrawMatrixBox i, ixRow, 1, 1
> >                
> >                 If mp.Game.Team(ixTeam).TimeOutted(i) Then
> >                     .TimeOutMinutes i, ixRow, 1, 1,_
> >              colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
> >                 Else
> >                     '「=」ダブルラインを表示する。
> >                     .DrawMatrixCenterDoubleLine i, ixRow, 1, _
> >             0.95, colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
> >                 End If
> >                
> >             Next

> 外にもう一つループがありそうな感じですね。

For ixTeam = 0 To 1というのがあります。

> mp.Game.Team(ixTeam).TimeOutted(i) が False なら
> ダブルラインを表示するようですが、このループの過程で
> mp.Game.Team(ixTeam).TimeOutted(i) = False は
> 行われているんでしょうか?

前述の「6」「=」「8」「10」「=」「=」「5」のように
なるはずですので行われています。

あと少しで出来そうなんです。
よろしくお願いします。

[ツリー表示へ]
タイトルRe^3: とりあえず、ここまでは出来たんですが・・・
記事No11645
投稿日: 2008/03/04(Tue) 17:41
投稿者
> Friend Sub TimeOutMinutes(ByVal Col As Single, _
>                            ByVal Row As Single, _
>                            ByVal Cols As Single, _
>                            ByVal Rows As Single, _
>                            Optional ByVal Color As Variant = Empty, _
>                            Optional ByVal Font As Object = Nothing)
> Dim Text As Integer
> Dim A, b, c, d As Integer
> Dim Alignment As EAlignment33
>    
>     b = Game.Setting.QuarterMinutes
>     c = Left(frmMain.vsGameTime.Value / 60, 1)
>  
>     d = b - c
>     mp.A = d
>     Text = mp.A
>        
>     With makeMatrixRect(Col, Row, Cols, Rows)
>         drawText .Left + 0.2, .Top + 0.05, .Right, .Bottom, _
>                  Text, Alignment, Color, Font
>     End With
>    
> End Sub

> 1番目の表示は「2」のはずですが、なぜか1番目の場所と2番目の場所の表示が、
> ともに「3」になってしまいます。

呼び出された TimeOutMinutes の中で経過時間を計算しちゃってますから
1番目に出力する内容と2番目に出力する内容が同じになるのは必然ですかね。

終わった部分は表示に関わらない、または表示箇所が移った時点での経過時間を
どこかに保持しておく等の方法が考えられます。

あとは経過時間の算出部分と表示部分の処理を分けて
算出する必要があるときだけそっちを呼び出すようにするとか。

[ツリー表示へ]
タイトル経過時間の算出部分と表示部分の処理はできました。
記事No11646
投稿日: 2008/03/04(Tue) 19:17
投稿者tea
琴さん、回答をいただき本当にありがとうございます。
ご指摘いただいた経過時間の算出部分と表示部分の処理を分けてみました。

> 終わった部分は表示に関わらない、または表示箇所が移った時点での経過
> 時間をどこかに保持しておく等の方法が考えられます。

上記にある「値の保持」する方法がわかりません。

どうか教えてください。
よろしくお願いします。

Friend Sub TimeOutMinutes(ByVal Col As Single, _
                           ByVal Row As Single, _
                           ByVal Cols As Single, _
                           ByVal Rows As Single, _
                           Optional ByVal Color As Variant = Empty, _
                           Optional ByVal Font As Object = Nothing)
Dim Text As Integer
Dim Alignment As EAlignment33
Dim A As Integer

    Call AnElapsedTime
    
    Text = mp.A
        
    With makeMatrixRect(Col, Row, Cols, Rows)
        drawText .Left + 0.2, .Top + 0.05, .Right, .Bottom, _
            Text, Alignment, Color, Font
    End With
End Sub

'経過時間の計算
Private Sub AnElapsedTime()
Dim Text As Integer
Dim A As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
    
    b = Game.Setting.QuarterMinutes
    c = Left(frmMain.vsGameTime.Value / 60, 1)
    d = b - c
        
    mp.A = d
        
    Text = mp.A
End Sub

[ツリー表示へ]
タイトルRe: 経過時間の算出部分と表示部分の処理はできました。
記事No11648
投稿日: 2008/03/04(Tue) 19:49
投稿者
> ご指摘いただいた経過時間の算出部分と表示部分の処理を分けてみました。
> Friend Sub TimeOutMinutes(ByVal Col As Single, _
>                            ByVal Row As Single, _
>                            ByVal Cols As Single, _
>                            ByVal Rows As Single, _
>                            Optional ByVal Color As Variant = Empty, _
>                            Optional ByVal Font As Object = Nothing)
> Dim Text As Integer
> Dim Alignment As EAlignment33
> Dim A As Integer
>
>     Call AnElapsedTime
>    
>     Text = mp.A
>        
>     With makeMatrixRect(Col, Row, Cols, Rows)
>         drawText .Left + 0.2, .Top + 0.05, .Right, .Bottom, _
>             Text, Alignment, Color, Font
>     End With
> End Sub

これだと結局無条件に計算しちゃうので処理を分けた効果は無いですね。
計算が必要な場合のみ関数が呼び出されるようにしないと。

> 上記にある「値の保持」する方法がわかりません。

ダブルラインの有無を mp.Game.Team(ixTeam).TimeOutted(i) で保持して
判別してたのと同じ様に経過時間も持たせてあげればいいのでは?

[ツリー表示へ]
タイトルRe^2: 経過時間の算出部分と表示部分の処理はできました。
記事No11650
投稿日: 2008/03/05(Wed) 09:33
投稿者tea
琴さん、回答をいただき本当にありがとうございます。

申し訳ありませんが、以下の内容を一晩考えましたが、どうしても
同じように経過時間を持たせるコードがわからないです。
どうか教えてください。
よろしくお願いします。

> ダブルラインの有無を mp.Game.Team(ixTeam).TimeOutted(i) で保持して
> 判別してたのと同じ様に経過時間も持たせてあげればいいのでは?

[ツリー表示へ]
タイトルRe^3: 経過時間の算出部分と表示部分の処理はできました。
記事No11653
投稿日: 2008/03/05(Wed) 11:32
投稿者
> 申し訳ありませんが、以下の内容を一晩考えましたが、どうしても
> 同じように経過時間を持たせるコードがわからないです。

1番目から2番目等、表示個所が切り替わるタイミングで
新しく作った変数 mp.Game.Team(ixTeam).ElapsedTime(i) に
経過時間を入れておけばいいかと。


私なら

・TimeOutMinutes から経過時間の算出部分を関数化(AnElapsedTime)、外に出す。
・TimeOutMinutes に引数を一つ追加(経過時間)、渡された内容を表示するだけの仕組みにする。
・mp.Game.Team(ixTeam) に ElapsedTime(i) 追加。(経過時間保持用)
・実行時に mp.Game.Team(ixTeam).ElapsedTime(i) を -1 等のありえない値で初期化。

と前準備しておいて、

・TimeOutMinutes を呼び出す直前に mp.Game.Team(ixTeam).ElapsedTime(i) をチェック。
 ・-1 ならば AnElapsedTime で経過時間を算出、それを TimeOutMinutes に渡して表示させる。
 ・-1 以外の時間が入っていればそれを TimeOutMinutes に渡して表示させる。
・Buttonが押下されたら、それまでの経過時間を mp.Game.Team(ixTeam).ElapsedTime(i) に収める。

という風に処理させますかね。
思いつきで挙げただけなんで、他にも修正が必要な部分があるかもしれませんが^^;

[ツリー表示へ]
タイトルRe^4: 経過時間の算出部分と表示部分の処理はできました。
記事No11655
投稿日: 2008/03/05(Wed) 14:17
投稿者tea
琴さん、回答をいただき本当にありがとうございます。
ご意見をいただいて私なりに追加したコードは以下ですが、
これを実行すると1回目にコマンドボタンをクリックすると
所定の位置に正しく「経過時間の数字」がでますが、色(赤
もしくは黒)が黒になります。正しくは赤です。
また、その後2回目にコマンドボタンをクリックすると、今
までと同様に2回目の経過時間の数字「3」が1回目の場所に
も表示されます。

実に勘所の悪い私ですが、どうか教えてください。
よろしくお願いします。

標準モジュール内に
Public Const bbTimeMin = 1
Public Const bbTimeMax = 7

Public Enum bbTime
    bbNothingQuarterTimeOutTime = -1
    bbPracticeQuarterTimeOutTime = 0
    bb1QuarterTimeOutTime = 1
    bb2QuarterTimeOutTime = 2
    bb3QuarterTimeOutTime = 3
   bb4QuarterTimeOutTime = 4
    bb5QuarterTimeOutTime = 5
    bbExtraQuarter1TimeOutTime = 6
    bbExtraQuarter2TimeOutTime = 7
    bbEndOfQuarterTimeOutTime = 8
End Enum

Teamクラス内に
Option Explicit
AnElapsedTime(bbTimeMin To bbTimeMax) As Integer

Public Property Get AnElapsedTime(ByVal Index As bbTime) As Integer
    AnElapsedTime = mp.AnElapsedTime(Index)
End Property

Public Property Let AnElapsedTime(ByVal Index As bbTime, _
                ByVal NewValue As Integer)
    With mp
        'NewValueの値に変更'
        .AnElapsedTime(Index) = NewValue
        .IsDirty = True
    End With
End Property

Private Sub clearResultWithoutPlayers()
Dim i As Long

    With mp
        For i = bbTimeOutMin To bbTimeOutMax
            .TimeOutted(i) = False
        Next
        '---新規追加-----------------------------
        For i = bbTimeMin To bbTimeMax
            .AnElapsedTime(i) = False
        Next
        For i = bbQuarterMin To bbQuarterMax
            .QuarterScore(i) = False
            .QuarterFoulCount(i) = False
        Next
        .IsDirty = True
    End With
End Sub

PrintEngineクラス内に
Public Sub TimeOutMinutes(ByVal Col As Single, _
                           ByVal Row As Single, _
                           ByVal Cols As Single, _
                           ByVal Rows As Single, _
                           ByVal Index As bbTime, _
                           Optional ByVal Color As Variant = Empty, _
                           Optional ByVal Font As Object = Nothing)

Dim Text As Integer
Dim A As Integer
Dim Alignment As EAlignment33
    
    Call AnElapsedTime
    
    Text = mp.A
    
    With makeMatrixRect(Col, Row, Cols, Rows)
        drawText .Left + 0.2, .Top + 0.05, .Right, .Bottom, _
            Text, Alignment, Color, Font
    End With
    
End Sub

'経過時間計算
Public Sub AnElapsedTime()
Dim A As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
    
    b = Game.Setting.QuarterMinutes
    c = Left(frmMain.vsGameTime.Value / 60, 1)
    d = b - c
        
    mp.A = d
    
End Sub

RScoresheetCommanderフォーム内に
'チャージドタイムアウトの表示切替。
Private Sub drawTeam(ByVal PE As PrintEngine, _
                     ByVal Left As Single, ByVal Top As Single, _
                     ByVal LeftColWidth As Single, ByVal RightColWidth As Single, ByVal TeamFoulMarginWidth As Single, ByVal TeamFaulColWidth As Single, _
                     ByVal RowHeight As Single, _
                     ByVal TeamMarginHeight As Single)

            ixRow = ixRow + 1
            For i = bbTimeOutMin To bbTimeOutMax
            
                .DrawMatrixBox i, ixRow, 1, 1
                
                If mp.Game.Team(ixTeam).TimeOutted(i) Then
                    If mp.Game.Team(ixTeam).AnElapsedTime(i) <> -1 Then
                        '「経過時間」を表示する-----------------
                        .TimeOutMinutes i, ixRow, 1, 1, _
            colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
                    End If
                Else
                    '「=」ダブルラインを表示する。
                    .DrawMatrixCenterDoubleLine i, ixRow, 1, 0.95, _
                    colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
                End If
            
            Next

[ツリー表示へ]
タイトルRe^5: 経過時間の算出部分と表示部分の処理はできました。
記事No11656
投稿日: 2008/03/05(Wed) 15:24
投稿者
>         '---新規追加-----------------------------
>         For i = bbTimeMin To bbTimeMax
>             .AnElapsedTime(i) = False
>         Next

False は Integer型変数に入れると 0 になったような…。


>                     If mp.Game.Team(ixTeam).AnElapsedTime(i) <> -1 Then
>                         '「経過時間」を表示する-----------------
>                         .TimeOutMinutes i, ixRow, 1, 1, _
>             colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
>                     End If

この条件だと
「初期値(-1)以外が入っている場合に経過時間を表示」
になりますね。
上記の False で初期化してるおかげで結果的に通過してますけど
本来なら一度も入らないんじゃないかな?


ただ実行して結果だけを見るのではなくて、
ブレークポイント(F9)とステップ実行(F8)で想定通りの動作をしているか
ウォッチ/クイックウォッチで想定通りの値が入っているか
確認しながら進めていくとおかしな部分も見つけやすいと思いますよ。

[ツリー表示へ]
タイトルRe^6: 経過時間の算出部分と表示部分の処理はできました。
記事No11660
投稿日: 2008/03/05(Wed) 17:03
投稿者tea
琴さん、回答をいただき本当にありがとうございます。

ブレークポイント(F9)とステップ実行(F8)はわかりますし使っています。
ただ、ウォッチ/クイックウォッチはヘルプを見ましたが何をどうするも
のなのかがよくわかりません。

また、以下のコードを書き換えてみました。

Teamクラス
Private Sub clearResultWithoutPlayers()
Dim i As Long
    With mp
        For i = bbTimeOutMin To bbTimeOutMax
            .TimeOutted(i) = False
        Next
        For i = bbTimeMin To bbTimeMax
           .AnElapsedTime(i) = -1
        Next
        For i = bbQuarterMin To bbQuarterMax
            .QuarterScore(i) = False
            .QuarterFoulCount(i) = False
        Next
        .IsDirty = True
    End With
End Sub

問題のRScoreSheetCommanderクラスは以下のようにしてみましたが、
これだとIf mp.Game.Team(ixTeam).AnElapsedTime(i) = -1 Thenの
(i)が-1ではなく1だった場合でも何故か
.TimeOutMinutes i, ixRow, 1, 1, _
            colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
が作動します。

'経過時間の表示
            ixRow = ixRow + 1
            
            For i = bbTimeOutMin To bbTimeOutMax
            
                .DrawMatrixBox i, ixRow, 1, 1
                
                If mp.Game.Team(ixTeam).TimeOutted(i) Then
                    If mp.Game.Team(ixTeam).AnElapsedTime(i) = -1 Then
                    '「経過時間」を表示する-----------------
                    .TimeOutMinutes i, ixRow, 1, 1, _
            colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
                    ElseIf mp.Game.Team(ixTeam).AnElapsedTime(i) <> -1 Then
                        .TimeOutMinutes i, ixRow, 1, 1, _
            colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
                    End If
                Else
                    '「=」ダブルラインを表示する。
                    .DrawMatrixCenterDoubleLine i, ixRow, 1, 0.95, _
                colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
                End If
            Next

わかりません。
どうか教えてください。
よろしくお願いします。            

[ツリー表示へ]
タイトル色が正しく表示されない問題は解決しました。
記事No11663
投稿日: 2008/03/05(Wed) 17:22
投稿者tea
色の問題だけは解決しました。

引数を各場所が間違っていたため、1つズレていたことがわかりました。

修正後は色の問題は以下のようにしました。
Public Sub TimeOutMinutes(ByVal Col As Single, _
                           ByVal Row As Single, _
                           ByVal Cols As Single, _
                           ByVal Rows As Single, _
                           Optional ByVal Color As Variant = Empty, _
                           Optional ByVal Font As Object = Nothing, _
                           Optional ByVal index As bbTime)←ココの書く位置が間違っていました。

[ツリー表示へ]
タイトルRe^7: 経過時間の算出部分と表示部分の処理はできました。
記事No11665
投稿日: 2008/03/05(Wed) 18:50
投稿者
> ただ、ウォッチ/クイックウォッチはヘルプを見ましたが何をどうするも
> のなのかがよくわかりません。

クイックウォッチはVB6なら「デバッグ」ツールバーにあるメガネのアイコンですね。
デバッグ中に変数の内容が参照できますが…マウスカーソル持っていくだけでも見れるんで
あまり意味はなくなってますねそういえば^^;
ウォッチはウォッチ式を登録すると特定の条件(値が変化したら等)で
動作を中断したりできます。


> これだとIf mp.Game.Team(ixTeam).AnElapsedTime(i) = -1 Thenの
> (i)が-1ではなく1だった場合でも何故か
> .TimeOutMinutes i, ixRow, 1, 1, _
>             colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
> が作動します。

>                     If mp.Game.Team(ixTeam).AnElapsedTime(i) = -1 Then
>                     '「経過時間」を表示する-----------------
>                     .TimeOutMinutes i, ixRow, 1, 1, _
>             colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
>                     ElseIf mp.Game.Team(ixTeam).AnElapsedTime(i) <> -1 Then
>                         .TimeOutMinutes i, ixRow, 1, 1, _
>             colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
>                     End If

If条件で処理分けしてあるものの、その中で呼び出される
TimeOutMinutes の引数が全く同じなので
結果的にどちらの状態でも同じことを行うようになってますね。

[ツリー表示へ]
タイトルRe^8: 経過時間の算出部分と表示部分の処理はできました。
記事No11666
投稿日: 2008/03/05(Wed) 19:52
投稿者tea
琴さん、回答をいただき本当にありがとうございます。

以下のように書き換えました。
ご意見いただいたように引数の最後に「index」と加えましたが、
何も変わりませんでした。
何がいけないんでしょうか?
教えてください。
よろしくお願いします。

RScoreSheetCommanderクラス
Private Sub drawTeam(ByVal PE As PrintEngine, _
                     ByVal Left As Single, ByVal Top As Single, _
                     ByVal LeftColWidth As Single, ByVal RightColWidth As Single, ByVal TeamFoulMarginWidth As Single, ByVal TeamFaulColWidth As Single, _
                     ByVal RowHeight As Single, _
                     ByVal TeamMarginHeight As Single)
'新規追加
Dim index As Integer

'経過時間
            ixRow = ixRow + 1
            
            For i = bbTimeOutMin To bbTimeOutMax
            For index = bbTimeMin To bbTimeMax
                .DrawMatrixBox i, ixRow, 1, 1
                
                If mp.Game.Team(ixTeam).TimeOutted(i) Then
                    If mp.Game.Team(ixTeam).AnElapsedTime(i) <> -1 Then
                        
                        .TimeOutMinutes i, ixRow, 1, 1, _
            colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
                    ElseIf mp.Game.Team(ixTeam).AnElapsedTime(i) = -1 Then
                        .TimeOutMinutes i, ixRow, 1, 1, _
            colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i)), _
             , index
                    End If
                Else
                    '「=」ダブルラインを表示する。
                    .DrawMatrixCenterDoubleLine i, ixRow, 1, 0.95, _
            colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
                End If
            Next
            Next

[ツリー表示へ]
タイトル間違いがありました。訂正します。
記事No11668
投稿日: 2008/03/05(Wed) 22:23
投稿者tea
Dim Index As bbTimeの間違いでした。訂正します。

[ツリー表示へ]
タイトルRe^9: 経過時間の算出部分と表示部分の処理はできました。
記事No11671
投稿日: 2008/03/06(Thu) 10:44
投稿者
> 以下のように書き換えました。
> ご意見いただいたように引数の最後に「index」と加えましたが、
> 何も変わりませんでした。

> '新規追加
> Dim index As Integer
>
> '経過時間
>             ixRow = ixRow + 1
>            
>             For i = bbTimeOutMin To bbTimeOutMax
>             For index = bbTimeMin To bbTimeMax
>                 .DrawMatrixBox i, ixRow, 1, 1
>                
>                 If mp.Game.Team(ixTeam).TimeOutted(i) Then
>                     If mp.Game.Team(ixTeam).AnElapsedTime(i) <> -1 Then
>                        
>                         .TimeOutMinutes i, ixRow, 1, 1, _
>             colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
>                     ElseIf mp.Game.Team(ixTeam).AnElapsedTime(i) = -1 Then
>                         .TimeOutMinutes i, ixRow, 1, 1, _
>             colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i)), _
>              , index
>                     End If
>                 Else
>                     '「=」ダブルラインを表示する。
>                     .DrawMatrixCenterDoubleLine i, ixRow, 1, 0.95, _
>             colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
>                 End If
>             Next
>             Next

index のFor〜Next文が追加されたことで
無条件に合計49回ループすることになってますが
index を渡された TimeOutMinutes ではどういう処理を?

[ツリー表示へ]
タイトルRe^10: 経過時間の算出部分と表示部分の処理はできました。
記事No11673
投稿日: 2008/03/06(Thu) 11:29
投稿者tea
琴さん、回答をいただき本当にありがとうございます。

> index のFor〜Next文が追加されたことで
> 無条件に合計49回ループすることになってますが

表示箇所は計7箇所なのでbbTimeMin to bbTimeMaxにしないとindexの値が0か
ら始まってしまうと考えてFor文を入れましたが、確かに意味もなく49回ル
ープするのはおかしいですね。

> index を渡された TimeOutMinutes ではどういう処理を?

引数を加えることは琴さんのご意見で理解しましたが、indexを付け加えるこ
とでindexに経過時間の値が入ると考えていました。

間違っているんでしょうね・・・。

本当にわからないんです。
でも、諦めたくないんです。
どうか教えてください。
よろしくお願いします。

[ツリー表示へ]
タイトルRe^11: 経過時間の算出部分と表示部分の処理はできました。
記事No11680
投稿日: 2008/03/06(Thu) 13:39
投稿者
> 引数を加えることは琴さんのご意見で理解しましたが、indexを付け加えるこ
> とでindexに経過時間の値が入ると考えていました。

私がNo11635で挙げたやり方は
TimeOutMinutes の当初の機能(経過時間の算出・表示)から
「経過時間の算出」部分を別の関数(AnElapsedTime)にして
呼び出しも含めて外に出します。

TimeOutMinutes は何番目であるかを気にする必要はなく
新しく追加した引数で渡された経過時間を
指定された位置に指定された色で表示するだけの機能になります。

なので TimeOutMinutes を呼び出す直前に経過時間の算出が必要かを判定して
 ・必要なら AnElapsedTime を呼び出して経過時間を算出して取得
 ・不要なら ElapsedTime(i) に保持している経過時間を取得
あとは取得した経過時間を TimeOutMinutes に渡して表示してもらうという寸法です。

これでより明解なイメージが伝わればいいんですが^^;

[ツリー表示へ]
タイトルRe^12: 経過時間の算出部分と表示部分の処理はできました。
記事No11685
投稿日: 2008/03/06(Thu) 14:43
投稿者tea
琴さん、回答をいただき本当にありがとうございます。

解説していただいた内容を自分なりに解釈してコードを書き換えてみ
ましたが、結果は同じでした・・・。
教えていただいた内容は解釈できるもののコードに出来ません。

また、ブレークポイントを置いてF8で追っていくと、1回目のコマン
ドボタンをクリックすると.AnElapsedTime(i)の値は「1」なのですが
、ElseIf mp.Game.Team(ixTeam).AnElapsedTime(i) = -1 Then
の方を選択して動作します。

どうか教えてください。
よろしくお願いします。


PrintEngneクラス
Public Sub TimeOutMinutes(ByVal Col As Single, _
                           ByVal Row As Single, _
                           ByVal Cols As Single, _
                           ByVal Rows As Single, _
                           Optional ByVal Color As Variant = Empty, _
                           Optional ByVal Font As Object = Nothing, _
                           Optional ByVal index As bbTime)

Dim Text As Integer
Dim A As Integer
Dim Alignment As EAlignment33
    
    Call AnElapsedTime
    
    Text = mp.A
    
    With makeMatrixRect(Col, Row, Cols, Rows)
        drawText .Left + 0.2, .Top + 0.05, .Right, .Bottom, _
            Text, Alignment, Color, Font
    End With
    
End Sub
'チャージドタイムアウト取得時の経過時間計測-------------------------
Public Sub AnElapsedTime()
Dim A As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
    
    b = Game.Setting.QuarterMinutes
    c = Left(frmMain.vsGameTime.Value / 60, 1)
    d = b - c
        
    mp.A = d
    
End Sub

RScoreSheetCommanderクラス
drawTeam

ixRow = ixRow + 1
            
            For i = bbTimeOutMin To bbTimeOutMax
            
                .DrawMatrixBox i, ixRow, 1, 1
                
                If mp.Game.Team(ixTeam).TimeOutted(i) Then
                    If mp.Game.Team(ixTeam).AnElapsedTime(i) <> -1 Then
                        Call .AnElapsedTime

                    ElseIf mp.Game.Team(ixTeam).AnElapsedTime(i) = -1 Then
                        index = mp.Game.Team(ixTeam).AnElapsedTime(i)
                        .TimeOutMinutes i, ixRow, 1, 1, _
            colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i)), _
            , index
                    End If

                    Else
                    '「=」ダブルラインを表示する。
                    .DrawMatrixCenterDoubleLine i, ixRow, 1, 0.95, colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
                End If
            
            Next

[ツリー表示へ]
タイトルRe^13: 経過時間の算出部分と表示部分の処理はできました。
記事No11687
投稿日: 2008/03/06(Thu) 15:30
投稿者
> Public Sub TimeOutMinutes(ByVal Col As Single, _
>                            ByVal Row As Single, _
>                            ByVal Cols As Single, _
>                            ByVal Rows As Single, _
>                            Optional ByVal Color As Variant = Empty, _
>                            Optional ByVal Font As Object = Nothing, _
>                            Optional ByVal index As bbTime)
>
> Dim Text As Integer
> Dim A As Integer
> Dim Alignment As EAlignment33
>    
>     Call AnElapsedTime
>    
>     Text = mp.A
>    
>     With makeMatrixRect(Col, Row, Cols, Rows)
>         drawText .Left + 0.2, .Top + 0.05, .Right, .Bottom, _
>             Text, Alignment, Color, Font
>     End With
>    
> End Sub

表示するために TimeOutMinutes に入ってくる度に
再度 AnElapsedTime で経過時間を求めて
それを表示するようになってますね。
つまり、計算が必要な場合は同じ計算を2度行い、
計算が不要な時でも計算してしまっている状態です。
また、追加した index が使用されていないので
引数の内容や有無に関わらず結果は同じになってしまいます。

>                     If mp.Game.Team(ixTeam).AnElapsedTime(i) <> -1 Then
>                         Call .AnElapsedTime
>
>                     ElseIf mp.Game.Team(ixTeam).AnElapsedTime(i) = -1 Then
>                         index = mp.Game.Team(ixTeam).AnElapsedTime(i)
>                         .TimeOutMinutes i, ixRow, 1, 1, _
>             colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i)), _
>             , index
>                     End If

これだと mp.Game.Team(ixTeam).AnElapsedTime(i) <> -1 の時は
経過時間を計算するだけで表示に行かない事になりますね。


> また、ブレークポイントを置いてF8で追っていくと、1回目のコマン
> ドボタンをクリックすると.AnElapsedTime(i)の値は「1」なのですが
> 、ElseIf mp.Game.Team(ixTeam).AnElapsedTime(i) = -1 Then
> の方を選択して動作します。

.AnElapsedTime(i) と i を勘違いしてるってことはないですよね?^^;
もしくは .AnElapsedTime(i) が Boolean型で判定されてるとか?
試しにCInt関数とかで数値型に変換してみてください。

[ツリー表示へ]
タイトルダミーデータは表示可能となりました。
記事No11690
投稿日: 2008/03/06(Thu) 16:24
投稿者tea
琴さん、回答をいただき本当にありがとうございます。
ご指摘いただいた内容を元にコードを書き換えてみましたが、
標準モジュール内にあるダミーデータが初めてPictureBoxに
表示されました。

標準モジュール内
.AnElapsedTime(1) = 2
.AnElapsedTime(2) = 2
.AnElapsedTime(3) = 3
.AnElapsedTime(4) = 4
.AnElapsedTime(5) = 4
.AnElapsedTime(6) = 6
.AnElapsedTime(7) = 0

これでPictureBox内の7箇所の表示は
「2」「2」「3」「4」「4「6」「=」と表示されました。

書き換えたコードは以下ですが、実行すると今度は表示箇所は空白と
なり、2回目以降も空白となります。
ブレークポイントをIf mp.Game.Team(ixTeam).TimeOutted(i) Thenに
置いて「F8」で追っていくとCall .AnElapsedTimeへ進み、次にEnd If
に進みます。

> .AnElapsedTime(i) と i を勘違いしてるってことはないですよね?^^;

このiはFor i = bbTimeOutMin To bbTimeOutMaxのiだと思っているんですが
間違っていますでしょうか?

> 試しにCInt関数とかで数値型に変換してみてください。

これから調べて試してみます。

引き続きどうか教えてください。
よろしくお願いします。

PrintEngneクラス
Public Sub TimeOutMinutes(ByVal Col As Single, _
                           ByVal Row As Single, _
                           ByVal Cols As Single, _
                           ByVal Rows As Single, _
                           Optional ByVal Color As Variant = Empty, _
                           Optional ByVal Font As Object = Nothing, _
                           Optional ByVal Index As bbTime)

Dim Text As Integer
Dim Alignment As EAlignment33
    
  
    Text = Index
    
    With makeMatrixRect(Col, Row, Cols, Rows)
        drawText .Left + 0.2, .Top + 0.05, .Right, .Bottom, _
            Text, Alignment, Color, Font
    End With
    
End Sub

Public Sub AnElapsedTime(Optional ByVal Index As bbTime)
Dim A As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
    
    b = Game.Setting.QuarterMinutes
    c = Left(frmMain.vsGameTime.Value / 60, 1)
    d = b - c
        
    Index = d
    
End Sub

RScoreSheetCommanderクラス
drawteam
ixRow = ixRow + 1
            
            For i = bbTimeOutMin To bbTimeOutMax
            
                .DrawMatrixBox i, ixRow, 1, 1
                
                If mp.Game.Team(ixTeam).TimeOutted(i) Then
                    If mp.Game.Team(ixTeam).AnElapsedTime(i) = -1 Then
                        Call .AnElapsedTime
                        
                    ElseIf mp.Game.Team(ixTeam).AnElapsedTime(i) <> -1 Then
                        Index = mp.Game.Team(ixTeam).AnElapsedTime(i)
                        .TimeOutMinutes i, ixRow, 1, 1, _
                   colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i)), _
            , Index
                    End If

                Else
                    '「=」ダブルラインを表示する。
                    .DrawMatrixCenterDoubleLine i, ixRow, 1, 0.95, _
            colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i))
                End If
            
            Next

[ツリー表示へ]
タイトルRe: ダミーデータは表示可能となりました。
記事No11692
投稿日: 2008/03/06(Thu) 17:06
投稿者
> 書き換えたコードは以下ですが、実行すると今度は表示箇所は空白と
> なり、2回目以降も空白となります。
> ブレークポイントをIf mp.Game.Team(ixTeam).TimeOutted(i) Thenに
> 置いて「F8」で追っていくとCall .AnElapsedTimeへ進み、次にEnd If
> に進みます。

これは

>                     If mp.Game.Team(ixTeam).AnElapsedTime(i) = -1 Then
>                         Call .AnElapsedTime
>                        
>                     ElseIf mp.Game.Team(ixTeam).AnElapsedTime(i) <> -1 Then
>                         Index = mp.Game.Team(ixTeam).AnElapsedTime(i)
>                         .TimeOutMinutes i, ixRow, 1, 1, _
>                    colorByQuarter(mp.Game.Team(ixTeam).TimeOutted(i)), _
>             , Index
>                     End If

この部分で mp.Game.Team(ixTeam).AnElapsedTime(i) = -1 の時には
AnElapsedTime を呼び出すのみで TimeOutMinutes を呼び出していないからですね。

> このiはFor i = bbTimeOutMin To bbTimeOutMaxのiだと思っているんですが
> 間違っていますでしょうか?

その i です。
.AnElapsedTime(i) を確認したつもりで i の内容を見てたわけじゃないですよね?
って意味でした^^;

> Public Sub AnElapsedTime(Optional ByVal Index As bbTime)
> Dim A As Integer
> Dim b As Integer
> Dim c As Integer
> Dim d As Integer
>    
>     b = Game.Setting.QuarterMinutes
>     c = Left(frmMain.vsGameTime.Value / 60, 1)
>     d = b - c
>        
>     Index = d
>    
> End Sub

これだと値渡しの Index に結果を入れてる事になります。
この関数に入る直前と関数最後の End Sub の時点、
関数を出た直後の Index の内容をチェックしてみてください。
おかしいことに気が付くと思います。

[ツリー表示へ]
タイトルキリがないので一旦閉じては
記事No11693
投稿日: 2008/03/06(Thu) 17:07
投稿者花ちゃん
スレッドが、長くなり、見難くなっているので、この辺で一旦このスレッドは
閉じて、一度ご自分で色々試されてから、解らない部分について[質問]されては
いかがですか。

[ツリー表示へ]
タイトルRe: キリがないので一旦閉じては
記事No11694
投稿日: 2008/03/06(Thu) 17:22
投稿者tea
花ちゃんさんのおっしゃるとおりにします。

> スレッドが、長くなり、見難くなっているので、この辺で一旦このスレッドは
> 閉じて、一度ご自分で色々試されてから、解らない部分について[質問]されては
> いかがですか。

[ツリー表示へ]