Visual Basic .net

From ScienceZero
Jump to: navigation, search
<x> means always x
<x|y> means either x or y
{x} means x or nothing
{x|y} means either x or y or nothing

Exit <Do|For> means you can use either Exit Do or Exit For
{Continue Do} means that Continue Do is an optional statement

Contents

Application

Exit the application

Stop 'breakppoint that can be continued in Visual Studio
End  'terminate the application completely

Use this code to make sure any running loops are terminated:

  Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
      End
  End Sub

Events

If your code is not multithreaded you must at a suitable frequency do

Application.DoEvents()

Graphics

Simple pixel plotting

Dim pic As New Bitmap(256, 256)

For y As Integer = 0 To 99
  For x As Integer = 0 To 99
    pic.SetPixel(x, y, Color.Black)
  Next x

  picturebox1.Image = pic
  Application.DoEvents()
Next y

Reading a pixel

Dim pic As New Bitmap(256, 256)
Dim x,y,pixel as UInt32

pixel = pic.GetPixel(x, y).ToArgb

Setting up graphics and drawing pixels, shapes, and colours

Dim bm As New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim gr As Graphics = Graphics.FromImage(bm)
Dim myBrush As Brush
Dim x, y, rectwidth, rectheight as UInt32

bm.SetPixel(10, 10, Color.FromArgb(255, 255, 0, 0))

Dim greenthickpen As New Pen(Color.FromArgb(255, 0, 255, 0), 10)
gr.DrawLine(greenthickpen, 20, 20, 40, 40)

gr.DrawArc(Pens.Blue, 80, 80, 20, 20, 0, 360)

gr.FillPie(Brushes.Black, 150, 150, 20, 20, 0, 360)

Dim rect As Rectangle
rect.Width = 10
rect.Height = 10
rect.X = 200
rect.Y = 200
gr.DrawRectangle(Pens.Black, rect)

myBrush = New SolidBrush(Color.FromArgb(255, 0, 255, 0))
gr.FillRectangle(myBrush, x, y, rectwidth, rectheight)

Dim triangle(2) As Point
triangle(0).X = 5
triangle(0).Y = 0 + 30
triangle(1).X = 0
triangle(1).Y = 5 + 30
triangle(2).X = 10
triangle(2).Y = 5 + 30
gr.FillPolygon(Brushes.Blue, triangle)

PictureBox1.Image = bm

Color.FromArgb(255, 255, 0, 0) is in the format of Alpha, Red, Green, Blue

Copies bitmap named bm into a 1D array called picArray as R,G,B,R,G,B,...

Dim bm As New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim pict2 As New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim gr As Graphics = Graphics.FromImage(bm)
Dim bmdR As System.Drawing.Imaging.BitmapData
Dim picArray() As Byte
Select Case bm.PixelFormat
	Case Imaging.PixelFormat.Format24bppRgb
	'Nothing to do here, this is our native format
	Case Else
	'Convert all other formats to our native format of RGB 8 bit per primary colour
	Pict2 = New Bitmap(bm.Width, bm.Height, Imaging.PixelFormat.Format24bppRgb)
	gr = Graphics.FromImage(Pict2)
		gr.DrawImageUnscaled(bm, 0, 0)
		bm = Pict2
	End Select
bmdR = bm.LockBits(New Rectangle(0, 0, bm.Width, bm.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bm.PixelFormat)
frameSize = bmdR.Stride * bmdR.Height
ReDim picArray(frameSize)
System.Runtime.InteropServices.Marshal.Copy(bmdR.Scan0, picArray, 0, frameSize)
bm.UnlockBits(bmdR)

Clearing the bitmap to a solid colour

gr.Clear(Color.Black)


Loading an image file into a picture box

PictureBox1.Image = New Bitmap("C:\path\somepic.jpg")

Note: .jpg .jpeg .gif .bmp .png .tiff .wmf files can also be used

Saving a picture box to an image file

PictureBox1.Image.Save("C:\path\savedpic.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

Note: .jpg .jpeg .gif .bmp .png .tiff .wmf files can also be used
when using other formats, remember to change both the extension and the System.Drawing.Imaging.ImageFormat type

Reading the mouse position within a picture box

   Private Sub PictureBox1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
       Static pic As New Bitmap(PictureBox1.Width, PictureBox1.Height)

       pic.SetPixel(e.X, e.Y, Color.Black)
       PictureBox1.Image = pic
   End Sub


Drawing text on a bitmap (and then into a picture box)

       Dim bm As New Bitmap(PictureBox1.Width, PictureBox1.Height)
       Dim gr As Graphics = Graphics.FromImage(bm)
       Dim XY As Point
       Dim myfont As New Font("Comic Sans MS", 20, FontStyle.Regular)

       XY.X = 0
       XY.Y = 0

       gr.DrawString("Hello", myfont, Brushes.Black, XY)
       PictureBox1.Image = bm


Determining the width and height of text

       Dim Textwidth, Textheight as Uint32
       Dim Textsize As Size
       Dim myfont As New Font("Comic Sans MS", 20, FontStyle.Regular)

       Textsize = TextRenderer.MeasureText("sample text", myfont)
       Textwidth = Textsize.Width
       Textheight = Textsize.Height


Loading a graphics file into a bitmap

       Dim bm As Bitmap
       bm = Image.FromFile("mypic.png")


Files

Reading text files line by line

Dim f1 As Long
dim filestring as string
f1 = FreeFile()
FileOpen(f1, "filename.txt", OpenMode.Input)
Do Until EOF(f1)
	filestring=LineInput(f1)
Loop
FileClose(f1)

Note "filename.txt" may be replaced by "C:\some_path\file.txt"
FileOpen(f1, "filename.txt", OpenMode.Input, , OpenShare.Shared) may be used in order to not lock access to the file such that other programs may open it at the same time

Writing text the preferred way (simpler and faster)

My.Computer.FileSystem.WriteAllText(My.Application.Info.DirectoryPath & "\programfile.txt", ProgramTxt.Text, False)

Writing text files line by line

Dim f1 As Long
f1 = FreeFile()
FileOpen(f1, "filename.txt", OpenMode.Output)
Print(f1, "This is line 1")
Print(f1, "This is line 2")
FileClose(f1)

Note: FileOpen(f1, "filename.txt", OpenMode.Output, , OpenShare.Shared) may be used in order to not lock access to the file such that other programs may open it at the same time

loading data files into an array of bytes

Dim oFile As System.IO.FileInfo
oFile = New System.IO.FileInfo("file.dat")
Dim oFileStream As System.IO.FileStream = oFile.OpenRead()
Dim lBytes As Long = oFileStream.Length
If (lBytes > 0) Then
	ReDim fileData(lBytes - 1)
	oFileStream.Read(fileData, 0, lBytes)
End If
oFileStream.Close()

Writing binary files

Dim FS As New IO.FileStream("file.dat", System.IO.FileMode.Create)
Dim BW As New IO.BinaryWriter(FS)
Dim bytevar, bytearray(99) As Byte

BW.Write(bytevar)	'writes a single byte
BW.Write(bytearray)	'writes a whole array of bytes
BW.Write(bytearray,0,100)	'writes 100 bytes of an array starting from position 0

BW.Close()
FS.Close()

Reading Binary Files

Read 1 byte at a time

       Dim FS As New IO.FileStream("filename.bin", System.IO.FileMode.Open)
       Dim BW As New IO.BinaryReader(FS)
       Dim bytevar As Byte
       Dim filelen, i As UInt32

       filelen = BW.BaseStream.Length

       For i = 0 To filelen - 1
           bytevar = BW.ReadByte() 'reads a single byte
       Next

       BW.Close()
       FS.Close()

Read n byte at a time

       Dim FS As New IO.FileStream("filename.bin", System.IO.FileMode.Open)
       Dim BW As New IO.BinaryReader(FS)
       Dim bytearray() As Byte

       bytearray = BW.ReadBytes(100) 'reads 100 bytes
       i = BW.ReadUInt32   'reads 4 bytes

       BW.Close()
       FS.Close()

Read entire file into an array

       Dim bytearray() As Byte
       bytearray = System.IO.File.ReadAllBytes("filename.bin")

Using a "Browse" button

       Dim ofd As New OpenFileDialog
       Dim f1 As Long
       Dim err As Boolean

       If ofd.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
           f1 = FreeFile()
           Try
               FileOpen(f1, ofd.FileName, OpenMode.Input)
           Catch ex As Exception
               MsgBox(ex.Message)
               err = True
           End Try

           If err = False Then
               'read the file here
           End If
       End If
   End Sub

To separate a file path string, see this section

Adding file paths to an array, from a directory

files = System.IO.Directory.GetFiles("c:\somepath", "*.bmp")


A more complex method

       Imports System.IO 'this line MUST be present and at the top of the code

       files = GetFiles("C:\somepath","*.png|*.jpg|*.bmp|*.gif|*.tif", SearchOption.TopDirectoryOnly)

   Private Function GetFiles(ByVal path As String, ByVal searchPattern As String, ByVal SearchOption As SearchOption) As String()
       Dim searchPatterns() = searchPattern.Split("|")
       Dim sp As String
       Dim files As New List(Of String)

       For Each sp In searchPatterns
           files.AddRange(System.IO.Directory.GetFiles(path, sp, SearchOption))
       Next

       files.Sort()
       Return files.ToArray()
   End Function

"*.png|*.jpg|*.bmp|*.gif|*.tif" causes it to search only for these types, use *.* for all.
use the AllDirectories option to include subdirectories

Reading XML files

Imports System.Xml
Imports System.IO

Public Class Form1

   Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
       Dim xDoc As XmlDocument = New XmlDocument()
       'this will create an array called coordinates with 1 entry for every time a tag with the text coordinates is found. Each entry will contain the text between the opening and closing tag of this name
       Dim coordinates As XmlNodeList = xDoc.GetElementsByTagName("coordinates")
       Dim CoordinatesString As String

       xDoc.Load("c:\test.kml")
       CoordinatesString = coordinates(coordinates.Count - 1).InnerXml    'this will load the contents of the last occurrence of the coordinates tag
  End Sub
End Class


Looping though all files in a directory

Imports System.IO

Public Class Form1
   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       Dim dir As String = "e:\frames"
       Dim di As New DirectoryInfo(dir)
       Dim fiArr As FileInfo() = di.GetFiles()
       Dim fri As FileInfo

       For Each fri In fiArr
           PictureBox1.Image = New Bitmap(dir & "\" & fri.Name)
           Application.DoEvents()
           System.Threading.Thread.Sleep(40)
       Next fri
   End Sub
End Class

Counting the number of files in a directory

Dim di As New System.IO.DirectoryInfo(framepath)
Dim frames As UInt32 = di.GetFiles.Count

Arrays

Initialize array in line

Dim words() As String = {"zero", "one", "two"}

.NET collection types

Dictionary

Dim myDict As New Dictionary(Of String, Integer)

myDict.Add("Alice", 25)
myDict.Add("Bob", 32)
myDict.Add("Charlie", 42)

Dim age As Integer = myDict("Bob")
Console.WriteLine("Bob's age is " & age)

If myDict.ContainsKey("Alice") Then Console.WriteLine("Alice is in the dictionary")

For Each kvp As KeyValuePair(Of String, Integer) In myDict
  Console.WriteLine(kvp.Key & " is " & kvp.Value & " years old")
Next

List

Dim myList As New List(Of Integer)

myList.Add(10)
myList.Add(20)
myList.Add(30)

Dim value As Integer = myList(1)
Console.WriteLine("The second value in the list is " & value)

If myList.Contains(20) Then Console.WriteLine("20 is in the list")

For Each val As Integer In myList
  Console.WriteLine("Value: " & val)
Next

BitArray

Dim myBits As New BitArray(8)

myBits(0) = True
myBits(1) = False
myBits(2) = True
myBits(3) = False

Dim bitValue As Boolean = myBits(2)
Console.WriteLine("The third bit is " & bitValue)

myBits.Not()

Dim byteArr(myBits.Length \ 8) As Byte
myBits.CopyTo(byteArr, 0)

Dim binaryStr As String = ""
For Each b As Byte In byteArr
  binaryStr &= Convert.ToString(b, 2).PadLeft(8, "0"c)
Next
Console.WriteLine("BitArray as binary string: " & binaryStr)

HashSet

Dim mySet As New HashSet(Of String) 

mySet.Add("apple")
mySet.Add("banana")
mySet.Add("cherry") 

If mySet.Contains("banana") Then Console.WriteLine("The set contains banana") 

mySet.Add("cherry") 

Dim count As Integer = mySet.Count
Console.WriteLine("The set contains " & count & " unique values")

For Each val As String In mySet
  Console.WriteLine("Value: " & val)
Next


Stack

Dim myStack As New Stack(Of String)

myStack.Push("apple")
myStack.Push("banana")
myStack.Push("cherry")

Dim count As Integer = myStack.Count
Console.WriteLine("The stack has " & count & " items")

Dim poppedItem As String = myStack.Pop()
Console.WriteLine("Popped item: " & poppedItem)

Dim topItem As String = myStack.Peek()
Console.WriteLine("Top item: " & topItem)

While myStack.Count > 0
  Dim item As String = myStack.Pop()
  Console.WriteLine("Popped item: " & item)
End While

Queue

Dim myQueue As New Queue(Of String)
myQueue.Enqueue("apple")
myQueue.Enqueue("banana")
myQueue.Enqueue("cherry")

Dim count As Integer = myQueue.Count
Console.WriteLine("The queue has " & count & " items")

Dim dequeuedItem As String = myQueue.Dequeue()
Console.WriteLine("Dequeued item: " & dequeuedItem)

Dim nextItem As String = myQueue.Peek()
Console.WriteLine("Next item: " & nextItem) 

While myQueue.Count > 0
  Dim item As String = myQueue.Dequeue()
  Console.WriteLine("Dequeued item: " & item)
End While

Increasing maximum size of arrays for 64 bit program on 64 bit OS

Insert this in the configuration file for the project to enable arrays larger than 2GB. The maximum index in any single dimension is 2 147 483 591 (0x7FFFFFC7) for byte arrays and arrays of single-byte structures, and 2 146 435 071 (0X7FEFFFFF) for other types.

 <configuration>
   <runtime>
     <gcAllowVeryLargeObjects enabled="true" />
   </runtime>
 </configuration>

Threading / Parallel

Start a new thread

Dim player As New System.Threading.Thread(AddressOf midiPLayer)

player.Start()
Do
    System.Threading.Thread.Sleep(100)
    Application.DoEvents()
Loop While player.IsAlive

Distribute tasks automatically on all available cores

Imports System.Threading
Imports System.Threading.Tasks

Parallel.For(0, yRes - 1, Function(n) mandelbrotline(n, cr + xr, ci + yr, mandN, xRes, xStp, yStp, picarray))

n will iterate from 0 to yres -1 in no particular order
Requires .net 4 or Parallel extensions on .net 3.5

Loops

See conditional codes for loop checks

Note: large or slow loops may require you to insert an Application.Doevents() to update the window and keep the application responsive, this should generally be done every n loops as running it too frequently will slow things down by spending most of the time updating the window.

Simple loop

Do
  'code to execute several times 
  {Continue Do}  'jump to the top of the loop
  {Exit Do}      'exit the loop
Loop


Do Loop While (run then check)

Do
  'code to loop here
  i = i + 1
Loop While (i < 5)


Do While (check then run)

Do While i < 5
  'code to loop here
  i = i + 1
Loop


For

For i = 0 To 4
  'code to loop here
  {Continue For}  'skips to the next iteration
  {Exit For}      'continues execution after Next
Next

i will step by 1 each loop

For (custom step size)

This example will cause i to increase by 2 on each loop

For i = 0 To 4 step 2
  'code to loop here
Next

For down counting loops, step size must be negative, and variable type must be signed (unless all values are non-zero and positive).

Conditionals

Never compare floating-point variables for equality or assume that any floating-point variable will be accurate to a fixed number of digits without understanding the complexities of rounding and representing real numbers in a digital format.

Wrong: if a = b then ...
Right: if Math.Abs(a - b) < 0.0001 then

If

Equal

if i = 4 Then 'code here

'multiline 
if i = 4 Then
  'code line 1
  'code line 2
End If


Not equal

if i <> 4 Then 'code here


Greater than

if i > 4 Then 'code here


Less than

if i < 4 Then 'code here


Greater than or equal to

if i >= 4 Then 'code here


Less than or equal to

if i <= 4 Then 'code here


If Else

if i = 4 Then 'code here Else 'code here

if i = 4 Then
  'code line 1
  'code line 2
Else
  'code line 1
End If


Select Case

Select Case i
  Case 0
     'this code will run if i=0
     {Exit Select} 'continues execution after End Select
  Case 1
     'this code will run if i=1
  Case 2,3,4
     'this code will run if i is one of 2,3,4
  Case 5 To 10
     'this code will run if i is one of 5,6,7,8,9,10
  Case 11 To 20, is < -1 
     'this code will run if i is 11 to 20 or less than -1
  Case Else
     'this code will run if i didn't match any of the above cases
End Select


Choose

Dim i = 1

Do While i < 5
  MsgBox(Choose(i, "one", "two", "three", "four", "five"))
  i = i + 1 
Loop

Math

General computation

+ Addition
- Subtraction
* Multiplication
/ Division (will round integer divisions)
\ Integer division (rounded down to nearest whole value)
Math.Sqrt(value) Square Root
Math.Pow(x,y) x to the power of y (xy)
Math.Sin(AngleInRadians) Sine
Math.Cos(AngleInRadians) Cosine
Math.Tan(AngleInRadians) Tangent
Math.Floor(x) Rounds x down to an Integer
Math.Ceiling(x) Rounds x up to an Integer

Rounding

Math.Round(3.14159,2)

Rounds to 2 decimal places, giving 3.14

Seperating just the whole part of a number

Int(3.14159)

Gives 3

Seperating just the fractional part of a number

double pi
double frac
pi=Math.PI
frac=pi-Int(pi)

Gives 0.14159

Modulus

This will return the remainder of a division

Dim i, counter as Uint32

For i = 0 to 9
  counter = i Mod 5
Next

This example will cause counter to count from 0 to 4, back to 0, and though to 4 again.

Random integer between 2 values

   Public Function randint(n1 As Long, n2 As Long) As Long
       randint = Int((((n2 + 1) - n1) * Rnd) + n1)
   End Function


Calling Windows API

Performance Counter (high resolution timer)

Public Declare Function QueryPerformanceCounter Lib "kernel32.dll" (ByRef Counter As Long) As Integer
Public Declare Function QueryPerformanceFrequency Lib "kernel32.dll" (ByRef counter As Long) As Integer

Dim curFreq, tStart, tStop As UInt64
QueryPerformanceFrequency(curFreq)
QueryPerformanceCounter(tStart)

...code to be timed...

QueryPerformanceCounter(tStop)
msgbox(CStr(CInt(1 / ((tStop - tStart) / curFreq))) & " Frames per second")


Sending keystrokes to applications

   'Google Earth example with up arrow for 1 second
   Private Const WM_KEYDOWN = &H100
   Private Const WM_KEYUP = &H101
   Private Const VK_SPACE = &H20
   Private Const VK_CONTROL = &H11
   Private Const VK_LEFT = &H25
   Private Const VK_UP = &H26
   Private Const VK_RIGHT = &H27
   Private Const VK_DOWN = &H28

   Declare Auto Function FindWindow Lib "USER32.DLL" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr 'Get a handle to an application window.
   Declare Auto Function SetForegroundWindow Lib "USER32.DLL" (ByVal hWnd As IntPtr) As Boolean        'Activate an application window.
   Private Declare Auto Function SendMessage Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32

   Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
       'Get a handle to the GEarth application. The window class
       'and window name were obtained using the Spy++ (C:\Program Files\Microsoft Visual Studio 12.0\Common7\Tools\spyxx.exe) tool.
       Dim GEarthHandle As IntPtr = FindWindow("QWidget", "Google Earth")

       'Verify that GEarth is a running process.
       If GEarthHandle = IntPtr.Zero Then
           MsgBox("GEarth is not running.")
           Return
       End If

       'Make GEarth the foreground application
       SetForegroundWindow(GEarthHandle)

       SendMessage(GEarthHandle, WM_KEYDOWN, VK_UP, 0&) 'press UP
       System.Threading.Thread.Sleep(1000) '1 second
       SendMessage(GEarthHandle, WM_KEYUP, VK_UP, 0&) 'release UP
   End Sub


RS-232

Setting up a serial port

This may require installation of the System.IO.Ports NuGet package, to do this:
Tools>NuGet Package Manager>Package Manager Console and use the command: NuGet\Install-Package System.IO.Ports -Version 7.0.0

Dim SerialPort1 As New System.IO.Ports.SerialPort

SerialPort1.PortName = "COM1"
SerialPort1.BaudRate = "9600"
SerialPort1.DataBits = 8
SerialPort1.Parity = System.IO.Ports.Parity.None
SerialPort1.StopBits = 1
SerialPort1.Handshake = System.IO.Ports.Handshake.None
SerialPort1.Open()

Adding a combo box with a list of available ports

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       Dim i As Integer

       For i = 0 To My.Computer.Ports.SerialPortNames.Count - 1
           ComboBox1.Items.Add(My.Computer.Ports.SerialPortNames(i))
       Next
   End Sub

   Private Sub btnConnect_Click(sender As Object, e As EventArgs) Handles btnConnect.Click
       SerialPort1.PortName = ComboBox1.SelectedItem
       SerialPort1.Open()
   End Sub

Sending an entire array of bytes

SerialPort1.Write(bytearray, 0, bytearray.Count)

0 indicated the index to start reading the array, bytearray.Count is the number of bytes to transmit.
This operation is incredibly fast compared to looping through the array and sending 1 byte at a time. This is especially useful for high speed serial ports.

Reading a byte

Dim serialbyte as Byte
serialbyte=SerialPort1.ReadByte


Reading n bytes already in the received buffer

Dim serialbytes(n-1) as Byte
SerialPort1.Read(serialbytes,0,n)

This can be used with:

While SerialPort1.BytesToRead < n
beforehand.

Network / Internet

POST text to a PHP program on a WEB server

Imports System.Net
Dim client As WebClient = New WebClient()
Dim encoding As New System.Text.ASCIIEncoding()
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded")
client.UploadData(URL & "net2.php", "POST", encoding.GetBytes("data=" & text))
client.Dispose()


Downloading HTML as a string from a web page

Dim webClient As System.Net.WebClient = New System.Net.WebClient()
Dim result As String

Try
	result = webClient.DownloadString("http://www.google.com")
Catch ex As Exception
	MsgBox(ex.Message)
End Try
If result <> "" Then
	MsgBox(result)
End If


A simple TCP library (client)

Imports System.Net
Imports System.Net.Sockets

Public Class Form1
    Dim tnSocket As Socket
    Dim encText As New System.Text.UTF8Encoding()

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim str As String
	
	Connect("64.94.18.122", 80)
	
	str = "sample string"

	SendBytes(encText.GetBytes(str), str.Length)

	Disconnect()
    End Sub
    

    Public Function Connect(ip As String, port As UInt32) As Int32
        Dim remoteIPAddress As IPAddress
        Dim ep As IPEndPoint
        Dim retval As Int32

        retval = 1
        remoteIPAddress = IPAddress.Parse(ip)
        ep = New IPEndPoint(remoteIPAddress, port)
        tnSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

        Try
            tnSocket.Connect(ep)
            While tnSocket.Connected = False
                Application.DoEvents()
            End While
        Catch oEX As SocketException
            retval = -1
        End Try

        Return retval
    End Function

    Public Function WaitForData() As Int32
        Dim available As Int32

        Do
            Try
                available = tnSocket.Available
            Catch oEX As SocketException
                available = -1
                Exit Do
            End Try
            Application.DoEvents()
        Loop While available = 0

        Return available
    End Function

    Public Function WaitForLength(length As UInt32) As Int32
        Dim available As Int32
        Dim retval As Int32

        retval = 1
        Do
            Try
                available = tnSocket.Available
            Catch oEX As SocketException
                retval = -1
                Exit Do
            End Try
            Application.DoEvents()
        Loop While available <> length

        Return retval
    End Function

    Public Function ReadBytes(databytes() As Byte, length As Int32) As Int32
        Dim retval As Int32

        retval = 1
        Try
            tnSocket.Receive(databytes, length, 0)
        Catch oEX As SocketException
            retval = -1
        End Try

        Return retval
    End Function

    Public Function SendBytes(databytes() As Byte, length As Int32) As Int32
        Dim retval As Int32

        retval = 1
        Try
            tnSocket.Send(databytes, length, SocketFlags.None)
        Catch oEX As SocketException
            retval = -1
        End Try

        Return retval
    End Function

    Public Function Disconnect() As Int32
        Dim retval As Int32

        retval = 1
        Try
            tnSocket.Disconnect(False)
        Catch oEX As SocketException
            retval = -1
        End Try

        Return retval
    End Function
End Class


A simple TCP library (server)

Imports System.Net
Imports System.Net.Sockets

   Dim client As TcpClient
   Dim stream As NetworkStream


   Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
       Dim available As UInt32
       Dim bytes(1023) As Byte

       StartServer(4445)

       Do
           available = WaitForData()
           ReadBytes(bytes, available)
           SendBytes(bytes, available)

           Application.DoEvents()
       Loop
   End Sub


   Private Sub StartServer(port As UInt32)
       'Set the TcpListener on a port
       Dim server As New TcpListener(IPAddress.Any, port)

       'Start listening for client requests.
       server.Start()

       'Enter the listening loop. 
       'Waiting for a connection

       'Perform a blocking call to accept requests.
       While server.Pending = False
           System.Threading.Thread.Sleep(100)
           Application.DoEvents()
       End While

       'You could also user server.AcceptSocket() here. 
       client = server.AcceptTcpClient()
       'Connected!

       'Get a stream object for reading and writing 
       stream = client.GetStream()
   End Sub


   Private Function WaitForData()  'returns the number of available bytes
       Dim available As UInt32

       'Check for available data 
       Do
           available = client.Available
           If available = 0 Then
               System.Threading.Thread.Sleep(10)
               Application.DoEvents()
           End If
       Loop While available = 0

       Return available
   End Function


   Private Function ReadByte()
       Dim data(0) As Byte

       stream.Read(data, 0, 1)

       Return data(0)
   End Function


   Private Sub SendByte(bytevalue As Byte)
       Dim data(0) As Byte

       data(0) = bytevalue

       stream.Write(data, 0, 1)
   End Sub


   Private Sub ReadBytes(bytearray() As Byte, length As UInt32)
       stream.Read(bytearray, 0, length)
   End Sub


   Private Sub SendBytes(bytearray() As Byte, length As UInt32)
       stream.Write(bytearray, 0, length)
   End Sub


   Private Sub CloseConnection()
       client.Close()
   End Sub


Sending UDP packets

   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       Dim endPoint As System.Net.IPEndPoint = New System.Net.IPEndPoint(System.Net.IPAddress.Parse("192.168.0.44"), 9000)
       Dim data() As Byte={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}

       sender = New System.Net.Sockets.UdpClient(9000)

       Do
               sender.Send(data, 20, endPoint)
       Loop
   End Sub


Receiving UDP packets

Private Const port As Integer = 8000                           'Port number to send/recieve data on
Private receivingClient As System.Net.Sockets.UdpClient         'Client for handling incoming data

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim endPoint As System.Net.IPEndPoint = New System.Net.IPEndPoint(System.Net.IPAddress.Any, port) 'Listen for incoming data from any IP address on the specified port
    Dim data(5000) As Byte   'buffer for storing incoming bytes
    Dim bytesavailable, i As UInt32
    receivingClient = New System.Net.Sockets.UdpClient(port)

    Do                                                    'Setup an infinite loop
        Do
            bytesavailable = receivingClient.Available
        Loop While bytesavailable = 0

        data = receivingClient.Receive(endPoint)                     'Receive incoming bytes

        For i = 0 To bytesavailable - 1
            TextBox1.AppendText(data(i).ToString("X2") & " ")
        Next
        Application.DoEvents()
    Loop
End Sub


Conversion

To text

dim var as integer = 1103
var.ToString("D5") -> "01103" (decimal)
var.ToString("F2") -> "1103.00" (with fraction)
var.ToString("x") -> "ff4" (hex)
var.ToString("X") -> "0FF4" (hex)
var.ToString("X4") -> "0FF4" (hex)
Convert.ToString(var, 16) -> "ff4"
Convert.ToString(var, 2) -> "10001001111"
Convert.ToString(var, 2).PadLeft(16, "0") -> "0000010001001111"

From text

Convert.ToInt32("ff4", 16) -> 1103
Convert.ToInt32("11111", 2) -> 31

From an array of bytes to a base data type

Dim n As Single = BitConverter.ToSingle(array, index)

From a base data type to an array of bytes

Dim array As Byte( ) = BitConverter.GetBytes(argument)

Strings

Finding text in a string

New method:

"this is a string".IndexOf("is")

returns (zero based character position number) 5. This function returns -1 when not found.

VB6 method:

InStr("this is a string", "is")

returns (character position number) 6. This function returns 0 when not found.

Using the start of a string

dim str as string
dim outputstr as string
str = "this is a string"
outputstr = str.Substring(0, 4)

Starts at character index 0 (the first character), and reads 4 characters (including the first one), resulting in "this".

Using the middle of a string

dim str as string
dim outputstr as string
str="this is a string"
outputstr=str.Substring(5, 4)

Starts at character index 5 (the 6th character), and reads 4 characters, resulting in "is a".


Using the end of a string

dim str as string
dim outputstr as string
str="this is a string"
outputstr=str1.Substring(str1.Length - 4, 4)

Starts 4 chacters before the end, and reads 4 characters, resulting in "ring".


Getting just the path of a file given the entire path and filename as a string

PathStr.Substring(0, ofd.FileName.LastIndexOf("\")) & "\"


Getting just the file name (with extension) of a file given the entire path and filename as a string

System.IO.Path.GetFileName(PathStr)


Getting just the file name (without extension) of a file given the entire path and filename as a string

System.IO.Path.GetFileNameWithoutExtension(PathStr)


Seperating the values from a time and date string

curtimeanddate = Now
yearstr = DateAndTime.Year(curtimeanddate)
monthstr = DateAndTime.Month(curtimeanddate)
dayofmonthstr = DateAndTime.Day(curtimeanddate)
hourstr = DateAndTime.Hour(curtimeanddate)
minutestr = DateAndTime.Minute(curtimeanddate)
secondstr = DateAndTime.Second(curtimeanddate)

Note: hours are in 24 hour/day.

Converting a string to a number in other locales

n = Single.Parse(text, System.Globalization.NumberFormatInfo.InvariantInfo)

Counting the number of specific characters in a string

n = mystring.Count(Function(c As Char) c = "<")

where "<" is the character to count

Removing whitespace

To remove leading and traling whitespace (this also removes newlines):

myString = myString.Trim()

To remove all whitespaces:

myString = myString.Replace(" ", "")

Time

Getting the current date and time

timeanddatestr=Now

For processing this string, see the Seperating the values from a time and date string section

Getting the number of seconds after midnight (includes fractional seconds)

 Do
     Label1.Text = CStr(Microsoft.VisualBasic.Timer)
     Application.DoEvents()
 Loop


Running code periodically

Timer1.Interval = 1000 'number of milliseconds between calls
Timer1.Enabled = True

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    'your code here to run once a second
End Sub

(must add a timer to the form)

Stopwatch (milliseconds or high frequency ticks)

example 1: timing code

Dim stopWatch As New Stopwatch()

stopWatch.Start()
System.Threading.Thread.Sleep(1000)
stopWatch.Stop()

Dim ts As TimeSpan = stopWatch.Elapsed

msgbox(String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10))


example 2: running code at 10Hz

Dim stopWatch As New Stopwatch

stopWatch.Start()
Do
  While stopWatch.ElapsedMilliseconds < 100
  End While

  'code
  stopWatch.Restart()
Loop


example 3: running code at 2kHz

Dim stopWatch As New Stopwatch
Dim freq, period As Long

freq = stopWatch.Frequency
period = freq / 2000

stopWatch.Start()
Do
  While stopWatch.ElapsedTicks < period
  End While

  'code
  stopWatch.Restart()
Loop


Multimedia

Playing and stopping audio playback from a wave file

To begin playback:

My.Computer.Audio.Play("wavefile.wav", AudioPlayMode.Background)

To stop playback:

My.Computer.Audio.Stop()

Getting the length of a wave file in milliseconds

   Declare Function mciSendString Lib "winmm" Alias "mciSendStringA" (ByVal command As String, ByVal returnValue As System.Text.StringBuilder, ByVal returnLength As Integer, ByVal winHandle As IntPtr) As UInteger
   Public Shared Function GetLength(ByVal fileName As String) As Integer
       Dim lengthBuf As New System.Text.StringBuilder(32)
       mciSendString(String.Format("open ""{0}"" type waveaudio alias wave", fileName), Nothing, 0, IntPtr.Zero)
       mciSendString("status wave length", lengthBuf, lengthBuf.Capacity, IntPtr.Zero)
       mciSendString("close wave", Nothing, 0, IntPtr.Zero)
       Dim lengthInMS As Integer = 0
       Integer.TryParse(lengthBuf.ToString(), lengthInMS)
       Return lengthInMS
   End Function

To use:

GetLength("wavefile.wav")

Datatypes

Keeping variables between calls

Static countervar as Uint32

This will create a persistent variable called countervar

System.ValueTuple

Return more than one value from a function using ValueTuple.

Dim result = Division(50,10)
If result.valid Then MsgBox(result.n)

Private Function Division(x As Int32, y As Int32) As (n As Int32, valid As Boolean)
    If y = 0 Then Return (0, False)
    Return ((x / y), True)
End Function

Creating custom data types (structure)

To set up:

Structure RGBtype
    Dim R As Byte
    Dim G As Byte
    Dim B As Byte
End Structure

To use:

Dim pict(640, 480) As RGBtype
pict(0, 0).R = 100
pict(0, 0).G = 120
pict(0, 0).B = 150
pict(1, 2).R = 200
pict(1, 2).G = 220
pict(1, 2).B = 250
value1 = pict(0, 0).R
value2 = pict(0, 0).G
value3 = pict(0, 0).B
value4 = pict(1, 2).R
value5 = pict(1, 2).G
value6 = pict(1, 2).B

This will result in value1=100, value2=120, value3=150, value4=200, value5=220, value6=250

Datatype information

VB type .net type Size Range
Boolean System.Boolean 4 bytes True or False
Byte System.Byte 1 byte 0 to 255 (unsigned)
SByte System.SByte 1 byte -128 through 127 (signed)
Char System.Char 2 bytes 0 to 65535 (unsigned)
Date System.DateTime 8 bytes January 1, 1 CE to December 31, 9999
Decimal System.Decimal 12 bytes +/-79,228,162,514,264,337,593,543,950,335 with no decimal point; +/-7.9228162514264337593543950335 with 28 places to the right of the decimal; smallest non-zero number is +/-0.0000000000000000000000000001
Double System.Double 8 bytes -1.79769313486231E308 to -4.94065645841247E-324 for negative values; 4.94065645841247E-324 to 1.79769313486232E308 for positive values
Integer System.Int32 4 bytes -2,147,483,648 to 2,147,483,647
UInteger System.UInt32 4 bytes 0 through 4,294,967,295 (unsigned)
Long System.Int64 8 bytes -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
ULong System.UInt64 8 bytes 0 through 18,446,744,073,709,551,615 (1.8...E+19) (unsigned)
Object System.Object (class) 4 bytes Any type can be stored in a variable of type Object
Short System.Int16 2 bytes -32,768 to 32,767
UShort System.UInt16 2 bytes 0 through 65,535 (unsigned)
Single System.Single 4 bytes -3.402823E38 to -1.401298E-45 for negative values; 1.401298E-45 to 3.402823E38 for positive values
String System.String (class) 10 bytes + (2 * string length) 0 to approximately two billion Unicode characters
User-Defined Type (structure) (inherits from System.ValueType) Sum of the sizes of its members Each member of the structure has a range determined by its data type and independent of the ranges of the other members