Difference between revisions of "Visual Basic .net"
(→Sending UDP packets) |
(→Writing binary files) |
||
(36 intermediate revisions by 2 users not shown) | |||
Line 33: | Line 33: | ||
Application.DoEvents() | Application.DoEvents() | ||
Next y | 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 === | === Setting up graphics and drawing pixels, shapes, and colours === | ||
Line 95: | Line 101: | ||
===Clearing the bitmap to a solid colour=== | ===Clearing the bitmap to a solid colour=== | ||
− | + | ||
gr.Clear(Color.Black) | gr.Clear(Color.Black) | ||
− | + | ||
===Loading an image file into a picture box=== | ===Loading an image file into a picture box=== | ||
− | + | ||
PictureBox1.Image = New Bitmap("C:\path\somepic.jpg") | PictureBox1.Image = New Bitmap("C:\path\somepic.jpg") | ||
− | + | ||
Note: .jpg .jpeg .gif .bmp .png .tiff .wmf files can also be used | Note: .jpg .jpeg .gif .bmp .png .tiff .wmf files can also be used | ||
===Saving a picture box to an image file=== | ===Saving a picture box to an image file=== | ||
− | + | ||
PictureBox1.Image.Save("C:\path\savedpic.jpg", System.Drawing.Imaging.ImageFormat.Jpeg) | 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<br /> | Note: .jpg .jpeg .gif .bmp .png .tiff .wmf files can also be used<br /> | ||
when using other formats, remember to change both the extension and the System.Drawing.Imaging.ImageFormat type | 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=== | ===Reading the mouse position within a picture box=== | ||
− | + | ||
Private Sub PictureBox1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove | 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) | Static pic As New Bitmap(PictureBox1.Width, PictureBox1.Height) | ||
Line 120: | Line 126: | ||
PictureBox1.Image = pic | PictureBox1.Image = pic | ||
End Sub | End Sub | ||
− | + | ||
===Drawing text on a bitmap (and then into a picture box)=== | ===Drawing text on a bitmap (and then into a picture box)=== | ||
− | + | ||
Dim bm As New Bitmap(PictureBox1.Width, PictureBox1.Height) | Dim bm As New Bitmap(PictureBox1.Width, PictureBox1.Height) | ||
Dim gr As Graphics = Graphics.FromImage(bm) | Dim gr As Graphics = Graphics.FromImage(bm) | ||
Line 134: | Line 140: | ||
gr.DrawString("Hello", myfont, Brushes.Black, XY) | gr.DrawString("Hello", myfont, Brushes.Black, XY) | ||
PictureBox1.Image = bm | PictureBox1.Image = bm | ||
− | + | ||
===Determining the width and height of text=== | ===Determining the width and height of text=== | ||
− | + | ||
Dim Textwidth, Textheight as Uint32 | Dim Textwidth, Textheight as Uint32 | ||
Dim Textsize As Size | Dim Textsize As Size | ||
Line 145: | Line 151: | ||
Textwidth = Textsize.Width | Textwidth = Textsize.Width | ||
Textheight = Textsize.Height | Textheight = Textsize.Height | ||
− | + | ||
+ | |||
+ | ===Loading a graphics file into a bitmap=== | ||
+ | |||
+ | Dim bm As Bitmap | ||
+ | bm = Image.FromFile("mypic.png") | ||
+ | |||
==Files== | ==Files== | ||
===Reading text files line by line=== | ===Reading text files line by line=== | ||
− | + | ||
Dim f1 As Long | Dim f1 As Long | ||
dim filestring as string | dim filestring as string | ||
f1 = FreeFile() | f1 = FreeFile() | ||
− | FileOpen(f1, | + | FileOpen(f1, "filename.txt", OpenMode.Input) |
Do Until EOF(f1) | Do Until EOF(f1) | ||
filestring=LineInput(f1) | filestring=LineInput(f1) | ||
Loop | Loop | ||
FileClose(f1) | FileClose(f1) | ||
− | + | ||
− | Note | + | Note "filename.txt" may be replaced by "C:\some_path\file.txt"<br /> |
− | FileOpen(f1, | + | 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<br /> |
===Writing text the preferred way (simpler and faster)=== | ===Writing text the preferred way (simpler and faster)=== | ||
Line 167: | Line 179: | ||
===Writing text files line by line=== | ===Writing text files line by line=== | ||
− | + | ||
Dim f1 As Long | Dim f1 As Long | ||
f1 = FreeFile() | f1 = FreeFile() | ||
− | FileOpen(f1, | + | FileOpen(f1, "filename.txt", OpenMode.Output) |
Print(f1, "This is line 1") | Print(f1, "This is line 1") | ||
Print(f1, "This is line 2") | Print(f1, "This is line 2") | ||
FileClose(f1) | 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<br /> | ||
===loading data files into an array of bytes=== | ===loading data files into an array of bytes=== | ||
− | + | ||
Dim oFile As System.IO.FileInfo | Dim oFile As System.IO.FileInfo | ||
− | oFile = New System.IO.FileInfo( | + | oFile = New System.IO.FileInfo("file.dat") |
Dim oFileStream As System.IO.FileStream = oFile.OpenRead() | Dim oFileStream As System.IO.FileStream = oFile.OpenRead() | ||
Dim lBytes As Long = oFileStream.Length | Dim lBytes As Long = oFileStream.Length | ||
Line 189: | Line 200: | ||
End If | End If | ||
oFileStream.Close() | oFileStream.Close() | ||
− | |||
− | |||
===Writing binary files=== | ===Writing binary files=== | ||
− | + | ||
− | Dim FS As New IO.FileStream( | + | Dim FS As New IO.FileStream("file.dat", System.IO.FileMode.Create) |
Dim BW As New IO.BinaryWriter(FS) | Dim BW As New IO.BinaryWriter(FS) | ||
Dim bytevar, bytearray(99) As Byte | Dim bytevar, bytearray(99) As Byte | ||
Line 204: | Line 213: | ||
BW.Close() | BW.Close() | ||
FS.Close() | FS.Close() | ||
− | |||
===Reading Binary Files=== | ===Reading Binary Files=== | ||
− | + | ====Read 1 byte at a time==== | |
− | Dim FS As New IO.FileStream( | + | Dim FS As New IO.FileStream("filename.bin", System.IO.FileMode.Open) |
Dim BW As New IO.BinaryReader(FS) | Dim BW As New IO.BinaryReader(FS) | ||
Dim bytevar As Byte | Dim bytevar As Byte | ||
− | |||
Dim filelen, i As UInt32 | Dim filelen, i As UInt32 | ||
Line 222: | Line 229: | ||
BW.Close() | BW.Close() | ||
FS.Close() | FS.Close() | ||
− | + | ||
− | FS | + | ====Read n byte at a time==== |
− | BW | + | 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 | bytearray = BW.ReadBytes(100) 'reads 100 bytes | ||
Line 231: | Line 240: | ||
BW.Close() | BW.Close() | ||
FS.Close() | FS.Close() | ||
− | + | ||
+ | ====Read entire file into an array==== | ||
+ | Dim bytearray() As Byte | ||
+ | bytearray = System.IO.File.ReadAllBytes("filename.bin") | ||
===Using a "Browse" button=== | ===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 [[#Getting just the path of a file given the entire path and filename as a string|this section]] | To separate a file path string, see [[#Getting just the path of a file given the entire path and filename as a string|this section]] | ||
− | |||
===Adding file paths to an array, from a directory=== | ===Adding file paths to an array, from a directory=== | ||
− | + | ||
files = System.IO.Directory.GetFiles("c:\somepath", "*.bmp") | files = System.IO.Directory.GetFiles("c:\somepath", "*.bmp") | ||
− | + | ||
A more complex method | A more complex method | ||
− | + | ||
Imports System.IO 'this line MUST be present and at the top of the code | Imports System.IO 'this line MUST be present and at the top of the code | ||
Line 277: | Line 291: | ||
Return files.ToArray() | Return files.ToArray() | ||
End Function | End Function | ||
− | + | ||
"*.png|*.jpg|*.bmp|*.gif|*.tif" causes it to search only for these types, use *.* for all.<br /> | "*.png|*.jpg|*.bmp|*.gif|*.tif" causes it to search only for these types, use *.* for all.<br /> | ||
use the AllDirectories option to include subdirectories | use the AllDirectories option to include subdirectories | ||
===Reading XML files=== | ===Reading XML files=== | ||
− | + | ||
Imports System.Xml | Imports System.Xml | ||
Imports System.IO | Imports System.IO | ||
Line 298: | Line 312: | ||
End Sub | End Sub | ||
End Class | 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== | ==Arrays== | ||
=== Initialize array in line === | === Initialize array in line === | ||
Dim words() As String = {"zero", "one", "two"} | 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. | ||
+ | <nowiki> | ||
+ | <configuration> | ||
+ | <runtime> | ||
+ | <gcAllowVeryLargeObjects enabled="true" /> | ||
+ | </runtime> | ||
+ | </configuration> | ||
+ | </nowiki> | ||
==Threading / Parallel== | ==Threading / Parallel== | ||
Line 327: | Line 489: | ||
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. | 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=== | ===Simple loop=== | ||
− | + | ||
Do | Do | ||
'code to execute several times | 'code to execute several times | ||
Line 333: | Line 495: | ||
{Exit Do} 'exit the loop | {Exit Do} 'exit the loop | ||
Loop | Loop | ||
− | + | ||
===Do Loop While (run then check)=== | ===Do Loop While (run then check)=== | ||
− | + | ||
Do | Do | ||
'code to loop here | 'code to loop here | ||
i = i + 1 | i = i + 1 | ||
Loop While (i < 5) | Loop While (i < 5) | ||
− | + | ||
===Do While (check then run)=== | ===Do While (check then run)=== | ||
− | + | ||
Do While i < 5 | Do While i < 5 | ||
'code to loop here | 'code to loop here | ||
i = i + 1 | i = i + 1 | ||
Loop | Loop | ||
− | + | ||
===For=== | ===For=== | ||
− | + | ||
For i = 0 To 4 | For i = 0 To 4 | ||
'code to loop here | 'code to loop here | ||
Line 358: | Line 520: | ||
{Exit For} 'continues execution after Next | {Exit For} 'continues execution after Next | ||
Next | Next | ||
− | + | ||
i will step by 1 each loop | i will step by 1 each loop | ||
===For (custom step size)=== | ===For (custom step size)=== | ||
This example will cause i to increase by 2 on each loop | This example will cause i to increase by 2 on each loop | ||
− | + | ||
For i = 0 To 4 step 2 | For i = 0 To 4 step 2 | ||
'code to loop here | 'code to loop here | ||
Next | Next | ||
− | + | ||
For down counting loops, step size must be negative, and variable type must be signed (unless all values are non-zero and positive). | For down counting loops, step size must be negative, and variable type must be signed (unless all values are non-zero and positive). | ||
Line 377: | Line 539: | ||
===If=== | ===If=== | ||
====Equal==== | ====Equal==== | ||
− | + | ||
if i = 4 Then 'code here | if i = 4 Then 'code here | ||
Line 385: | Line 547: | ||
'code line 2 | 'code line 2 | ||
End If | End If | ||
− | + | ||
====Not equal==== | ====Not equal==== | ||
− | + | ||
if i <> 4 Then 'code here | if i <> 4 Then 'code here | ||
− | + | ||
====Greater than==== | ====Greater than==== | ||
− | + | ||
if i > 4 Then 'code here | if i > 4 Then 'code here | ||
− | + | ||
====Less than==== | ====Less than==== | ||
− | + | ||
if i < 4 Then 'code here | if i < 4 Then 'code here | ||
− | + | ||
====Greater than or equal to==== | ====Greater than or equal to==== | ||
− | + | ||
if i >= 4 Then 'code here | if i >= 4 Then 'code here | ||
− | + | ||
====Less than or equal to==== | ====Less than or equal to==== | ||
− | + | ||
if i <= 4 Then 'code here | if i <= 4 Then 'code here | ||
− | + | ||
===If Else=== | ===If Else=== | ||
− | + | ||
if i = 4 Then 'code here Else 'code here | if i = 4 Then 'code here Else 'code here | ||
Line 422: | Line 584: | ||
'code line 1 | 'code line 1 | ||
End If | End If | ||
− | + | ||
===Select Case=== | ===Select Case=== | ||
− | + | ||
Select Case i | Select Case i | ||
Case 0 | Case 0 | ||
Line 441: | Line 603: | ||
'this code will run if i didn't match any of the above cases | 'this code will run if i didn't match any of the above cases | ||
End Select | End Select | ||
− | + | ||
===Choose=== | ===Choose=== | ||
Line 492: | Line 654: | ||
===Rounding=== | ===Rounding=== | ||
− | + | ||
Math.Round(3.14159,2) | Math.Round(3.14159,2) | ||
− | + | ||
Rounds to 2 decimal places, giving 3.14 | Rounds to 2 decimal places, giving 3.14 | ||
===Seperating just the whole part of a number=== | ===Seperating just the whole part of a number=== | ||
− | + | ||
Int(3.14159) | Int(3.14159) | ||
− | + | ||
Gives 3 | Gives 3 | ||
===Seperating just the fractional part of a number=== | ===Seperating just the fractional part of a number=== | ||
− | + | ||
double pi | double pi | ||
double frac | double frac | ||
pi=Math.PI | pi=Math.PI | ||
frac=pi-Int(pi) | frac=pi-Int(pi) | ||
− | + | ||
Gives 0.14159 | Gives 0.14159 | ||
===Modulus=== | ===Modulus=== | ||
This will return the remainder of a division | This will return the remainder of a division | ||
− | + | ||
Dim i, counter as Uint32 | Dim i, counter as Uint32 | ||
Line 520: | Line 682: | ||
counter = i Mod 5 | counter = i Mod 5 | ||
Next | Next | ||
− | + | ||
This example will cause counter to count from 0 to 4, back to 0, and though to 4 again. | This example will cause counter to count from 0 to 4, back to 0, and though to 4 again. | ||
===Random integer between 2 values=== | ===Random integer between 2 values=== | ||
− | + | ||
Public Function randint(n1 As Long, n2 As Long) As Long | Public Function randint(n1 As Long, n2 As Long) As Long | ||
randint = Int((((n2 + 1) - n1) * Rnd) + n1) | randint = Int((((n2 + 1) - n1) * Rnd) + n1) | ||
End Function | End Function | ||
− | + | ||
==Calling Windows API== | ==Calling Windows API== | ||
===Performance Counter (high resolution timer)=== | ===Performance Counter (high resolution timer)=== | ||
− | + | ||
Public Declare Function QueryPerformanceCounter Lib "kernel32.dll" (ByRef Counter As Long) As Integer | 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 | Public Declare Function QueryPerformanceFrequency Lib "kernel32.dll" (ByRef counter As Long) As Integer | ||
Line 544: | Line 706: | ||
QueryPerformanceCounter(tStop) | QueryPerformanceCounter(tStop) | ||
msgbox(CStr(CInt(1 / ((tStop - tStart) / curFreq))) & " Frames per second") | msgbox(CStr(CInt(1 / ((tStop - tStart) / curFreq))) & " Frames per second") | ||
− | + | ||
===Sending keystrokes to applications=== | ===Sending keystrokes to applications=== | ||
− | + | ||
'Google Earth example with up arrow for 1 second | 'Google Earth example with up arrow for 1 second | ||
Private Const WM_KEYDOWN = &H100 | Private Const WM_KEYDOWN = &H100 | ||
Line 580: | Line 742: | ||
SendMessage(GEarthHandle, WM_KEYUP, VK_UP, 0&) 'release UP | SendMessage(GEarthHandle, WM_KEYUP, VK_UP, 0&) 'release UP | ||
End Sub | End Sub | ||
− | + | ||
==RS-232== | ==RS-232== | ||
===Setting up a serial port=== | ===Setting up a serial port=== | ||
+ | This may require installation of the System.IO.Ports NuGet package, to do this:<br /> | ||
+ | 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 | Dim SerialPort1 As New System.IO.Ports.SerialPort | ||
Line 595: | Line 760: | ||
===Adding a combo box with a list of available ports=== | ===Adding a combo box with a list of available ports=== | ||
− | + | ||
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load | Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load | ||
− | + | Dim i As Integer | |
− | Dim i | + | |
− | + | ||
− | + | ||
− | + | ||
− | For i = 0 To | + | For i = 0 To My.Computer.Ports.SerialPortNames.Count - 1 |
− | ComboBox1.Items.Add( | + | ComboBox1.Items.Add(My.Computer.Ports.SerialPortNames(i)) |
Next | Next | ||
− | |||
− | |||
End Sub | End Sub | ||
Line 614: | Line 773: | ||
SerialPort1.Open() | SerialPort1.Open() | ||
End Sub | End Sub | ||
− | |||
===Sending an entire array of bytes=== | ===Sending an entire array of bytes=== | ||
Line 622: | Line 780: | ||
===Reading a byte=== | ===Reading a byte=== | ||
− | + | ||
Dim serialbyte as Byte | Dim serialbyte as Byte | ||
serialbyte=SerialPort1.ReadByte | serialbyte=SerialPort1.ReadByte | ||
− | + | ||
===Reading n bytes already in the received buffer=== | ===Reading n bytes already in the received buffer=== | ||
− | + | ||
Dim serialbytes(n-1) as Byte | Dim serialbytes(n-1) as Byte | ||
SerialPort1.Read(serialbytes,0,n) | SerialPort1.Read(serialbytes,0,n) | ||
− | + | ||
This can be used with:<br /> | This can be used with:<br /> | ||
− | + | ||
While SerialPort1.BytesToRead < n | While SerialPort1.BytesToRead < n | ||
− | + | <br /> | |
beforehand. | beforehand. | ||
Line 649: | Line 807: | ||
===Downloading HTML as a string from a web page=== | ===Downloading HTML as a string from a web page=== | ||
− | + | ||
Dim webClient As System.Net.WebClient = New System.Net.WebClient() | Dim webClient As System.Net.WebClient = New System.Net.WebClient() | ||
Dim result As String | Dim result As String | ||
Line 661: | Line 819: | ||
MsgBox(result) | MsgBox(result) | ||
End If | End If | ||
− | + | ||
===A simple TCP library (client)=== | ===A simple TCP library (client)=== | ||
− | + | ||
Imports System.Net | Imports System.Net | ||
Imports System.Net.Sockets | Imports System.Net.Sockets | ||
Line 780: | Line 938: | ||
End Function | End Function | ||
End Class | End Class | ||
− | + | ||
===A simple TCP library (server)=== | ===A simple TCP library (server)=== | ||
− | + | ||
Imports System.Net | Imports System.Net | ||
Imports System.Net.Sockets | Imports System.Net.Sockets | ||
Line 880: | Line 1,038: | ||
client.Close() | client.Close() | ||
End Sub | End Sub | ||
− | + | ||
===Sending UDP packets=== | ===Sending UDP packets=== | ||
− | + | ||
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click | 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 endPoint As System.Net.IPEndPoint = New System.Net.IPEndPoint(System.Net.IPAddress.Parse("192.168.0.44"), 9000) | ||
Line 889: | Line 1,047: | ||
sender = New System.Net.Sockets.UdpClient(9000) | sender = New System.Net.Sockets.UdpClient(9000) | ||
− | + | ||
Do | Do | ||
sender.Send(data, 20, endPoint) | sender.Send(data, 20, endPoint) | ||
Loop | Loop | ||
End Sub | End Sub | ||
− | + | ||
===Receiving UDP packets=== | ===Receiving UDP packets=== | ||
− | + | ||
Private Const port As Integer = 8000 'Port number to send/recieve data on | 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 receivingClient As System.Net.Sockets.UdpClient 'Client for handling incoming data | ||
Line 920: | Line 1,078: | ||
Loop | Loop | ||
End Sub | End Sub | ||
− | + | ||
== Conversion== | == Conversion== | ||
Line 955: | Line 1,113: | ||
===Using the start of a string=== | ===Using the start of a string=== | ||
− | + | ||
dim str as string | dim str as string | ||
dim outputstr as string | dim outputstr as string | ||
str = "this is a string" | str = "this is a string" | ||
outputstr = str.Substring(0, 4) | outputstr = str.Substring(0, 4) | ||
− | + | ||
Starts at character index 0 (the first character), and reads 4 characters (including the first one), resulting in "this".<br /> | Starts at character index 0 (the first character), and reads 4 characters (including the first one), resulting in "this".<br /> | ||
===Using the middle of a string=== | ===Using the middle of a string=== | ||
− | + | ||
dim str as string | dim str as string | ||
dim outputstr as string | dim outputstr as string | ||
str="this is a string" | str="this is a string" | ||
outputstr=str.Substring(5, 4) | outputstr=str.Substring(5, 4) | ||
− | + | ||
Starts at character index 5 (the 6th character), and reads 4 characters, resulting in "is a".<br /> | Starts at character index 5 (the 6th character), and reads 4 characters, resulting in "is a".<br /> | ||
===Using the end of a string=== | ===Using the end of a string=== | ||
− | + | ||
dim str as string | dim str as string | ||
dim outputstr as string | dim outputstr as string | ||
str="this is a string" | str="this is a string" | ||
outputstr=str1.Substring(str1.Length - 4, 4) | outputstr=str1.Substring(str1.Length - 4, 4) | ||
− | + | ||
Starts 4 chacters before the end, and reads 4 characters, resulting in "ring".<br /> | Starts 4 chacters before the end, and reads 4 characters, resulting in "ring".<br /> | ||
===Getting just the path of a file given the entire path and filename as a string=== | ===Getting just the path of a file given the entire path and filename as a string=== | ||
− | + | ||
PathStr.Substring(0, ofd.FileName.LastIndexOf("\")) & "\" | 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=== | ===Getting just the file name (with extension) of a file given the entire path and filename as a string=== | ||
− | + | ||
System.IO.Path.GetFileName(PathStr) | System.IO.Path.GetFileName(PathStr) | ||
− | + | ||
===Getting just the file name (without extension) of a file given the entire path and filename as a string=== | ===Getting just the file name (without extension) of a file given the entire path and filename as a string=== | ||
− | + | ||
System.IO.Path.GetFileNameWithoutExtension(PathStr) | System.IO.Path.GetFileNameWithoutExtension(PathStr) | ||
− | + | ||
===Seperating the values from a time and date string=== | ===Seperating the values from a time and date string=== | ||
− | + | ||
curtimeanddate = Now | curtimeanddate = Now | ||
yearstr = DateAndTime.Year(curtimeanddate) | yearstr = DateAndTime.Year(curtimeanddate) | ||
Line 1,009: | Line 1,167: | ||
minutestr = DateAndTime.Minute(curtimeanddate) | minutestr = DateAndTime.Minute(curtimeanddate) | ||
secondstr = DateAndTime.Second(curtimeanddate) | secondstr = DateAndTime.Second(curtimeanddate) | ||
− | + | ||
Note: hours are in 24 hour/day. | Note: hours are in 24 hour/day. | ||
=== Converting a string to a number in other locales === | === Converting a string to a number in other locales === | ||
n = Single.Parse(text, System.Globalization.NumberFormatInfo.InvariantInfo) | 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== | ==Time== | ||
===Getting the current date and time=== | ===Getting the current date and time=== | ||
− | + | ||
timeanddatestr=Now | timeanddatestr=Now | ||
− | + | ||
For processing this string, see the [[#Seperating the values from a time and date string|Seperating the values from a time and date string]] section | For processing this string, see the [[#Seperating the values from a time and date string|Seperating the values from a time and date string]] section | ||
===Getting the number of seconds after midnight (includes fractional seconds)=== | ===Getting the number of seconds after midnight (includes fractional seconds)=== | ||
− | + | ||
Do | Do | ||
Label1.Text = CStr(Microsoft.VisualBasic.Timer) | Label1.Text = CStr(Microsoft.VisualBasic.Timer) | ||
Application.DoEvents() | Application.DoEvents() | ||
Loop | Loop | ||
− | + | ||
===Running code periodically=== | ===Running code periodically=== | ||
− | + | ||
Timer1.Interval = 1000 'number of milliseconds between calls | Timer1.Interval = 1000 'number of milliseconds between calls | ||
Timer1.Enabled = True | Timer1.Enabled = True | ||
Line 1,038: | Line 1,207: | ||
'your code here to run once a second | 'your code here to run once a second | ||
End Sub | End Sub | ||
− | + | ||
(must add a timer to the form) | (must add a timer to the form) | ||
===Stopwatch (milliseconds or high frequency ticks)=== | ===Stopwatch (milliseconds or high frequency ticks)=== | ||
example 1: timing code | example 1: timing code | ||
− | + | ||
Dim stopWatch As New Stopwatch() | Dim stopWatch As New Stopwatch() | ||
Line 1,053: | Line 1,222: | ||
msgbox(String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10)) | 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 | example 2: running code at 10Hz | ||
− | + | ||
Dim stopWatch As New Stopwatch | Dim stopWatch As New Stopwatch | ||
Line 1,067: | Line 1,236: | ||
stopWatch.Restart() | stopWatch.Restart() | ||
Loop | Loop | ||
− | + | ||
example 3: running code at 2kHz | example 3: running code at 2kHz | ||
− | + | ||
Dim stopWatch As New Stopwatch | Dim stopWatch As New Stopwatch | ||
Dim freq, period As Long | Dim freq, period As Long | ||
Line 1,085: | Line 1,254: | ||
stopWatch.Restart() | stopWatch.Restart() | ||
Loop | Loop | ||
− | + | ||
==Multimedia== | ==Multimedia== | ||
− | ===Playing and stopping audio playback from | + | ===Playing and stopping audio playback from a wave file=== |
To begin playback: | To begin playback: | ||
− | + | ||
− | My.Computer.Audio.Play( | + | My.Computer.Audio.Play("wavefile.wav", AudioPlayMode.Background) |
− | + | ||
To stop playback: | To stop playback: | ||
− | + | ||
My.Computer.Audio.Stop() | 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== | ==Datatypes== | ||
===Keeping variables between calls=== | ===Keeping variables between calls=== | ||
− | + | ||
Static countervar as Uint32 | Static countervar as Uint32 | ||
− | + | ||
This will create a persistent variable called countervar | 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)=== | ===Creating custom data types (structure)=== | ||
To set up: | To set up: | ||
− | + | ||
Structure RGBtype | Structure RGBtype | ||
Dim R As Byte | Dim R As Byte | ||
Line 1,113: | Line 1,309: | ||
Dim B As Byte | Dim B As Byte | ||
End Structure | End Structure | ||
− | + | ||
To use: | To use: | ||
− | + | ||
Dim pict(640, 480) As RGBtype | Dim pict(640, 480) As RGBtype | ||
pict(0, 0).R = 100 | pict(0, 0).R = 100 | ||
Line 1,129: | Line 1,325: | ||
value5 = pict(1, 2).G | value5 = pict(1, 2).G | ||
value6 = pict(1, 2).B | value6 = pict(1, 2).B | ||
− | + | ||
− | This will result in value1=100, value2=120, value3=150, value4=200, value5=220, value6=250 | + | This will result in value1=100, value2=120, value3=150, value4=200, value5=220, value6=250 |
===Datatype information=== | ===Datatype information=== | ||
Line 1,139: | Line 1,335: | ||
! Range | ! Range | ||
|- | |- | ||
− | | | + | | Boolean |
− | | | + | | System.Boolean |
| 4 bytes | | 4 bytes | ||
| True or False | | True or False | ||
|- | |- | ||
− | | | + | | Byte |
− | | | + | | System.Byte |
| 1 byte | | 1 byte | ||
| 0 to 255 (unsigned) | | 0 to 255 (unsigned) | ||
|- | |- | ||
− | | | + | |SByte |
− | | | + | | System.SByte |
| 1 byte | | 1 byte | ||
| -128 through 127 (signed) | | -128 through 127 (signed) | ||
|- | |- | ||
− | | | + | | Char |
− | | | + | | System.Char |
| 2 bytes | | 2 bytes | ||
| 0 to 65535 (unsigned) | | 0 to 65535 (unsigned) | ||
|- | |- | ||
− | | | + | | Date |
− | | | + | | System.DateTime |
| 8 bytes | | 8 bytes | ||
| January 1, 1 CE to December 31, 9999 | | January 1, 1 CE to December 31, 9999 | ||
|- | |- | ||
− | | | + | | Decimal |
− | | | + | | System.Decimal |
| 12 bytes | | 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 | | +/-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 | | 8 bytes | ||
| -1.79769313486231E308 to -4.94065645841247E-324 for negative values; 4.94065645841247E-324 to 1.79769313486232E308 for positive values | | -1.79769313486231E308 to -4.94065645841247E-324 for negative values; 4.94065645841247E-324 to 1.79769313486232E308 for positive values | ||
|- | |- | ||
− | | | + | | Integer |
− | | | + | | System.Int32 |
| 4 bytes | | 4 bytes | ||
| -2,147,483,648 to 2,147,483,647 | | -2,147,483,648 to 2,147,483,647 | ||
|- | |- | ||
− | | | + | | UInteger |
− | | | + | | System.UInt32 |
| 4 bytes | | 4 bytes | ||
| 0 through 4,294,967,295 (unsigned) | | 0 through 4,294,967,295 (unsigned) | ||
|- | |- | ||
− | | | + | | Long |
− | | | + | | System.Int64 |
| 8 bytes | | 8 bytes | ||
| -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 | | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 | ||
|- | |- | ||
− | | | + | | ULong |
− | | | + | | System.UInt64 |
| 8 bytes | | 8 bytes | ||
| 0 through 18,446,744,073,709,551,615 (1.8...E+19) (unsigned) | | 0 through 18,446,744,073,709,551,615 (1.8...E+19) (unsigned) | ||
|- | |- | ||
− | | | + | | Object |
− | | | + | | System.Object (class) |
| 4 bytes | | 4 bytes | ||
− | | Any type can be stored in a variable of type | + | | Any type can be stored in a variable of type Object |
|- | |- | ||
− | | | + | | Short |
− | | | + | | System.Int16 |
| 2 bytes | | 2 bytes | ||
| -32,768 to 32,767 | | -32,768 to 32,767 | ||
|- | |- | ||
− | | | + | | UShort |
− | | | + | | System.UInt16 |
| 2 bytes | | 2 bytes | ||
| 0 through 65,535 (unsigned) | | 0 through 65,535 (unsigned) | ||
|- | |- | ||
− | | | + | | Single |
− | | | + | | System.Single |
| 4 bytes | | 4 bytes | ||
| -3.402823E38 to -1.401298E-45 for negative values; 1.401298E-45 to 3.402823E38 for positive values | | -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) | | 10 bytes + (2 * string length) | ||
| 0 to approximately two billion Unicode characters | | 0 to approximately two billion Unicode characters | ||
|- | |- | ||
| User-Defined Type (structure) | | User-Defined Type (structure) | ||
− | | (inherits from | + | | (inherits from System.ValueType) |
| Sum of the sizes of its members | | 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 | | Each member of the structure has a range determined by its data type and independent of the ranges of the other members |
Latest revision as of 06:51, 7 August 2023
<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
- 1 Application
- 2 Graphics
- 2.1 Simple pixel plotting
- 2.2 Reading a pixel
- 2.3 Setting up graphics and drawing pixels, shapes, and colours
- 2.4 Copies bitmap named bm into a 1D array called picArray as R,G,B,R,G,B,...
- 2.5 Clearing the bitmap to a solid colour
- 2.6 Loading an image file into a picture box
- 2.7 Saving a picture box to an image file
- 2.8 Reading the mouse position within a picture box
- 2.9 Drawing text on a bitmap (and then into a picture box)
- 2.10 Determining the width and height of text
- 2.11 Loading a graphics file into a bitmap
- 3 Files
- 3.1 Reading text files line by line
- 3.2 Writing text the preferred way (simpler and faster)
- 3.3 Writing text files line by line
- 3.4 loading data files into an array of bytes
- 3.5 Writing binary files
- 3.6 Reading Binary Files
- 3.7 Using a "Browse" button
- 3.8 Adding file paths to an array, from a directory
- 3.9 Reading XML files
- 3.10 Looping though all files in a directory
- 3.11 Counting the number of files in a directory
- 4 Arrays
- 5 .NET collection types
- 6 Increasing maximum size of arrays for 64 bit program on 64 bit OS
- 7 Threading / Parallel
- 8 Loops
- 9 Conditionals
- 10 Math
- 11 Calling Windows API
- 12 RS-232
- 13 Network / Internet
- 14 Conversion
- 15 Strings
- 15.1 Finding text in a string
- 15.2 Using the start of a string
- 15.3 Using the middle of a string
- 15.4 Using the end of a string
- 15.5 Getting just the path of a file given the entire path and filename as a string
- 15.6 Getting just the file name (with extension) of a file given the entire path and filename as a string
- 15.7 Getting just the file name (without extension) of a file given the entire path and filename as a string
- 15.8 Seperating the values from a time and date string
- 15.9 Converting a string to a number in other locales
- 15.10 Counting the number of specific characters in a string
- 15.11 Removing whitespace
- 16 Time
- 17 Multimedia
- 18 Datatypes
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 |