C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.86333 の関連記事表示

<< 0 | 1 | 2 >>
■86477  Re[3]: ChartのX軸のタイトル表示
□投稿者/ mako -(2018/02/01(Thu) 23:31:53)
    No86471 (shu さん) に返信
    
    お世話になります。
    
    Q1, 8:10〜8:45のデータ部分と10:20〜10:55のデータ無い部分の空白は、もう少し無くならないでしょうか?、
    
    >         For i = 20 To 55        ' 10:20〜10:55
    >             datS = datS + 1
    >             'Uridat(datS).Jikoku = "10:" & Str(i)   '時刻
    >             Uridat(datS).Jikoku = $"10:{i:00}"   '時刻
    >             Uridat(datS).Suu1 = i + 100            '数量1
    >             Uridat(datS).Suu2 = i + 20             '数量2
    >         Next
    
    試しに、上をを下記にでもすると棒グラフも無い空白部分がさらに多くなります。
    
            For i = 20 To 55        ' 14:20〜14:55
                datS = datS + 1
                'Uridat(datS).Jikoku = "14:" & Str(i)   '時刻
                Uridat(datS).Jikoku = $"14:{i:00}"   '時刻
                Uridat(datS).Suu1 = i + 100            '数量1
                Uridat(datS).Suu2 = i + 20             '数量2
            Next
    
    
    Q2, チャートの右端と左端の空白(棒グラフの無い部分)は無くならないでしょうか?
    
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86478  Re[4]: ChartのX軸のタイトル表示
□投稿者/ shu -(2018/02/02(Fri) 09:04:14)
    No86477 (mako さん) に返信
    > ■No86471 (shu さん) に返信
    >
    > お世話になります。
    >
    > Q1, 8:10〜8:45のデータ部分と10:20〜10:55のデータ無い部分の空白は、もう少し無くならないでしょうか?、
    >
    指定した時間間隔でグラフが描画されているので8:45と10:20分の間が空けばそれだけ広がります。
    それが普通のグラフだと思うのですが、何か違うのでしょうか?多分それが当初からmakoさんが回答されていないことだと
    思います。
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86481  Re[4]: ChartのX軸のタイトル表示
□投稿者/ shu -(2018/02/02(Fri) 16:30:41)
    No86477 (mako さん) に返信
    
    時間帯が固まっていれば、その間の間隔は適当でよいということなのだと考えいかのように
    してみましたがどうでしょう?
    
    
    Public Class Form1
        Private Structure datF
            Dim Jikoku As String      '時刻 (実際は "2018/01/30 16:30:00" などの日付も入った文字列)
            Dim Suu1 As Integer       '数量1
            Dim Suu2 As Integer       '数量2
        End Structure
        Dim Uridat(500) As datF
        Dim datS As Integer            '
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ' 1分間隔のサンプルデータをを成
            datS = -1
            For i = 10 To 45    ' 8:10〜8:45
                datS = datS + 1
                'Uridat(datS).Jikoku = "8:" & Str(i)  '時刻
                Uridat(datS).Jikoku = $"8:{i:00}"  '時刻
                Uridat(datS).Suu1 = i * 10           '数量1
                Uridat(datS).Suu2 = i * 5            '数量2
            Next
            For i = 20 To 55        ' 10:20〜10:55
                datS = datS + 1
                'Uridat(datS).Jikoku = "10:" & Str(i)   '時刻
                Uridat(datS).Jikoku = $"10:{i:00}"   '時刻
                Uridat(datS).Suu1 = i + 100            '数量1
                Uridat(datS).Suu2 = i + 20             '数量2
            Next
    
            '====   Chart1   ====
            Dim ds As New DataSet
            Dim dt As New DataTable
            Dim dtRow As DataRow
    
            '列の作成
            With dt.Columns
                .Add("時刻", GetType(String))
                .Add("数量1", GetType(Integer))
                .Add("数量2", GetType(Integer))
            End With
            ds.Tables.Add(dt)
    
            'データのセット
            For i = 0 To datS
                dtRow = ds.Tables(0).NewRow
                dtRow(0) = Uridat(i).Jikoku    '時刻
                dtRow(1) = Uridat(i).Suu1      '数量1
                dtRow(2) = Uridat(i).Suu2      '数量2
                ds.Tables(0).Rows.Add(dtRow)
            Next
    
            'Chart に表示するデータソースを設定
            'Dim min As DateTime = Nothing
            'Dim max As DateTime = Nothing
            Dim min = -1
            Dim max = -1
            Dim intr = 30
            Dim tbl = GetChartDs(ds, intr, min, max)
            Chart1.DataSource = tbl.Select("", "x")
            Chart1.Series.Clear()
            '
            With Chart1.ChartAreas(0)
                With .AxisX
                    '.Minimum = min.ToOADate
                    '.Maximum = max.ToOADate
                    .Minimum = min
                    .Maximum = max
                    '.IntervalType = DataVisualization.Charting.DateTimeIntervalType.Minutes
                    '.Interval = intr
                    .Interval = 5
    
                    For Each row In tbl.Select("", "時刻")
                        Dim null = row.IsNull("数量1")
                        If null Then Continue For
                        Dim d = row.Field(Of Date)("時刻")
                        Dim x = row.Field(Of Integer)("x")
                        With .CustomLabels.Add(x - 2, x + 2, d.ToString("HH:mm"))
                            .RowIndex = 0
                        End With
                    Next
                End With
            End With
    
            Dim ore = Chart1.Series.Add("折れ線")
            With ore
                .ChartType = DataVisualization.Charting.SeriesChartType.Line
                .EmptyPointStyle.SetDefault(True)
                '.XValueMember = "時刻"
                .XValueMember = "x"
                .YValueMembers = "数量1"
            End With
    
            Dim bou = Chart1.Series.Add("棒グラフ")
            With bou
                .ChartType = DataVisualization.Charting.SeriesChartType.Column
                '.XValueMember = "時刻"
                .XValueMember = "x"
                .YValueMembers = "数量2"
            End With
        End Sub
    
        'Private Function GetChartDs(Src As DataSet, IntrMin As Integer,
        '                            ByRef Min As DateTime, ByRef Max As DateTime) As DataTable
        Private Function GetChartDs(Src As DataSet, IntrMin As Integer,
                                    ByRef Min As Integer, ByRef Max As Integer) As DataTable
            Dim ret As New DataTable()
            Min = Nothing
            Max = Nothing
    
            With ret.Columns()
                .Add("x", GetType(Integer))
                .Add("時刻", GetType(DateTime))
                .Add("数量1", GetType(Integer))
                .Add("数量2", GetType(Integer))
            End With
    
            Dim x = 1
            Min = x
            x = 5
            '一番左にスペース
            ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
            Dim isFirst2 = True
            For Each itm In (From r In Src.Tables(0).Select()
                             Let d = Function(s As String) As Date
                                         Dim d2 As Date = Nothing
                                         If Date.TryParseExact(s, {"HH:mm", "HH: mm", "H:m"}, Nothing, Nothing, d2) Then
                                             Return d2
                                         Else
                                             Return CDate(Nothing)
                                         End If
                                     End Function(r.Field(Of String)("時刻"))
                             Let h = d.Hour
                             Order By d
                             Group By h Into rows = Group)
                '間
                If Not isFirst2 Then
                    For i = 1 To 2
                        ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
    
                    Next
                End If
                isFirst2 = False
    
                Dim hour = itm.h
                'Dim min2 As Date = Nothing
                Dim isFirst = True
                For Each rowItm In itm.rows
                    Dim row = rowItm.r
                    Dim d = rowItm.d
                    Dim disp = False
                    'If Min = Nothing OrElse d < Min Then Min = d : disp = True
                    'If Max = Nothing OrElse d > Max Then Max = d
                    'If min2 = Nothing OrElse d < min2 Then min2 = d : disp = True
                    If isFirst Then disp = True : isFirst = False
                    If Not disp Then
                        If d.Minute Mod IntrMin = 0 Then
                            disp = True
                        End If
                    End If
                    If disp Then
                        'ret.Rows.Add(d, row("数量1"), row("数量2"))
                        ret.Rows.Add(x, d, row("数量1"), row("数量2"))
                        x += 5
                    End If
                Next
            Next
            Max = x
    
            'If Min <> Nothing Then
            '    Min = Min.AddMinutes(-(Min.Minute Mod IntrMin) - IntrMin * 2)
            'End If
            'If Max <> Nothing Then
            '    Max = Max.AddMinutes(-(Max.Minute Mod IntrMin) + IntrMin * 2)
            'End If
    
            'Dim d1 As Date = Min
            'For Each row In ret.Select("", "時刻")
            '    Dim d2 = row.Field(Of Date)("時刻")
            '    Do While d1 < d2
            '        ret.Rows.Add(d1, DBNull.Value, DBNull.Value)
            '        d1 = d1.AddMinutes(IntrMin)
            '    Loop
            '    d1 = d2.AddMinutes(IntrMin)
            'Next
            ret.AcceptChanges()
    
            Return ret
        End Function
    
    End Class
    
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86484  Re[5]: ChartのX軸のタイトル表示
□投稿者/ mako -(2018/02/05(Mon) 12:17:28)
    No86481 (shu さん) に返信
    
    お世話になります。
    
    下記のような 10:20〜11:55 間は連続したサンプルデータがあったとします。
    この場合はグラフも空白のない連続したものにはならないでしょうか?
    
    また 8:10 の左の空白も要らないと言うことになります。
    
    それと 2018/01/04〜2018/02/05 などと日付のデータの場合にも同様に使用が出来ますように。
    
    
            ' 8:10〜8:45           
            For i = 10 To 45        ' 8:10〜8:45
                datS = datS + 1
                Uridat(datS).Jikoku = $"8:{i:00}"    '時刻
                Uridat(datS).Suu1 = i * 10           '数量1
                Uridat(datS).Suu2 = i * 5            '数量2  
            Next
    
            ' 10:20〜11:55
            For i = 0 To 59        ' 10:20〜10:59
                datS = datS + 1
                Uridat(datS).Jikoku = $"10:{i:00}"     '時刻
                Uridat(datS).Suu1 = i + 100            '数量1
                Uridat(datS).Suu2 = i + 20             '数量2
            Next
            For i = 0 To 55        ' 11:00〜11:55
                datS = datS + 1
                Uridat(datS).Jikoku = $"11:{i:00}"     '時刻
                Uridat(datS).Suu1 = i + 100            '数量1
                Uridat(datS).Suu2 = i + 20             '数量2
            Next
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86485  Re[6]: ChartのX軸のタイトル表示
□投稿者/ shu -(2018/02/05(Mon) 12:32:58)
    No86484 (mako さん) に返信
    > ■No86481 (shu さん) に返信
    >
    > お世話になります。
    >
    > 下記のような 10:20〜11:55 間は連続したサンプルデータがあったとします。
    > この場合はグラフも空白のない連続したものにはならないでしょうか?
    その場合は間のデータを作成しないようにするとよいかと思います。


    > また 8:10 の左の空白も要らないと言うことになります。
    minを8:10のところにすると既出の棒グラフが半分になる現象が発生しますがよろしいのでしょうか?
    ぎりぎりにしたいのであればminを調整するとよいです。

    makoさんのやりたいことすべてにお答えすることはこちらが開発することと同じになってしまいます。
    ここで得られた情報をもとに自分なりのコーディングをされるとよいと思います。
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86499  Re[7]: ChartのX軸のタイトル表示
□投稿者/ mako -(2018/02/07(Wed) 07:57:20)
    2018/02/07(Wed) 08:03:41 編集(投稿者)

    No86485 (shu さん) に返信


    連続した時間(分)の最初のデータのみに '*' マークを付けることで、空白の対処活用をすることは出来ないでしょうか?

    Private Structure datF
    Dim Jikoku As String '時刻 (実際は "2018/01/30 16:30:00" などの日付も入った文字列)
    Dim Suu1 As Integer '数量1
    Dim Suu2 As Integer '数量2
    Dim mark As String '連続した時間の最初のデータのみに '*' マークを付ける。
    End Structure
    Dim Uridat(500) As datF
    Dim datS As Integer



    ' 8:10〜8:45
    For i = 10 To 45 ' 8:10〜8:45
    datS = datS + 1
    Uridat(datS).mark = " "
    Uridat(datS).Jikoku = $"8:{i:00}" '時刻
    Uridat(datS).Suu1 = i * 10 '数量1
    Uridat(datS).Suu2 = i * 5 '数量2

    Uridat(datS).mark = " "
    If i = 10 Then
    Uridat(datS).mark = "*" ' "*" マーク
    End If
    Next

    ' 10:20〜11:55
    For i = 0 To 59 ' 10:20〜10:59
    datS = datS + 1
    Uridat(datS).Jikoku = $"10:{i:00}" '時刻
    Uridat(datS).Suu1 = i + 100 '数量1
    Uridat(datS).Suu2 = i + 20 '数量2

    Uridat(datS).mark = " "
    If i = 0 Then
    Uridat(datS).mark = "*" ' "*" マーク
    End If
    Next
    For i = 0 To 55 ' 11:00〜11:55
    datS = datS + 1
    Uridat(datS).Jikoku = $"11:{i:00}" '時刻
    Uridat(datS).Suu1 = i + 100 '数量1
    Uridat(datS).Suu2 = i + 20 '数量2

    Uridat(datS).mark = " "
    Next
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86500  Re[8]: ChartのX軸のタイトル表示
□投稿者/ shu -(2018/02/07(Wed) 08:11:36)
    No86499 (mako さん) に返信
    
    > 
    > 連続した時間(分)の最初のデータのみに '*' マークを付けることで、空白の対処活用をすることは出来ないでしょうか?
    > 
    
    
    スペースを入れるのは先の提示コードの
    '間
                If Not isFirst2 Then
                    For i = 1 To 2
                        ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
    
                    Next
                End If
    この部分なのでその条件のときに実ポイントを追加する前に空白ポイントを追加すればよいです。
    
    
    
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86516  Re[9]: ChartのX軸のタイトル表示
□投稿者/ mako -(2018/02/07(Wed) 16:49:05)
    No86500 (shu さん) に返信

    > スペースを入れるのは先の提示コードの
    > '間
    > If Not isFirst2 Then
    > For i = 1 To 2
    > ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
    >
    > Next
    > End If
    > この部分なのでその条件のときに実ポイントを追加する前に空白ポイントを追加すればよいです。
    >

    すみません。
    それが関係してることは分かってたのですが、さてどう書けばいいのかが分かってません。




記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86518  Re[10]: ChartのX軸のタイトル表示
□投稿者/ shu -(2018/02/07(Wed) 17:03:32)
    No86516 (mako さん) に返信

    >
    > すみません。
    > それが関係してることは分かってたのですが、さてどう書けばいいのかが分かってません。
    >
    例えば
    ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
    ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
    とした場合、どのようになるかわかりますか?
    その状態と実際に行いたいこととの差が何なのかはっきりさせるとなんとかならないでしょうか?
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86520  Re[11]: ChartのX軸のタイトル表示
□投稿者/ mako -(2018/02/07(Wed) 18:36:33)
    No86518 (shu さん) に返信
    
    > 例えば
    >  ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
    >  ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
    > とした場合、どのようになるかわかりますか?
    > その状態と実際に行いたいこととの差が何なのかはっきりさせるとなんとかならないでしょうか?
    
                If Not isFirst2 Then
                    Dim rowItm As Object = Nothing
                    Dim row = rowItm.r
                    Dim d = rowItm.d
                    For i = 1 To 2
                        'ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
                        'ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
                        ret.Rows.Add(x, d, row("数量1"), row("数量2"), row("マーク"))
                    Next
                End If
                isFirst2 = False
    
    この書き方ではおかしいのですよね?
    Dim row = rowItm.r で 「System.NullReferenceException: 'オブジェクト変数または With ブロック変数が設定されていません。」のエラーが出ます。
    
     
    なお、row("マーク") は "*" または " " になるようにしています。
    
            With ret.Columns()
                .Add("x", GetType(Integer))
                .Add("時刻", GetType(DateTime))
                .Add("数量1", GetType(Integer))
                .Add("数量2", GetType(Integer))
                .Add("マーク", GetType(String))
            End With
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86522  Re[12]: ChartのX軸のタイトル表示
□投稿者/ shu -(2018/02/08(Thu) 08:10:01)
    No86520 (mako さん) に返信
    > ■No86518 (shu さん) に返信
    >
    >>例えば
    >> ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
    >> ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
    >>とした場合、どのようになるかわかりますか?
    >>その状態と実際に行いたいこととの差が何なのかはっきりさせるとなんとかならないでしょうか?
    >
    > If Not isFirst2 Then
    > Dim rowItm As Object = Nothing
    > Dim row = rowItm.r
    > Dim d = rowItm.d
    > For i = 1 To 2
    > 'ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
    > 'ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
    > ret.Rows.Add(x, d, row("数量1"), row("数量2"), row("マーク"))
    > Next
    > End If
    > isFirst2 = False
    >
    > この書き方ではおかしいのですよね?
    > Dim row = rowItm.r で 「System.NullReferenceException: 'オブジェクト変数または With ブロック変数が設定されていません。」のエラーが出ます。
    >

    それはどんな処理になりますか?処理内容を考えてプログラムを行わないと動くわけありません。

    私が提示したコードで気になるのが空白部分ということでしたよね?まずは空白いれる処理を外してみて下さい。

    各ポイントの追加前に無条件で空白を入れる処理を行ってみて下さい。

    空白を入れるタイミングを条件を追加することにより制御してみて下さい。

記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86526  Re[13]: ChartのX軸のタイトル表示
□投稿者/ mako -(2018/02/08(Thu) 16:20:27)
    No86522 (shu さん) に返信
    
    今一、分かってなくてすみません。
    
    空白をいれるか否かの処理を、IF文などで row("マーク") の "*" または " " で判断出来ないものかと思ったのですが、
    エラーも出てますのでそもそもテストにしても↓のをここに使ったのは間違いだったのかもしれません。
    
    ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
    ret.Rows.Add(x, d, row("数量1"), row("数量2"), row("マーク"))
    
    
    
    > ■No86520 (mako さん) に返信
    >>■No86518 (shu さん) に返信
    >>
    > >>例えば
    > >> ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
    > >> ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
    > >>とした場合、どのようになるかわかりますか?
    > >>その状態と実際に行いたいこととの差が何なのかはっきりさせるとなんとかならないでしょうか?
    >>
    >>            If Not isFirst2 Then
    >>                Dim rowItm As Object = Nothing
    >>                Dim row = rowItm.r
    >>                Dim d = rowItm.d
    >>                For i = 1 To 2
    >>                    'ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
    >>                    'ret.Rows.Add(x, d, row("数量1"), row("数量2")) : x += 5
    >>                    ret.Rows.Add(x, d, row("数量1"), row("数量2"), row("マーク"))
    >>                Next
    >>            End If
    >>            isFirst2 = False
    >>
    >>この書き方ではおかしいのですよね?
    >>Dim row = rowItm.r で 「System.NullReferenceException: 'オブジェクト変数または With ブロック変数が設定されていません。」のエラーが出ます。
    >>
    > 
    > それはどんな処理になりますか?処理内容を考えてプログラムを行わないと動くわけありません。
    > 
    > 私が提示したコードで気になるのが空白部分ということでしたよね?まずは空白いれる処理を外してみて下さい。
    > 
    > 各ポイントの追加前に無条件で空白を入れる処理を行ってみて下さい。
    > 
    > 空白を入れるタイミングを条件を追加することにより制御してみて下さい。
    > 
    > 
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86528  Re[14]: ChartのX軸のタイトル表示
□投稿者/ shu -(2018/02/08(Thu) 17:23:41)
    No86526 (mako さん) に返信
    
    ポイントの追加は
                    If disp Then
                        'ret.Rows.Add(d, row("数量1"), row("数量2"))
                        ret.Rows.Add(x, d, row("数量1"), row("数量2"))
                        x += 5
                    End If
    ここで行っているので
    これを他に移動すると動作がおかしくなると思います。
    このポイントの追加の前に条件判定で空白を追加すればよい気がします。
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86530  Re[15]: ChartのX軸のタイトル表示
□投稿者/ mako -(2018/02/08(Thu) 23:29:02)
    No86528 (shu さん) に返信
          
          '間
                If Not isFirst2 Then
                    For i = 1 To 2
                        ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
                    Next
                End If
                isFirst2 = False
    
    この部分で 間(空白) を付けてるのですよね?
    なので、 IF文で、row("マーク") が  "*" か " " かの 条件判定が出来ないものかと思ったのです。
    
    もちろんそれに合わせてデータでの  '*' マークも付けるものとして。
    
    
    Public Class Form1
        Private Structure datF
            Dim Jikoku As String      '時刻 (実際は "2018/01/30 16:30:00" などの日付も入った文字列)
            Dim Suu1 As Integer       '数量1
            Dim Suu2 As Integer       '数量2
            Dim mark As String        'とりあえずは連続した時間の最初のデータのみに '*' マークを付ける。
        End Structure
        Dim Uridat(500) As datF
        Dim datS As Integer
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ' 1分間隔のサンプルデータをを成
            datS = -1
    
            ' 8:10〜8:45           
            For i = 10 To 45        ' 8:10〜8:45
                datS = datS + 1
                Uridat(datS).mark = " "
                'Uridat(datS).Jikoku = "8:" & Str(i)  '時刻
                Uridat(datS).Jikoku = $"8:{i:00}"    '時刻
                Uridat(datS).Suu1 = i * 10           '数量1
                Uridat(datS).Suu2 = i * 5            '数量2 
    
                Uridat(datS).mark = " "
                If i = 10 Then
                    Uridat(datS).mark = "*"          ' とりあえずはデータの最初にのみ "*" マーク を付けてみる。
                End If
            Next
    
            ' 10:20〜11:55
            For i = 0 To 59        ' 10:20〜10:59
                datS = datS + 1
                'Uridat(datS).Jikoku = "10:" & Str(i)   '時刻
                Uridat(datS).Jikoku = $"10:{i:00}"     '時刻
                Uridat(datS).Suu1 = i + 100            '数量1
                Uridat(datS).Suu2 = i + 20             '数量2
                Uridat(datS).mark = " "
    
                If i = 0 Then
                    Uridat(datS).mark = "*"            '  とりあえずはデータの最初にのみ "*" マーク を付けてみる。
                End If
            Next
            For i = 0 To 55        ' 11:00〜11:55
                datS = datS + 1
                'Uridat(datS).Jikoku = "11:" & Str(i)   '時刻
                Uridat(datS).Jikoku = $"11:{i:00}"     '時刻
                Uridat(datS).Suu1 = i + 100            '数量1
                Uridat(datS).Suu2 = i + 20             '数量2
    
                Uridat(datS).mark = " "               '  とりあえずはデータの最初ではないので"*" マークは付けないことにする
            Next
    
            '====   Chart1   ====
            Dim ds As New DataSet
            Dim dt As New DataTable
            Dim dtRow As DataRow
    
            '列の作成
            With dt.Columns
                .Add("時刻", GetType(String))
                .Add("数量1", GetType(Integer))
                .Add("数量2", GetType(Integer))
                .Add("マーク", GetType(String))
            End With
            ds.Tables.Add(dt)
    
            'データのセット
            For i = 0 To datS
                dtRow = ds.Tables(0).NewRow
                dtRow(0) = Uridat(i).Jikoku    '時刻
                dtRow(1) = Uridat(i).Suu1      '数量1
                dtRow(2) = Uridat(i).Suu2      '数量2
                dtRow(3) = Uridat(i).mark      'マーク
    
                ds.Tables(0).Rows.Add(dtRow)
            Next
    
            'Chart に表示するデータソースを設定
            Dim min = -1
            Dim max = -1
            Dim intr = 30
            Dim tbl = GetChartDs(ds, intr, min, max)
            Chart1.DataSource = tbl.Select("", "x")
            Chart1.Series.Clear()
            '
            With Chart1.ChartAreas(0)
                With .AxisX
                    .Minimum = min
                    .Maximum = max
                    .Interval = 5
                    For Each row In tbl.Select("", "時刻")
                        Dim null = row.IsNull("数量1")
                        If null Then Continue For
                        Dim d = row.Field(Of Date)("時刻")
                        Dim x = row.Field(Of Integer)("x")
                        With .CustomLabels.Add(x - 2, x + 2, d.ToString("HH:mm"))
                            .RowIndex = 0
                        End With
                    Next
                End With
            End With
    
            Dim ore = Chart1.Series.Add("折れ線")
            With ore
                .ChartType = DataVisualization.Charting.SeriesChartType.Line
                .EmptyPointStyle.SetDefault(True)
                '.XValueMember = "時刻"
                .XValueMember = "x"
                .YValueMembers = "数量1"
            End With
    
            Dim bou = Chart1.Series.Add("棒グラフ")
            With bou
                .ChartType = DataVisualization.Charting.SeriesChartType.Column
                '.XValueMember = "時刻"
                .XValueMember = "x"
                .YValueMembers = "数量2"
            End With
        End Sub
    
        Private Function GetChartDs(Src As DataSet, IntrMin As Integer,
                                    ByRef Min As Integer, ByRef Max As Integer) As DataTable
            Dim ret As New DataTable()
            Min = Nothing
            Max = Nothing
    
            With ret.Columns()
                .Add("x", GetType(Integer))
                .Add("時刻", GetType(DateTime))
                .Add("数量1", GetType(Integer))
                .Add("数量2", GetType(Integer))
                .Add("マーク", GetType(String))
            End With
    
            Dim x = 1
            Min = x
            x = 5
    
            '一番左にスペース
            'ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5   '特に必要はないようにも。
    
            Dim isFirst2 = True
            For Each itm In (From r In Src.Tables(0).Select()
                             Let d = Function(s As String) As Date
                                         Dim d2 As Date = Nothing
                                         If Date.TryParseExact(s, {"HH:mm", "HH: mm", "H:m"}, Nothing, Nothing, d2) Then
                                             Return d2
                                         Else
                                             Return CDate(Nothing)
                                         End If
                                     End Function(r.Field(Of String)("時刻"))
                             Let h = d.Hour
                             Order By d
                             Group By h Into rows = Group)
                '間
                If Not isFirst2 Then
                    For i = 1 To 2
                        ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
                    Next
                End If
                isFirst2 = False
    
                Dim hour = itm.h
                Dim isFirst = True
                For Each rowItm In itm.rows
                    Dim row = rowItm.r
                    Dim d = rowItm.d
                    Dim disp = False
                    If isFirst Then disp = True : isFirst = False
                    If Not disp Then
                        If d.Minute Mod IntrMin = 0 Then
                            disp = True
                        End If
                    End If
    
                    If disp Then
                        ret.Rows.Add(x, d, row("数量1"), row("数量2"))
                        x += 5
                    End If
                Next
            Next
            Max = x
            ret.AcceptChanges()
            Return ret
        End Function
    End Class
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86531  Re[16]: ChartのX軸のタイトル表示
□投稿者/ shu -(2018/02/09(Fri) 00:45:43)
    No86530 (mako さん) に返信

    > ' 8:10〜8:45
    > For i = 10 To 45 ' 8:10〜8:45
    > datS = datS + 1
    > Uridat(datS).mark = " "
    > 'Uridat(datS).Jikoku = "8:" & Str(i) '時刻
    > Uridat(datS).Jikoku = $"8:{i:00}" '時刻
    > Uridat(datS).Suu1 = i * 10 '数量1
    > Uridat(datS).Suu2 = i * 5 '数量2
    >
    > Uridat(datS).mark = " "
    > If i = 10 Then
    > Uridat(datS).mark = "*" ' とりあえずはデータの最初にのみ "*" マーク を付けてみる。
    > End If
    > Next
    >
    > ' 10:20〜11:55
    > For i = 0 To 59 ' 10:20〜10:59
    > datS = datS + 1
    > 'Uridat(datS).Jikoku = "10:" & Str(i) '時刻
    > Uridat(datS).Jikoku = $"10:{i:00}" '時刻
    > Uridat(datS).Suu1 = i + 100 '数量1
    > Uridat(datS).Suu2 = i + 20 '数量2
    > Uridat(datS).mark = " "
    >
    > If i = 0 Then
    > Uridat(datS).mark = "*" ' とりあえずはデータの最初にのみ "*" マーク を付けてみる。
    > End If
    > Next
    > For i = 0 To 55 ' 11:00〜11:55
    > datS = datS + 1
    > 'Uridat(datS).Jikoku = "11:" & Str(i) '時刻
    > Uridat(datS).Jikoku = $"11:{i:00}" '時刻
    > Uridat(datS).Suu1 = i + 100 '数量1
    > Uridat(datS).Suu2 = i + 20 '数量2
    >
    > Uridat(datS).mark = " " ' とりあえずはデータの最初ではないので"*" マークは付けないことにする
    > Next
    >


    一旦上記のサンプルデータ部について
    8:10〜8:45, 10:20〜11:55のデータが1分毎にあって
    8:10, 10:20の*マークのところは時間間隔に関わらず
    プロットしてそこでは左にスペースを設ける
    ということでよろしいでしょうか?

    だとした場合時間順にデータをピックアップして表示するデータのみを抽出
    *がついていたらその前に空白データを追加となるかと思います。

    仮に30分単位のピックアップとして
    8:10
    8:30
    10:20
    10:30
    11:00
    11:30
    の順でピックアップ、ただし8:10と10:20は*がついているのでこれらのデータの直前に空白データを追加
    となるのでデータが追加される順番をかんがえると
    1 空白
    2 8:10
    3 空白
    4 10:20
    5 10:30
    6 11:00
    7 11:30
    となります。

    プログラム的にはサンプルデータを時間順に抽出するループ内でターゲトとなるか確認しながらピックアップしていき
    もしも*がついていたらピックアップデータを追加する前に空白データを追加するという流れになります。
    元の
     '間
    の場所で空白を追加していたのは1時間の開始データ前で空白を追加するという考えで行っていたものなので上記流れには
    合わなくなります。itm.rowsの中の先頭データが*か調べればできなくはないですが先頭データではなく途中に*があった場合でも
    その前には空白を入れても構わないと思うのでこの場所での空白追加はやめて、


    > If disp Then
    > ret.Rows.Add(x, d, row("数量1"), row("数量2"))
    > x += 5
    > End If
    ここの ret.Rows.Add(x, d, row("数量1"), row("数量2"))を行う直前でif判定でrow("Mark")の内容をチェックして
    空白を追加すればよいと思うのです。

    さらにループも時間毎にグループ化する必要がないのでループのネストが不要になります。
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86533  Re[17]: ChartのX軸のタイトル表示
□投稿者/ mako -(2018/02/09(Fri) 14:47:49)
    No86531 (shu さん) に返信
    
    お世話になります。
    
            ' 10:20〜11:55
            'For i = 0 To 59        ' 10:20〜10:59     ’<--- これは間違い
            For i = 20 To 59        ' 10:20〜10:59
                datS = datS + 1
                Uridat(datS).Jikoku = $"10:{i:00}"     '時刻
                Uridat(datS).Suu1 = i + 100            '数量1
                Uridat(datS).Suu2 = i + 20             '数量2
                Uridat(datS).mark = " "
    
                'If i = 0 Then                         ’<--- これは間違い
                If i = 20 Then
                        Uridat(datS).mark = "*"            ' "*" マーク
                End If
            Next
    
    先ず最初に↑のような間違いをしてましたので修正をさせていただきます。
    
    
    > 仮に30分単位のピックアップとして
    > 8:10
    > 8:30
    > 10:20
    > 10:30
    > 11:00
    > 11:30
    > の順でピックアップ、ただし8:10と10:20は*がついているのでこれらのデータの直前に空白データを追加
    > となるのでデータが追加される順番をかんがえると
    > 1 空白      
    > 2 8:10
    > 3 空白
    > 5 10:20
    > 6 10:30
    > 7 11:00
    > 8 11:30
    > となります。
    
    
     1 空白 
     2 8:10
     3 8:30
     3 空白
     4 10:20
     5 10:30
     6 11:00
     7 11:30
     となりますね。
    
    
    >>If disp Then
    >>   ret.Rows.Add(x, d, row("数量1"), row("数量2"))
    >>   x += 5
    >>End If
    > ここの ret.Rows.Add(x, d, row("数量1"), row("数量2"))を行う直前でif判定でrow("Mark")の内容をチェックして
    > 空白を追加すればよいと思うのです。
    
       If row("マーク") = "*" Then
    
       End If
    
    そのようには思うのですが今はこれくらいしか思いつきません(汗;
    
    
    ちなみに、
    何故、*マークを付けたかは、その方がプログラムも簡素化かが出来るのでは?? とも思ったからです。
    
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86534  Re[18]: ChartのX軸のタイトル表示
□投稿者/ shu -(2018/02/09(Fri) 16:02:56)
    No86533 (mako さん) に返信

    >
    > If row("マーク") = "*" Then
    >
    > End If
    >
    > そのようには思うのですが今はこれくらいしか思いつきません(汗;
    >
    row("マーク")はobject型なので文字列化すればその条件でよいと思います。
    その間の記述とどこに書くかだけだと思うのですが何故試してみないのでしょうか?
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86538  Re[19]: ChartのX軸のタイトル表示
□投稿者/ mako -(2018/02/09(Fri) 22:43:47)
    2018/02/16(Fri) 16:49:28 編集(投稿者)
    2018/02/13(Tue) 15:31:00 編集(投稿者)

    この投稿は取り消しにします。
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86580  Re[19]: ChartのX軸のタイトル表示
□投稿者/ mako -(2018/02/16(Fri) 16:46:33)
    No86534 (shu さん) に返信
    
    お世話になります。
    下記のようなことになりましたので投稿させて頂きます。
    
    > row("マーク")はobject型なので文字列化すればその条件でよいと思います。
    取り敢えずその部分は作ってみました。
    
    
    > さらにループも時間毎にグループ化する必要がないのでループのネストが不要になります。
    No86531でのこの部分は結局どうすれば良いのか分かりませんでした。
    
    
    > dtRow(0) = Uridat(i).Jikoku    '時刻
    もしかしてこの時点で先に文字列型から日付型 (Date)に変換しておいた方がプログラムの簡素化には繋がるのでしょうか?
    
    
    なお、↓のプログラムですと、60分を越える120分(1時間)、240分(2時間)などともなると表示は60分と同じともなってしまいます。
    
    Public Class Form1
        Private Structure datF
            Dim Jikoku As String      '時刻 (実際は "2018/01/30 16:30:00" などの日付も入った文字列)
            Dim Suu1 As Integer       '数量1
            Dim Suu2 As Integer       '数量2
            Dim mark As String        '連続した時間の最初のデータのみに '*' マークを付ける。
        End Structure
        Dim Uridat(500) As datF
        Dim datS As Integer
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ' 1分間隔のサンプルデータをを成
            datS = -1
    
            ' 8:10〜8:45           
            For i = 10 To 45        ' 8:10〜8:45
                datS = datS + 1
    
                Uridat(datS).Jikoku = $"8:{i:00}"    '時刻
                Uridat(datS).Suu1 = i * 10           '数量1
                Uridat(datS).Suu2 = i * 5            '数量2 
    
                Uridat(datS).mark = " "
                If i = 10 Then
                    Uridat(datS).mark = ""          ' "*" マーク
                End If
            Next
    
            ' 10:20〜13:59      <------------ 時間を延長
            For i = 20 To 59        ' 10:20〜10:59
                datS = datS + 1
                Uridat(datS).Jikoku = $"10:{i:00}"     '時刻
                Uridat(datS).Suu1 = i + 100            '数量1
                Uridat(datS).Suu2 = i + 20             '数量2
                Uridat(datS).mark = " "
    
                Uridat(datS).mark = " "
                If i = 20 Then
                    Uridat(datS).mark = "*"            ' "*" マーク
                End If
            Next
            For i = 0 To 59        ' 11:00〜11:59
                datS = datS + 1
                Uridat(datS).Jikoku = $"11:{i:00}"     '時刻
                Uridat(datS).Suu1 = i + 100            '数量1
                Uridat(datS).Suu2 = i + 20             '数量2
    
                Uridat(datS).mark = " "
            Next
            For i = 0 To 59        ' 12:00〜12:59
                datS = datS + 1
                Uridat(datS).Jikoku = $"12:{i:00}"     '時刻
                Uridat(datS).Suu1 = i + 100            '数量1
                Uridat(datS).Suu2 = i + 20             '数量2
    
                Uridat(datS).mark = " "
            Next
            For i = 0 To 59        ' 13:00〜13:59
                datS = datS + 1
                Uridat(datS).Jikoku = $"13:{i:00}"     '時刻
                Uridat(datS).Suu1 = i + 100            '数量1
                Uridat(datS).Suu2 = i + 20             '数量2
    
                Uridat(datS).mark = " "
            Next
    
            '====   Chart1   ====
            Dim ds As New DataSet
            Dim dt As New DataTable
            Dim dtRow As DataRow
    
            '列の作成
            With dt.Columns
                .Add("時刻", GetType(String))
                .Add("数量1", GetType(Integer))
                .Add("数量2", GetType(Integer))
                .Add("マーク", GetType(String))
            End With
            ds.Tables.Add(dt)
    
            'データのセット
            For i = 0 To datS
                dtRow = ds.Tables(0).NewRow
                dtRow(0) = Uridat(i).Jikoku    '時刻
                dtRow(1) = Uridat(i).Suu1      '数量1
                dtRow(2) = Uridat(i).Suu2      '数量2
                dtRow(3) = Uridat(i).mark      'マーク
    
                ds.Tables(0).Rows.Add(dtRow)
            Next
    
            'Chart に表示するデータソースを設定
            Dim min = -1
            Dim max = -1
            Dim intr = 30  ' 60  120  240
            Dim tbl = GetChartDs(ds, intr, min, max)
            Chart1.DataSource = tbl.Select("", "x")
            Chart1.Series.Clear()
            '
            With Chart1.ChartAreas(0)
                With .AxisX
                    .Minimum = min
                    .Maximum = max
                    .Interval = 5
                    For Each row In tbl.Select("", "時刻")
                        Dim null = row.IsNull("数量1")
                        If null Then Continue For
                        Dim d = row.Field(Of Date)("時刻")
                        Dim x = row.Field(Of Integer)("x")
                        With .CustomLabels.Add(x - 2, x + 2, d.ToString("HH:mm"))
                            .RowIndex = 0
                        End With
                    Next
                End With
            End With
    
            Dim ore = Chart1.Series.Add("折れ線")
            With ore
                .ChartType = DataVisualization.Charting.SeriesChartType.Line
                .EmptyPointStyle.SetDefault(True)
                '.XValueMember = "時刻"
                .XValueMember = "x"
                .YValueMembers = "数量1"
            End With
    
            Dim bou = Chart1.Series.Add("棒グラフ")
            With bou
                .ChartType = DataVisualization.Charting.SeriesChartType.Column
                '.XValueMember = "時刻"
                .XValueMember = "x"
                .YValueMembers = "数量2"
            End With
        End Sub
    
        Private Function GetChartDs(Src As DataSet, IntrMin As Integer,
                                    ByRef Min As Integer, ByRef Max As Integer) As DataTable
            Dim ret As New DataTable()
            Min = Nothing
            Max = Nothing
    
            With ret.Columns()
                .Add("x", GetType(Integer))
                .Add("時刻", GetType(DateTime))
                .Add("数量1", GetType(Integer))
                .Add("数量2", GetType(Integer))
                .Add("マーク", GetType(String))
            End With
    
            Dim x = 1
            Min = x
            x = 5
    
            '一番左にスペース
            'ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5   '特に必要とはしません。
    
            'Dim isFirst2 = True
            For Each itm In (From r In Src.Tables(0).Select()
                             Let d = Function(s As String) As Date
                                         Dim d2 As Date = Nothing
                                         If Date.TryParseExact(s, {"HH:mm", "HH: mm", "H:m"}, Nothing, Nothing, d2) Then
                                             Return d2
                                         Else
                                             Return CDate(Nothing)
                                         End If
                                     End Function(r.Field(Of String)("時刻"))
                             Let h = d.Hour
                             Order By d
                             Group By h Into rows = Group)
                '間
                'If Not isFirst2 Then
                'For i = 1 To 2
                'ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
                'Next
                'End If
                'isFirst2 = False
    
                Dim hour = itm.h
                Dim isFirst = True
                For Each rowItm In itm.rows
                    Dim row = rowItm.r
                    Dim d = rowItm.d
                    Dim disp = False
                    If isFirst Then disp = True : isFirst = False
                    If Not disp Then
                        If d.Minute Mod IntrMin = 0 Then
                            disp = True
                        End If
                    End If
                    If CType(row("マーク"), String) = "*" Then    'row("マーク")はobject型なので文字列化
                        For i = 1 To 2
                            ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
                        Next
    
                        If disp Then
                            ret.Rows.Add(x, d, row("数量1"), row("数量2"))
                            x += 5
                        End If
                    Else
                        If disp Then
                            ret.Rows.Add(x, d, row("数量1"), row("数量2"))
                            x += 5
                        End If
                    End If
                Next
            Next
            Max = x
            ret.AcceptChanges()
            Return ret
        End Function
    End Class
    
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86586  Re[20]: ChartのX軸のタイトル表示
□投稿者/ shu -(2018/02/18(Sun) 00:14:00)
    No86580 (mako さん) に返信
     
    >>さらにループも時間毎にグループ化する必要がないのでループのネストが不要になります。
    > No86531でのこの部分は結局どうすれば良いのか分かりませんでした。
    hでのGroup化をなくせば
    For Each rowItm In itm.rows
    のループをはずすことが出来ます
    
    
    >>dtRow(0) = Uridat(i).Jikoku    '時刻
    > もしかしてこの時点で先に文字列型から日付型 (Date)に変換しておいた方がプログラムの簡素化には繋がるのでしょうか?
    確かにその通りですが、DataTable dtの定義が
    .Add("時刻", GetType(String))
    となっている部分が実際の実装上不可欠ということであれば変換しても文字列になるので無意味です。
    .Add("時刻", GetType(Date))
    と出来るのであればいみがあります。
    
    
    > 
    > なお、↓のプログラムですと、60分を越える120分(1時間)、240分(2時間)などともなると表示は60分と同じともなってしまいます。
    > 
    >                     If d.Minute Mod IntrMin = 0 Then
    この条件が0分を起点として割ったあまりが0という条件なのでそうなります。
    そういうことであれば起点とする時間からの総分数に対し条件判定を行う必要があります。
    
    
    ループの部分の改良版は以下となります。
    *マークの付くデータが最初に現れないと正常に動作しません。
            Dim tmFirst As Date = Nothing
            For Each rowItm In (From r In Src.Tables(0).Select()
                                Let d = Function(s As String) As Date
                                            Dim d2 As Date = Nothing
                                            If Date.TryParseExact(s, {"HH:mm", "HH: mm", "H:m"}, Nothing, Nothing, d2) Then
                                                Return d2
                                            Else
                                                Return CDate(Nothing)
                                            End If
                                        End Function(r.Field(Of String)("時刻"))
                                Order By d)
    
                Dim row = rowItm.r
                Dim d = rowItm.d
                Dim isMark = CType(row("マーク"), String) = "*"
                Dim disp = isMark
                If isMark Then
                    tmFirst = d.AddMinutes(-tmFirst.Minute)
                Else
                    If CInt(d.Subtract(tmFirst).TotalMinutes) Mod IntrMin = 0 Then
                        disp = True
                    End If
                End If
                If disp Then
                    If CType(row("マーク"), String) = "*" Then
                        For i = 1 To 2
                            ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
                        Next
                    End If
                    ret.Rows.Add(x, d, row("数量1"), row("数量2"))
                    x += 5
                End If
            Next
    
記事No.86333 のレス /過去ログ148より / 関連記事表示
削除チェック/

<前の20件 | 次の20件>

<< 0 | 1 | 2 >>

パスワード/

- Child Tree -