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

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

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

全過去ログを検索

<< 0 >>
■6339  Re[1]: XMLとSQLの使い方
□投稿者/ ひろ -(2007/08/08(Wed) 08:59:28)
    「SQL」が SQL Server のことを指しているならごめんなさいですが、

     ・データは「データベース」に入れている
     ・SQLは、RDBMS において、データの操作や定義を行うための問い合わせ言語

    ですよね。

    ご購入された参考書で、XML を多用されていたのは、個人で「データベース」を持っている方は少ないからだと思います。
    例題が何であったかはよく判りませんが、多分 DataSet を使用した例だと思いますがどうでしょう。
    DataSet 自体は、入力データの形式が「データベース」でも、「テキストファイル」でも、「CSVファイル」でも、「XMLファイル」でも何でも良いわけですが、テキストファイルやCSVファイルは取り込む際に何らかの加工が必要となります。
    データベースやXMLファイルは既存の取り込み方法が用意されているので、誰でも(環境的に)取り扱える XML での記述となったのだろうと思います。また、XML ファイルは単なるテキストファイルですので、書籍に載せやすいんでしょうね。

    ですから、優劣の問題ではないと思います。

    XML の利点は、データベースのように環境を必要としません。何せテキストファイルですから。
    メモ帳でも編集できてしまいますし。
    あと、構造がそのまま書かれているので把握しやすいというのがありますが、これは構成やタグ名の付け方のような機がします。
    但し、大量のデータを取り扱うとなると難しいでしょうね。
記事No.6336 のレス /過去ログ17より / 関連記事表示
削除チェック/

■6340  Re[2]: ダイアログでCStatic(PictureBox)の再描画
□投稿者/ Seiren -(2007/08/08(Wed) 09:07:49)
    No6286 (Blue さん) に返信
    > Invalidate(InvalidateRect)はどうでしたか?

    レスありがとうございます。

    ::PostMessage() の後に CStaticGraphに対してInvalidate()を
    実行するように修正したら上手くいきました。

    ::PostMessage( m_hStaticGraphWnd, WM_PAINT, NULL, NULL);
    CWnd *pWnd = CWnd::FromHandle(m_hStaticGraphWnd);
    pWnd->Invalidate(FALSE);

    感謝です。ありがとうございました!
記事No.6284 のレス / END /過去ログ17より / 関連記事表示
削除チェック/

■54198  Re[6]: 画像データからバイト配列
□投稿者/ SUKIYA -(2010/10/08(Fri) 18:43:58)
    shuさん、返信ありがとうございます。
    良く分りました。本件はこれで解決とさせて頂きます。
記事No.54178 のレス / END /過去ログ91より / 関連記事表示
削除チェック/

■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より / 関連記事表示
削除チェック/

■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より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -