VB.NET覚書

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

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

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