VB.NET覚書

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

2017-05-19

Event

http://rucio.a.la9.jp/main/dotnet/shokyu/standard49.htm

class


Public Class Class1

    Public Event Pop As EventHandler

    Public Sub DoAnything()

        RaiseEvent Pop(Me, New EventArgs)

    End Sub

End Class
Public Class Form1

    Dim WithEvents Tester1 As New Class1

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

        Tester1.DoAnything()

    End Sub

    Private Sub Tester1_Pop(sender As Object, e As System.EventArgs) Handles Tester1.Pop
        MsgBox("Pop!")
    End Sub

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

2017-05-08

パスからファイル名、拡張子などの情報を取得する

http://dobon.net/vb/dotnet/file/pathclass.html

まずは、パス文字列からいろいろな情報を取得する例を紹介します。指定するパス文字列ファイル(あるいはフォルダ)は、存在している必要はありません。

VB.NET

コードを隠すコード選択

'ディレクトリ名の取得

Console.WriteLine( _

System.IO.Path.GetDirectoryName( _

"C:\My Documents\My Pictures\サンプル.jpg"))

'結果: C:\My Documents\My Pictures

'拡張子の取得

Console.WriteLine( _

System.IO.Path.GetExtension( _

"C:\My Documents\My Pictures\サンプル.jpg"))

'結果: .jpg

'ファイル名の取得

Console.WriteLine( _

System.IO.Path.GetFileName( _

"C:\My Documents\My Pictures\サンプル.jpg"))

'結果: サンプル.jpg

'ファイル名(拡張子なし)の取得

Console.WriteLine _

(System.IO.Path.GetFileNameWithoutExtension( _

"C:\My Documents\My Pictures\サンプル.jpg"))

'結果: サンプル

'ルートディレクトリ名の取得

Console.WriteLine( _

System.IO.Path.GetPathRoot( _

"C:\My Documents\My Pictures\サンプル.jpg"))

'結果: C:\

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

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