ساخت یک کنترل در زمان اجرا

ساخت یک کنترل در زمان اجرا
گاهی از اوقات در برنامه احتیاج هست که یک کنترل ( برای مثال یک Button یا یک Image ) را در هنگام اجرا بوجود آوربد . این کار در vb6 با استفاده از توابع API صورت می گرفت ولی در VB.NET این کار را به راحتی آب خوردن می توان درون برنامه انجام داد
ساخت یک کنترل در زمان اجرا
گاهی از اوقات در برنامه احتیاج هست که یک کنترل ( برای مثال یک Button یا یک Image ) را در هنگام اجرا بوجود آوربد . این کار در vb6 با استفاده از توابع API صورت می گرفت ولی در VB.NET این کار را به راحتی آب خوردن می توان درون برنامه انجام داد.
در .NET کافیست که یه نمونه از کنترل مورد نظر را در حافظه تعریف کنید و بعد از تنطیم خصوصیات با استفاده از متد Controls.Add() آن را روی فرم ظاهر کنید.
برای مثال یک نمونه از Button اینگونه ساخته می شود:


کد:



Dim btn As New Button() 'Declare a New Instance of an Button
With btn 'Set Control Properties
.Text = "Created at Run time"
.Width = 150
.Height = 20
.Location = New Point(100, 200)
End With
Me.Controls.Add(btn) 'Add the Control to Form


تا اینجا دکمه ساخته شده و روی فرم قرار گرفته است ، ولی چگونه می توان برای رویدادهای این دکمه نیز برنامه نوشت؟
برای این منظور ابتدا باید یک روال برای رویداد مورد نظر و با همان پارامترهایی که برای یک دکمه معمولی بکار می رود نوشت ، برای مثال رویداد کلیک یک دکمه :


کد:



Sub onclick(ByVal sender As Object, ByVal e As EventArgs)
'Insert Event Code Here
End Sub


و سپس این رویداد را به روال مورد نظر نسبت می دهیم به صورت زیر :
AddHandler رویداد مربوط به کنترل, AddressOf نام روال نوشته شده برای رویداد
برای مثال:


کد:



AddHandler btn.Click, AddressOf onclick 'Set the Control Event With Its Sub

با استفاده از دستور RemoveHandler می توان ارتباط میان رویداد و کنترل را از میان برداشت. برای مثال:


کد:



RemoveHandler btn.Click, AddressOf onclick


با دستور Me.Controls.Remove() نیز می توانید یک کنترل را در زمان اجرا از فرم حذف کنید.
در مثال زیر ابتدا دکمه ای را در حافظه تعریف کرده و سپس به کنترل های روی فرم اضافه می کند ، با یک روال نیز در رویداد کلیک می گوئیم که کادر پیام با مضمون کلیک شدن روی دکمه ظاهر گردد و در پایان نیز دکمه مورد نظر را حذف می کنیم:


کد:




Dim btn As New Button()
Overloads Sub onclick(ByVal sender As Object, ByVal e As EventArgs)
MsgBox("You Click :" & CType(sender, Button).Text)
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load
With btn 'Set Control Properties
.Text = "Created at Run time"
.Width = 170
.Height = 20
.Location = New Point(100, 200)
End With

'Set the Control Event With Its Sub
AddHandler btn.Click, AddressOf onclick
'Add the Control to Form
Me.Controls.Add(btn)
End Sub

'Button1 Created in Design View
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
RemoveHandler btn.Click, AddressOf onclick
Me.Controls.Remove(btn)
End Sub

Zip & Unzip In Vb.Net


Imports System.IO
Imports System.IO.Compression

Namespace ECP

Public Class ZipUtility

Public Sub CompressFile(ByVal sourceFile As String, ByVal destinationFile As String)

' make sure the source file is there
If Not File.Exists(sourceFile) Then
Throw New FileNotFoundException
End If

' Create the streams and byte arrays needed
Dim buffer As Byte() = Nothing
Dim sourceStream As FileStream = Nothing
Dim destinationStream As FileStream = Nothing
Dim compressedStream As GZipStream = Nothing

Try
' Read the bytes from the source file into a byte array
sourceStream = New FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read)

' Read the source stream values into the buffer
buffer = New Byte(sourceStream.Length) {}
Dim checkCounter As Integer = sourceStream.Read(buffer, 0, buffer.Length)

' Open the FileStream to write to
destinationStream = New FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write)

' Create a compression stream pointing to the destiantion stream
compressedStream = New GZipStream(destinationStream, CompressionMode.Compress, True)

'Now write the compressed data to the destination file
compressedStream.Write(buffer, 0, buffer.Length)

Catch ex As ApplicationException
MessageBox.Show(ex.Message, "An Error occured during compression", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
' Make sure we allways close all streams
If sourceStream IsNot Nothing Then
sourceStream.Close()
End If
If compressedStream IsNot Nothing Then
compressedStream.Close()
End If
If destinationStream IsNot Nothing Then
destinationStream.Close()
End If
End Try

End Sub

Public Sub DecompressFile(ByVal sourceFile As String, ByVal destinationFile As String)

' make sure the source file is there
If Not File.Exists(sourceFile) Then
Throw New FileNotFoundException
End If

' Create the streams and byte arrays needed
Dim sourceStream As FileStream = Nothing
Dim destinationStream As FileStream = Nothing
Dim decompressedStream As GZipStream = Nothing
Dim quartetBuffer As Byte() = Nothing

Try
' Read in the compressed source stream
sourceStream = New FileStream(sourceFile, FileMode.Open)

' Create a compression stream pointing to the destiantion stream
decompressedStream = New GZipStream(sourceStream, CompressionMode.Decompress, True)

' Read the footer to determine the length of the destiantion file
quartetBuffer = New Byte(4) {}
Dim position As Integer = CType(sourceStream.Length, Integer) - 4
sourceStream.Position = position
sourceStream.Read(quartetBuffer, 0, 4)
sourceStream.Position = 0
Dim checkLength As Integer = BitConverter.ToInt32(quartetBuffer, 0)

Dim buffer(checkLength + 100) As Byte
Dim offset As Integer = 0
Dim total As Integer = 0

' Read the compressed data into the buffer
While True
Dim bytesRead As Integer = decompressedStream.Read(buffer, offset, 100)
If bytesRead = 0 Then
Exit While
End If
offset += bytesRead
total += bytesRead
End While

' Now write everything to the destination file
destinationStream = New FileStream(destinationFile, FileMode.Create)
destinationStream.Write(buffer, 0, total)

' and flush everyhting to clean out the buffer
destinationStream.Flush()

Catch ex As ApplicationException
MessageBox.Show(ex.Message, "An Error occured during compression", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
' Make sure we allways close all streams
If sourceStream IsNot Nothing Then
sourceStream.Close()
End If
If decompressedStream IsNot Nothing Then
decompressedStream.Close()
End If
If destinationStream IsNot Nothing Then
destinationStream.Close()
End If
End Try

End Sub
End Class
End Namespace

دستیابی به رجیستری در VB.NET


سلام.
این مقاله در راستای جلوگیری از ایجاد تاپیک های بی مورد بوجود آمده است. امید است کاربران قبل از ارسال تاپیک با مطالعه ی اینگونه مقاله ها مشکلات خود را بر طرف کنند و اگر در جایی مسئله ای برایشان پیش آمد آن وقت تاپیک بزنند.

این مقاله به بررسی چگونگی دستیابی به رجیستری در ویژوال بیسیک دات نت می پردازد. رجیستری ویندوز یکی از پرکاربرد ترین مباحث در برنامه نویسی استاندارد ویندوز میباشد که اکثر برنامه‌های موجود از این امکان بهره میبرند. برای مثال می توان از رجیستری برای نگهداری آخرین تغییرات داده شده در برنامه و یا ذخیره تنظیماتی که کاربر در برنامه اعمال کرده است استفاده کرد. در NET. از دو کلاس Registry و RegistryKey برای دسترسی به رجیستری و داده‌های موجود در آن استفاده میشود.

هر ورودی در رجیستری ویندوز شامل دو قسمت میشود: نام مقدار (Value Name) و مقدار (Value). این ورودی‌ها در در کلیدها و زیرکلیدهای رجیستری ذخیره میشوند که از این لحاظ میتوان آنها را با فایلهایی مقایسه کرد که در فهرستها و زیر فهرستها قرار میگیرند.

دستیابی به رجیستری به وسیله توابع Visual Basic .NET
ویژوال بیسیک دات نت چهار تابع را برای کار با رجیستری معرفی میکند که برای استفاده از آنها شما باید اجازه خواندن و نوشتن، یعنی دسترسی RegistryPermissionAccess را داشته باشید. برای اطلاعات بیشتر در این مورد به کلاس RegistryPermission رجوع کنید. در زیر اطلاعاتی را در مورد این توابع مشاهده میکنید:

DeleteSetting : یک ناحیه یا یک کلید که شامل اطلاعات ورودی از برنامه در رجیستری است را حذف میکند.

GetSetting : مقدار یک کلید که شامل اطلاعات ورودی از برنامه در رجیستری است را برمیگرداند.

GetAllSettings : یک لسیت از کلیدها و ارزش آنها که شامل اطلاعات ورودی از برنامه در رجیستری است را برمیگرداند.

SaveSetting : اطلاعات برنامه را در رجیستری ذخیره میکند.

نکته: : اطلاعات یک ناحیه نمیتواند توسط تابع GetSetting برگردانده شود.

مثال زیر یک کلید و دو زیر کلید در رجیستری میسازد، ارزش کلید اول و ارزش دو زیر کلید آنرا را چاپ میکند سپس دومین زیر کلید را حذف و مقدار کلید اول و زیر کلیدهایش را چاپ میکند تا حذف زیر کلید دوم تایید شود:
کد:

' Create the first key.
SaveSetting("TestApp","Startup", "FirstKey", "First")

' Create the first subkey.
SaveSetting("TestApp","FirstKey", "FirstSubKey", "FirstSub")

' Create the second subkey.
SaveSetting("TestApp","FirstKey", "SecondSubKey", "SecondSub")

Try
' Write the first key's value.
Console.WriteLine((GetSetting("TestApp", "Startup", "FirstKey"))

' Write the first key as well as its two subkeys.
Console.WriteLine(GetAllSettings("TestApp", "Startup"))

Catch e As ArgumentException
Catch e As Exception
Console.WriteLine(e.GetType.ToString)
End Try

DeleteSetting("TestApp", "FirstKey", "SecondSubKey")

Try
Console.WriteLine(GetSetting("TestApp", "Startup", "FirstKey"))
Console.WriteLine(GetAllSettings("TestApp", "Startup"))

Catch e As ArgumentException
Catch e As Exception
Console.WriteLine(e.GetType.ToString)
End Try


توجه داشته باشید که استفاده از این توابع با محدودیتهایی همراه است. شما تنها میتوانید به کلیدهای رجیستری در محدوده HKEY_CURRENT_USERSoftwareVB and VBA Program Settings دسترسی داشته باشید و همچنین به علت استفاده از کلید HKEY_CURRENT_USER شما حتما باید با نام کاربری معتبر به سیستم وارد شده باشید.

دستیابی به رجیستری توسط NET Framework.
همانطور که مشاهده کردید استفاده از توابع فوق با محدودیتهایی همراه است. NET Framework. برای حل این مشکل دو کلاس Registry و RegistryKey را معرفی میکند که این دو کلاس در فضانام Microsoft.Win32 قرار دارند. کلاس Registry کلیدهای پایه‌ای زیر را فراهم میکند که توسط آنها میتوان به زیر کلیدها و مقادیر آنها دسترسی داشت. خود این کلیدهای اصلی فقط خواندنی هستند. جدول زیر این هفت کلید را نشان میدهد:

نام کلید : توضیحات

ClassesRoot : معرف پسوندهای فایها و انواع اسناد موجود در سیستم به همراه خصوصیات مربوط به آنها.

CurrentConfig : اطلاعات مربوط به سخت افزار که مربوط به کاربر مشخصی نیست.

CurrentUser : اطلاعاتی مربوط به کاربر حاضر مانند تنظیمات محیط کار کاربر.

DynData : شامل اطلاعات پویای رجیستری که برای راه اندازهای دستگاه مجازی بکار میرود.

LocalMachine : شامل پنج زیر کلید (Hardware ،SAM ،Security ،Software و System) که تنظیمات مربوط به سیستم را نگه میدارند.

PerformanceData : شامل اطلاعات اجرایی مربوط به نرم افزارها.

Users : شامل اطلاعات مربوط به اولویتهای پیش فرض کاربر.

مثال زیر نشان میدهد که چگونه یک مقدار DWORD را از کلید HKEY_CURRENT_USER بخوانیم:
کد:

Imports Microsoft.Win32

Dim regVersion As RegistryKey
Dim keyValue As String
Dim intVersion As Integer = 0

keyValue = "SoftwareMicrosoftTestApp1.0"
regVersion = Registry.CurrentUser.OpenSubKey(keyValue, False)

If (Not regVersion Is Nothing) Then
intVersion = regVersion.GetValue("Version", 0)
regVersion.Close()
End If


مثال زیر یک مقدار DWORD را خوانده، یک واحد به آن اضافه کرده و سپس آنرا چاپ میکند:
کد:

Imports Microsoft.Win32

Dim keyValue As String
Dim regVersion As RegistryKey
Dim intVersion As Integer = 0

keyValue = "SoftwareMicrosoftTestApp1.0"
regVersion = Registry.CurrentUser.OpenSubKey(keyValue, True)

If regVersion Is Nothing Then
' Key doesn't exist; create it.
regVersion = Registry.CurrentUser.CreateSubKey(keyValue)
End If

If (Not regVersion Is Nothing) Then
intVersion = regVersion.GetValue("Version", 0)
intVersion = intVersion + 1
regVersion.SetValue("Version", intVersion)
regVersion.Close()
End If


مطابق مثال بالا، برای دسترسی به یک کلید ابتدا متغیری از نوع RegistryKey تعریف میکنیم. سپس با استفاده از متد OpenSubKey آدرس کلید مورد نظر را داده تا کلید فوق برای خواندن آماده باشد. اگر پارامتر دوم این کلید برابر True باشد اجازه نوشتن بر روی آن کلید را نیز داریم. برای ساختن یک کلید نیز باید از متد CreateSubKey استفاده کرد. پس از ساختن و یا باز کردن یک کلید رجیستری، با استفاده از دو تابع GetValue و SetValue میتوان مقادیری را در آن کلید نوشت و یا از آن کلید خواند.

توسط رجیستری کارهای بسیار زیادی میتوان انجام داد. شما نیز با کمی تمرین میتوانید برنامه های استاندارد و جالبی را طراحی کنید. در پایان امیدوارم که دوستان قبل از ارائه سوالاتی در این مورد ابتدا این مقاله ها را مطالعه کنند و اگر مشکلی داشتند تاپیک جداگانه بزنند.