VB.NET覚書

VB.NETの覚書
[個人メモ] [仕事メモ] [アイデア] [Ruby]
[TIPS] [対応表] [コメント書き方] [.NET Tips] [VB中学校] [VB.NET の入門サイト] [VB.NET コーディング標準 ] [VBレスキュー] [NonSoft]

2016-04-27

構造体 Structure

クラスを作るほどではないデータに便利

arrylistと組み合わせると便利

Public Class Form1

    Private Structure Person
        Public Name As String
        Public Age As Integer
        Public Sub setPerson(ByVal n As String, ByVal a As Integer)
            Name = n
            Age = a
        End Sub
    End Structure

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim list As New ArrayList

        Dim p As Person = New Person

        p.setPerson("John", 15)
        list.Add(p)

        For Each i As Person In list
            MsgBox(i.Name)
        Next

    End Sub
End Class


デリゲートサンプル

https://msdn.microsoft.com/ja-jp/library/ms172880(v=vs.100).aspx

Public Class Form1

    Delegate Function MathOperator(ByVal x As Double, ByVal y As Double) As Double

    Function SubtractNumnber(ByVal x As Double, ByVal y As Double) As Double
        Return x - y
    End Function
    Function AddNumber(ByVal x As Double, ByVal y As Double) As Double
        Return (x + y)
    End Function

    Sub DelegateTest(ByVal x As Double, ByVal op As MathOperator, ByVal y As Double)
        Dim ret As Double

        ret = op.Invoke(x, y)
        MsgBox(ret)

    End Sub


    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        DelegateTest(5, AddressOf AddNumber, 3)
        DelegateTest(9, AddressOf SubtractNumnber, 3)

    End Sub
End Class

http://indori.blog32.fc2.com/blog-entry-1742.html

'----------------------------------------------------
' 
'  ラムダ式
'  
'----------------------------------------------------
Imports System
Class Sample

    '引数が一つのデリゲート
    Delegate Function One(ByVal value As Integer) As String

    Shared Sub Main()

        '変換関数の例
        Dim convert As One = Function(x) (x.ToString())
        Console.WriteLine(convert(1))

        '通常はこちらを使用
        Dim toStr As Func(Of Integer, String) = Function(x) (x.ToString())
        Console.WriteLine(toStr(1))

        '終了
        Console.ReadLine()

    End Sub

End Class

このサンプルはラムダ式の本質がわかりやすいように、自分でデリゲートを定義していますが、通常はライブラリに用意されているSystem.Funcを使用します。

Public Class Form1

    Delegate Function MathOperator(ByVal x As Double, ByVal y As Double) As Double

    Function SubtractNumnber(ByVal x As Double, ByVal y As Double) As Double
        Return x - y
    End Function
    Function AddNumber(ByVal x As Double, ByVal y As Double) As Double
        Return (x + y)
    End Function

    Sub DelegateTest(ByVal x As Double, ByVal op As MathOperator, ByVal y As Double)
        Dim ret As Double

        ret = op.Invoke(x, y)
        MsgBox(ret)

    End Sub

    Dim mul As MathOperator = Function(x As Double, y As Double) x * y



    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        DelegateTest(5, AddressOf AddNumber, 3)
        DelegateTest(9, AddressOf SubtractNumnber, 3)
        DelegateTest(9, mul, 3)

    End Sub
End Class
トラックバック - http://sub.g.hatena.ne.jp/garyo/20160427

2016-04-26

DELEGATE

http://dobon.net/vb/dotnet/process/sleep.html

関数ポインタみたいなもの

Public Class Form1
    Property IsNowProcessing As Boolean = False

    Private Delegate Sub Delegate_重たい処理()

    Private Sub 重たい処理()
        '重たい処理をズラズラと
        '一秒間(1000ミリ秒)停止する
        System.Threading.Thread.Sleep(1000)
    End Sub

    Private Sub CompleteProcess()
        IsNowProcessing = False
    End Sub
    Private Sub BeginWordAppPrintOut()

        If Not IsNowProcessing Then

            IsNowProcessing = True



            Dim d As New Delegate_重たい処理(AddressOf 重たい処理)

            d.BeginInvoke(AddressOf CompleteProcess, d)

        Else

            MsgBox("別の処理をしている可能性があります。", MsgBoxStyle.Information, "")

            Exit Sub

        End If

    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        BeginWordAppPrintOut()
    End Sub
End Class

http://d.hatena.ne.jp/akiramei/20060123/p1

注意

上記を見ての通り、大量にBeginInvokeを行うとTimers.Elapsedが影響を受けます。実はBeginInvokeもElapsedもスレッドプール使用していて、デフォルトで1CPU、1プロセスあたり25スレッドという制限があるためです。なので、BeginInvokeには時間の掛かる処理は行わせるべきではありません。ちなみにコメントアウトしているThreadを使った処理の場合は、スレッドプールを使わないので時は止まりません。(^^;

トラックバック - http://sub.g.hatena.ne.jp/garyo/20160426

2015-11-27

スレッド勉強

http://codezine.jp/article/detail/135

スレッドなしサンプル

Class Class1

    Public Shared Sub Main()
        Console.WriteLine("スタート")
        DoSomething()
        Console.WriteLine("Enterを押して下さい")
        Console.ReadLine()
    End Sub

    Private Shared Sub DoSomething()
        Dim i As Long
        For i = 0 To 1000000000

        Next
        Console.WriteLine("終わりました")
    End Sub

End Class
トラックバック - http://sub.g.hatena.ne.jp/garyo/20151127

2015-11-23

0パディングした16進数変換

整数変数.toString("X2")

http://dobon.net/vb/dotnet/string/inttostring.html

LogLog = LogLog + "USBIO:OUT " & m_byteOutJ1.ToString("X2") & " " & m_byteOutJ2.ToString("X2") & " IN:" & m_byteInJ1.ToString("X2") & " " & m_byteInJ2.ToString("X2") & vbCrLf

トラックバック - http://sub.g.hatena.ne.jp/garyo/20151123

2015-08-31

文字列を時刻に変換

'DateTime値に変換する文字列
Dim s1 As String = "1992/2/16 12:15:12"
'文字列をDateTime値に変換する
Dim dt1 As DateTime = DateTime.Parse(s1)
'結果を表示する
Console.WriteLine(dt1)
'1992/02/16 12:15:12

'時間が省略されている
Dim s2 As String = "1992/2/16"
Dim dt2 As DateTime = DateTime.Parse(s2)
Console.WriteLine(dt2)
'1992/02/16 0:00:00
'時間を省略すると、「0:00:00」となる

'日付が省略されている
Dim s3 As String = "12:15:12"
Dim dt3 As DateTime = DateTime.Parse(s3)
Console.WriteLine(dt3)
'2003/03/12 12:15:12
'日付を省略すると、現在の日付となる

時刻差

Dim startDateTime, endDateTime As DateTime
……
Dim interval AS TimeSpan = endDateTime.Subtract(startDateTime)

TimeSpan構造

 時間,すなわち2つの時刻の差を格納するにはTimeSpan構造体を使う。形式は,「d.hh:mm:ss.ff」で,負の値も取れる。dは日,hhは24時間制の時間,mmは分,ssは秒,ffは1秒未満の端数である。

 TimeSpan型は,時間間隔をタイマ刻みの値で管理する。タイマ刻みは100ナノ秒である。TimeSpan型の値には,TimeSpan.MinValueからTimeSpan.MaxValueまでの範囲の値を格納できる。

 似たデータ型にDateTime値型がある。DateTime値型とTimeSpan値型の違う点は,DateTimeがある瞬間を表し,TimeSpanがある時刻からある時刻までの時間間隔を表すことである。例えばあるDateTime型の値を別のDateTime型の値から減算すると,それら2つの値の時間間隔,つまりTimeSpan型の値を取得できる。また,現在を表すDateTime型の値に正のTimeSpan型の値を加算すると,将来の日付が得られる。

サンプルコードを見る


名前空間
System
対応バージョン
.NET Framework 2.0,1.1,1.0
.NET Compact Framework 2.0,1.0
主なプロパティ
MaxValue
TimeSpanの最大値。この値はプロパティではなく,パブリック・フィールドである。

MinValue
TimeSpanの最小値。この値はプロパティではなく,パブリック・フィールドである。

TicksPerDay
1日分に相当するタイマ刻みの数。すなわち,8640億である。この値はプロパティではなく,パブリック・フィールドである。

TicksPerHour
1時間を表すタイマ刻みの数。すなわち,360億である。この値はプロパティではなく,パブリック・フィールドである。

TicksPerMillisecond
1ミリ秒を表すタイマ刻みの数。すなわち,1万である。この値はプロパティではなく,パブリック・フィールドである。

TicksPerMinute
1分を表すタイマ刻みの数。すなわち,6億である。この値はプロパティではなく,パブリック・フィールドである。

TicksPerSecond
1秒を表すタイマ刻みの数。すなわち,1000万である。この値はプロパティではなく,パブリック・フィールドである。

Zero
0のTimeSpan値。この値はプロパティではなく,パブリック・フィールドである。

Days
TimeSpan構造体が表す時間間隔の日数部分。時間以下の端数は切り捨てられる。

Hours
TimeSpan構造体が表す時間間隔の時間部分。日数部分と,分以下の端数は切り捨てられる。

Milliseconds
TimeSpan構造体が表す時間間隔の,秒未満の端数部分。

Minutes
TimeSpan構造体が表す時間間隔の,分の部分。時間以上と秒以下の端数は切り捨てられる。

Seconds
TimeSpan構造体が表す時間間隔の,秒の部分。分以上と秒未満の端数は切り捨てられる。

Ticks
TimeSpan構造体が表す時間間隔を表すタイマ刻みの数。

TotalDays
TimeSpan構造体が表す時間間隔を日単位で取得する。時間以下は,小数点以下の値として得られる。例えば,「1.5」は1日と12時間を表す。

TotalHours
TimeSpan構造体が表す時間間隔を時間単位で取得する。分以下は,小数点以下の値として得られる。例えば,「25.5」は1日と1時間30分を表す。

TotalMilliseconds
TimeSpan構造体が表す時間間隔をミリ秒単位で取得する。例えば,「12300」は12.3秒を表す。

TotalMinutes
TimeSpan構造体が表す時間間隔を分単位で取得する。例えば,「123.5」は2時間3分30秒を表す。

TotalSeconds
TimeSpan構造体が表す時間間隔を秒単位で取得する。例えば,「123.5」は2分3.5秒を表す。

主なメソッド
Add
引数に指定したTimeSpan型の値を加算する。

Compare
2つのTimeSpan型の値を比較し,両者の関係を示す整数を返す。このメソッドはstaticメソッドで,比較する2つの値を引数に指定する。返り値が-1のときは,第1引数の値が第2引数の値よりも小さい。返り値が0のときは,第1引数の値と第2引数の値が等しい。返り値が1のときは,第1引数の値が第2引数の値よりも大きい。

CompareTo
指定したオブジェクトまたは値型とこのインスタンスとを比較し,これらの相対値を示す値を返す。

Duration
絶対値を表す新しいTimeSpan型の値を返す。

FromDays
引数に指定した日数を表すTimeSpan型の値を返す。時間以下の端数部分は,小数で表す。例えば引数に1.5を指定すると,「1.12:00:00.0」を表す値が得られる。

FromHours
引数に指定した時間数を表すTimeSpan型の値を返す。分以下の端数部分は,小数で表す。例えば引数に25.5を指定すると,「1.01:30:00.0」を表す値が得られる。

FromMilliseconds
引数に指定したミリ秒数を表すTimeSpan型の値を返す。例えば引数に12345を指定すると,「00:00:12.345」を表す値が得られる。

FromMinutes
引数に指定した分数を表すTimeSpan型の値を返す。秒以下の端数部分は,小数で表す。例えば引数に1.5を指定すると,「0.00:01:30.0」を表す値が得られる。

FromSeconds
引数に指定した秒数を表すTimeSpan型の値を返す。秒未満の端数部分は,小数で表す。例えば引数に123.5を指定すると,「0.00:02:03.5」を表す値が得られる。

FromTicks
指定したタイマ刻み値を表すTimeSpan型の値を返す。

Negate
このインスタンスの値と符号が逆の値を格納するTimeSpan型の値を返す。

op_Addition(+演算子)
2つのTimeSpan型の値を加算する。

op_Equality(==演算子)
2つのTimeSpan型の値が等しいかどうかを調べる。

op_GreaterThan(>演算子)
TimeSpan型の値が,もう1つのTimeSpan型の値よりも大きいかどうかを調べる。

op_GreaterThanOrEqual(>=演算子)
TimeSpan型の値が,もう1つのTimeSpan型の値以上かどうかを調べる。

op_Inequality(!=演算子)
2つのTimeSpan型の値が等しくないかどうかを調べる。

op_LessThan(<演算子)
TimeSpan型の値が,もう1つのTimeSpan型の値よりも小さいかどうかを調べる。

op_LessThanOrEqual(<=演算子)
TimeSpan型の値が,もう1つのTimeSpan型の値以下かどうかを調べる。

op_Subtraction(-演算子)
指定したもう1つのTimeSpan型の値から,指定したTimeSpan型の値を減算する。

op_UnaryNegation(-符号)
指定したTimeSpan型の値と符号が逆のTimeSpan型の値を返す。

op_UnaryPlus(+符号)
指定したTimeSpan型の値と同じ値を返す。

Parse
時間を表す文字列を,TimeSpan型の値に変換する。

Subtract
指定したTimeSpan型の値を減算する。

ToString
文字列形式に変換する。
トラックバック - http://sub.g.hatena.ne.jp/garyo/20150831