tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルファイルの読み込みについての質問です。
記事No12333
投稿日: 2008/05/22(Thu) 18:53
投稿者tea
以下の項目をファイル書き込み&読み込みに追加しましたが、ファイル
に書き込むことは出来たのですが、追加した項目を読み込むことが出来
ません。
ファイルの読み込みをデバッグしていくと
Case "チャージドタイムアウト1":  .Teams(ixTeam).AnElapsedTime(1) = sValue
の.Teams(ixTeam).AnElapsedTime(1) = sValueの箇所を認識せずに、次の
Case "チャージドタイムアウト2":
へ移動してしまい、追加した項目は以後前述と同様の繰り返しとなります。

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

Option Explicit

Event JournalAfterInsert(ByVal Quarter As BBQuarter, ByVal TopicIndex As Long)

Event JournalAfterDelete(ByVal Quarter As BBQuarter, ByVal TopicIndex As Long, ByVal TeamIndex As Long)

Private Type UGame
    Path As String
    FileName As String
    IsDirty As Boolean

    TournamentTitle As String
    TournamentReferee As String
    TournamentAScorer As String
    TournamentUmpire As String
    TournamentTimekeeper As String
    TournamentScorer As String
    Tournament24Operator As String
    TournamentNo As String
    TournamentDate As Date
    TournamentTimeString As String
    TournamentPlace As String
    
    Setting As GameSetting
    
    Quarter As BBQuarter
    TimeOnQuarter As Date
    
    AnElapsedTime(1 To 7) as bbTime

    Teams(0 To 1) As Team
    
    Journal As Journal
End Type

Private mp As UGame

'書き込み'
Private Sub writeFileRegist()
Dim h As Long
Dim ixTeam As Long
Dim ixPlayer As Long
    
    On Error GoTo ErrHandle
    
    h = FreeFile
    
    Open registFullName() For Output Access Write Lock Read Write As #h
    
    With mp
        Print #h, "大会情報"
        Print #h, "名称:" & .TournamentTitle
        Print #h, "No:" & .TournamentNo
        Print #h, "日付:" & .TournamentDate
        Print #h, "時刻:" & .TournamentTimeString
        Print #h, "場所:" & .TournamentPlace
        Print #h, "クオーター:" & QuarterIndexToText(.Quarter)
        
        With .Setting
            Print #h, "試合ルール"
            Print #h, "ゲーム時間(分):" & .QuarterMinutes
            Print #h, "ショットクロック(秒):" & .ShotClockSecond
            Print #h, "チームファウル(回):" & .TeamFoulMax
            Print #h, "個人ファウル(回):" & .PlayerFoulMax
        End With
        
        For ixTeam = 0 To 1
            With .Teams(ixTeam)
                Print #h, "チーム" & .TeamWideChar
                Print #h, "チーム名:" & .Name
                Print #h, "コーチ名:" & .Coach.Name
                Print #h, "Aコーチ名:" & .ACoach.Name
                
                '以下が追加したコードです。
                Print #h, "チャージドタイムアウト1:" & .AnElapsedTime(1)
                Print #h, "チャージドタイムアウト2:" & .AnElapsedTime(2)
                Print #h, "チャージドタイムアウト3:" & .AnElapsedTime(3)
                Print #h, "チャージドタイムアウト4:" & .AnElapsedTime(4)
                Print #h, "チャージドタイムアウト5:" & .AnElapsedTime(5)
                Print #h, "チャージドタイムアウト6:" & .AnElapsedTime(6)
                Print #h, "チャージドタイムアウト7:" & .AnElapsedTime(7)
                'ここまで

                '繰り返し処理:1人目から最大人数まで'
                For ixPlayer = 1 To bbPlayerMax
                    With .Player(ixPlayer)
                        Print #h, "選手" & CStr(ixPlayer) & ":" _
            & .UniformNumber & "、" & .Name & "、" & _
            IIf(.IsStartingMember, "スターティングメンバー", _
            "") & "、" & IIf(.IsCaptain, "キャプテン", "")
                    End With
                Next
            End With
        Next
    End With
    
    '閉じる'
    Close #h
    Exit Sub

'エラー処理ルーチン'
ErrHandle:
    Close #h
    Exit Sub
End Sub

'ファイルの読み込み
Private Sub readFileRegist()
    'ローカル変数を宣言'
    Dim h As Long, p As Long
    Dim sLine As String, sItem As String, sValue As String, sSection As String
    Dim ixTeam As Long, ixPlayer As Long
    Dim asValuse As Variant
    
    'エラー処理'
    On Error GoTo ErrHandle
    
    '入出力関数'
    h = FreeFile
    
    'ファイルを開いて、ファイルへ入出力できるようにします。書き込み'
    Open registFullName() For Input Access Read Lock Read Write As #h
    With mp
        '繰り返し実行するフロー制御ステートメント&EOF関数'
        Do Until EOF(h)
            Line Input #h, sLine
            
            p = InStr(sLine, ":")
            
            If p = 0 Then
                'sLineを代入'
                sItem = sLine
            'もしくは'
            Else
                sItem = Left(sLine, p - 1)
                
                sValue = Mid(sLine, p + 1)
            End If
            
            Select Case sItem
                Case "大会情報":    sSection = sItem: GoTo NextRegist
                Case "試合ルール":  sSection = sItem: GoTo NextRegist
                Case "チームA":    sSection = sItem: ixTeam = 0: GoTo NextRegist
                Case "チームB":    sSection = sItem: ixTeam = 1: GoTo NextRegist
            End Select
            
            Select Case sSection
                Case "大会情報"
                    Select Case sItem
                        Case "名称":        .TournamentTitle = sValue
                        Case "No":          .TournamentNo = sValue
                        Case "日付":        .TournamentDate = sValue
                        Case "時刻":        .TournamentTimeString = sValue
                        Case "場所":        .TournamentPlace = sValue
                        Case "クオーター":  .Quarter = QuarterTextToIndex(sValue)
                    End Select
                
                Case "試合ルール"
                    Select Case sItem
                        Case "ゲーム時間(分)": .Setting.QuarterMinutes = sValue
                        Case "ショットクロック(秒)": .Setting.ShotClockSecond = sValue
                        Case "チームファウル(回)": .Setting.TeamFoulMax = sValue
                        Case "個人ファウル(回)": .Setting.PlayerFoulMax = sValue
                    End Select
                Case "チームA", "チームB"
                    Select Case sItem
                        Case "チーム名":    .Teams(ixTeam).Name = sValue
                        Case "コーチ名":    .Teams(ixTeam).Coach.Name = sValue
                        Case "Aコーチ名":  .Teams(ixTeam).ACoach.Name = sValue
                        
                        '以下をを追加しました。
                        Case "チャージドタイムアウト1":  .Teams(ixTeam).AnElapsedTime(1) = sValue
                        Case "チャージドタイムアウト2":  .Teams(ixTeam).AnElapsedTime(2) = sValue
                        Case "チャージドタイムアウト3":  .Teams(ixTeam).AnElapsedTime(3) = sValue
                        Case "チャージドタイムアウト4":  .Teams(ixTeam).AnElapsedTime(4) = sValue
                        Case "チャージドタイムアウト5":  .Teams(ixTeam).AnElapsedTime(5) = sValue
                        Case "チャージドタイムアウト6":  .Teams(ixTeam).AnElapsedTime(6) = sValue
                        Case "チャージドタイムアウト7":  .Teams(ixTeam).AnElapsedTime(7) = sValue
                        'ここまで

                        Case Else
                            If Left(sItem, 2) = "選手" Then
                                ixPlayer = Mid(sItem, 3)
                                asValuse = Split(sValue, "、")
                                With .Teams(ixTeam).Player(ixPlayer)
                                    .UniformNumber = asValuse(0)
                                    .Name = asValuse(1)
                                    .IsStartingMember = (asValuse(2) <> "")
                                    .IsCaptain = (asValuse(3) <> "")
                                End With
                            End If
                    End Select
            End Select
'???'
NextRegist:
        Loop
    End With
    
    '閉じる'
    Close #h
    Exit Sub

ErrHandle:
    Close #h
    ErrRaise
    Exit Sub

[ツリー表示へ]
タイトルRe: ファイルの読み込みについての質問です。
記事No12340
投稿日: 2008/05/23(Fri) 10:16
投稿者リル
Select Case sItemの部分で、
sItemが"チャージドタイムアウト1"ではなく、"チャージドタイムアウト2"となっているから、
"チャージドタイムアウト2"の処理になってしまうだけではないですか。

よくデバッグして、最小のソースで投稿したほうがよいですよ。

[ツリー表示へ]
タイトルRe^2: ファイルの読み込みについての質問です。
記事No12343
投稿日: 2008/05/23(Fri) 12:38
投稿者tea
リルさん、回答をいただきまして本当にありがとうございます。
おっしゃるとおりよくデバッグしてみます。

> よくデバッグして、最小のソースで投稿したほうがよいですよ。

[ツリー表示へ]
タイトルRe: ファイルの読み込みについての質問です。
記事No12355
投稿日: 2008/05/23(Fri) 22:04
投稿者Renard
>                 '以下が追加したコードです。
>                 Print #h, "チャージドタイムアウト1:" & .AnElapsedTime(1)
>                 Print #h, "チャージドタイムアウト2:" & .AnElapsedTime(2)
>                 Print #h, "チャージドタイムアウト3:" & .AnElapsedTime(3)
>                 Print #h, "チャージドタイムアウト4:" & .AnElapsedTime(4)
>                 Print #h, "チャージドタイムアウト5:" & .AnElapsedTime(5)
>                 Print #h, "チャージドタイムアウト6:" & .AnElapsedTime(6)
>                 Print #h, "チャージドタイムアウト7:" & .AnElapsedTime(7)
>                 'ここまで
            
>             p = InStr(sLine, ":")
>            
>             If p = 0 Then
>                 'sLineを代入'
>                 sItem = sLine
>             'もしくは'
>             Else
>                 sItem = Left(sLine, p - 1)
>                
>                 sValue = Mid(sLine, p + 1)
>             End If

提示されたコードを見る限り、pは0にしかなりませんね。
なので、ちゃんと文字列の分割ができず、CASE文の条件に適合しないのでしょう。

[ツリー表示へ]
タイトルRe^2: ファイルの読み込みについての質問です。
記事No12356
投稿日: 2008/05/24(Sat) 09:36
投稿者tea
Renardさん、回答をいただきまして本当にありがとうございます。
私はcase文に問題があるのでは?・・・とばかり考えていました。
これから再度見直します。

> 提示されたコードを見る限り、pは0にしかなりませんね。
> なので、ちゃんと文字列の分割ができず、CASE文の条件に適合しないのでしょう。

[ツリー表示へ]
タイトルRe^3: ファイルの読み込みについての質問です。
記事No12367
投稿日: 2008/05/26(Mon) 12:45
投稿者tea
P=0になるために結果的に表示がなされないのは、デバッグで理解
できました。
他もデバッグしてみると、例えば個人ファウルの時は

sLine = "個人ファウル(回):5"
InStr(sLine,":") = 10
p = 10

といった具合でチャージドタイムアウトの場合はp = 0になります。
先ほどの個人ファウルなどで何故p = 10になるのかわかりません。
何か定数でもあるのかと標準モジュール等を探しましたが、そう
いったものはありませんでした。

> > なので、ちゃんと文字列の分割ができず、CASE文の条件に適合しないのでしょう。

できましたら上記の文字列の分割も含めて、教えてください。
よろしくお願いします。

[ツリー表示へ]
タイトル解決しました。
記事No12368
投稿日: 2008/05/26(Mon) 13:30
投稿者tea
簡単な事で解決しました。
問題点は「:」をタイムアウトまでは「全角」になっていて、
タイムアウトからは「半角」にしていたからで、すべてを
「全角の:」にしたら問題なくファイルを読み込むことが出
来ました。

お騒がせしました。
回答してくださったリルさん、Renardさん、本当にありがと
うございました。

[ツリー表示へ]