Difference between revisions of "Visual Basic .net"

From ScienceZero
Jump to: navigation, search
(added multimedia)
m (fixed category tree)
Line 320: Line 320:
  
 
==Multimedia==
 
==Multimedia==
==Playing and stopping audio playback from an array of audio sample bytes==
+
===Playing and stopping audio playback from an array of audio sample bytes===
 
To begin playback:
 
To begin playback:
 
<code>
 
<code>

Revision as of 08:47, 4 May 2010

Contents

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

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

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)
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)
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 A,R,G,B,A,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, Imaging.PixelFormat.Format32bppArgb, Imaging.PixelFormat.Format32bppPArgb, Imaging.PixelFormat.Format32bppRgb
	'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.Format32bppArgb)
	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 image to a solid colour

gr.Clear(Color.Black)

Files

Reading text files line by line

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

Note My.Application.Info.DirectoryPath & "\filename.txt" may be replaced by "C:\some_path\file.txt"
FileOpen(f1, My.Application.Info.DirectoryPath & "\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 files line by line

Dim f1 As Long
f1 = FreeFile()
FileOpen(f1, My.Application.Info.DirectoryPath & "\filename.txt", OpenMode.Output)
Print(f1, "This is line 1")
Print(f1, "This is line 2")
FileClose(f1)

Note: FileOpen(f1, My.Application.Info.DirectoryPath & "\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(My.Application.Info.DirectoryPath & "\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()


Using a "Browse" button

Dim ofd As New OpenFileDialog
dim f1 as Long
If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then
	f1 = FreeFile()
	Try
		FileOpen(f1, ofd.FileName, OpenMode.Input)
	Catch ex As Exception
		MsgBox(ex.Message)
		err = 1
	End Try

	If err = 0 Then
		'read the file here
	End If
End if

To separate a file path string, see this section


Arrays

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

Conditionals

Math

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,2)

Gives 3

Seperating just the fractional part of a number

double pi
double frac
pi=3.14159
frac=pi-Int(pi)

Gives 0.14159

Calling Windows API

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)
...your code
QueryPerformanceCounter(tStop)
msgbox(CStr(CInt(1 / ((tStop - tStart) / curFreq))) & " Frames per second")

RS-232

Setting up a serial port

Dim SerialPort1 As New System.IO.Ports.SerialPort

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

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

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

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)

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

Multimedia

Playing and stopping audio playback from an array of audio sample bytes

To begin playback:

My.Computer.Audio.Play(SampleArray, AudioPlayMode.Background)

To stop playback:

My.Computer.Audio.Stop()

Datatypes

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