PDA

توجه ! این یک نسخه آرشیو شده می باشد و در این حالت شما عکسی را مشاهده نمی کنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : نا گفته هاي كاربردي و جالب در Visual Basic.Net



TAHA
02-15-2010, 06:17 PM
سلام
پس از این همه وقت گذاشتن برای یادگیری ویژوال بیسیک هنوز به مواردی برخورد میکنم که برای من کاملا ناشناخته و جالب است.
برای همین تصمیم گرفتم تا تاپیکی رو شروع کنم که هدف ان نشان دادن امکانات و توانایی های از ویژوال بیسیک است که کمتر کسانی اونها رو میشناسند .
از شما خواهش میکنم تجربیات و نکاتی که در برنامه نویسی با ویژوال بیسیک بدست اورده اید و به نظر خودتان جالب و اموزنده هستند رو برای استفاده ی همه ی برنامه نویسان روی سایت قرار دهید.
با تشکر.طه
روزگار خوش

TAHA
02-15-2010, 06:18 PM
برای شروع من کلاسی رو معرفی میکنم که مشکل تعداد زیادی از برنامه نویسان در مورد تاریخ شمسی رو حل میکنه. در دات نت کلاسی به نام PersianCleander وجود داره که به وسیله ی آن میتوانیم تاریخ شمسی رو محاسبه کنیم. بدین صورت :


Imports System.Globalization
Public Class ConvertDate
Public Function ShamsiToMiladi(ByVal ShamsiDate As String) As String
Dim PDate As New PersianCalendar
Dim y, m, d As Integer
y = Mid(ShamsiDate, 1, 4)
m = Mid(ShamsiDate, 6, 2)
d = Mid(ShamsiDate, 9, 2)
Return Mid(PDate.ToDateTime(y, m, d, 1, 1, 1, 1, 1), 1, 11)
End Function
Public Function MiladiToShamsi(ByVal MiladiDate As String) As String
Dim PDate As New PersianCalendar
Dim miladi As Date = CDate(MiladiDate)
Dim y, m, d As String
y = PDate.GetYear(miladi)
m = PDate.GetMonth(miladi)
d = PDate.GetDayOfMonth(miladi)
Return y & "/" & m & "/" & d
End Function
End Class

TAHA
02-15-2010, 06:20 PM
مشکلی که خیلی از برنامه نویسان با ان مواجه هستند این است که عملکرد Enter در برنامه همانند عملکرد Tab باشد.
به همین خاطر هر کسی با راه و روش خودش این کار رو انجام میدهد که اکثرا با کد نویسی های زیادی حاصل میشود. در صورتی که این کار فقط با نوشتن یک خط کد حاصل میشود.
در ابتدا مقدار KeyPreview که یکی از مشخصه های فرم است را به True تغییر میدهیم و سپس در رویداد KeyPress برنامه این قطعه کد را مینویسیم :




Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
If e.KeyChar = Chr(Keys.Enter) Then
SendKeys.Send("{Tab}")
End If
End Sub

TAHA
02-15-2010, 06:20 PM
این دفعه میخوام Property هایی رو براتون بگم که کمتر با انها اشنا هستیم
AutoCompleteCustomSource , AutoCompleteMode , AutoCompleteSource
این مشخصات که مخصوص TextBox هستند میتوانند کار ورود داده به برنامه ها رو خیلی سریع تر کنند. بدین صورت که ما بوسیله ی آنها میتوانیم مثل یک ComboBox بلکه در زمینه هایی بهتر از ان عمل کنیم.
کار این مشخصات این است که با تایپ کردن قسمتی از متن درون Textbox برنامه بقیه ی آن متن را به کاربر نشان دهد.
برای کار شما ابتدا باید برای AutoCompleteCustomSource آیتم هایی رو تعریف کنین.
سپس AutoCompleteMode را انتخاب کنین
و در آخر AutoCompleteSource را برابر CustomSource قرار دهید.
با این کار وقتی کاربر حرف اول کلمه ایی رو تایپ میکنه برنامه در AutoCompleteCustomSource آن کلمه رو پیدا میکنه و به کاربر نمایش میده.
حالت های مختلفی وجود داره مثلا اگه AutoCompleteSource رو برابر FileSystem قرار دهیم با تایپ "C:\" برنامه زیر پوشه های درایو C رو برای نوشتن ادرس باز میکنه که این کار کاربر رو خیلی راحت تر میکنه

TAHA
02-15-2010, 06:21 PM
بعضی وقت ها پیش میاد که میخواهیم یک نوع داده ی خاص رو از کاربر بگیریم که شکل خاصی داره (مثلا کد ملی یا کد پستی و ...) . برای اینکه ببنیم کاربر اون متن ورودی رو طبق قاعده وارد کرده یا نه از کلاس RegularExpressions استفاده میکنیم.



Imports System.Text.RegularExpressions

Dim s As String = "122-250152-8"
If Regex.IsMatch(s, "[1-9]{3}-[0-9]{6}-[0-9]") = True Then
MsgBox("True")
Else
MsgBox("False")
End If

TAHA
02-15-2010, 06:23 PM
این هم یک کد که در خاصیت KeyPress تکست باکس قرارش میدیم , تا فقط مقدار های عددی رو قبول کنه


Private Sub T7_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles ،TextBox1.KeyPress
If Not IsNumeric(e.KeyChar) And e.KeyChar <> Convert.ToChar(Keys.Back) And e.KeyChar <> Convert.ToChar(Keys.Delete) Then
e.Handled = True
End If
End Sub

TAHA
02-15-2010, 06:24 PM
این هم یک کد خیلی مفید برای حلقه ها و loop ها
اگر توجه کرده باشید توی دات نت وقتی یک حلقه ی بزرگ , مثلا 1000000 رکورد رو بخواید توی یه لیست باکس بریزید , یا از دیتابیس فرا بخونید , تا قبل از تموم شدن حلقه برنامه اگر Not Response نشه , حداقل دیگه نمی تونید توش کاری انجام بدید.
برای رفع این مشکل , کافیه در حلقه خود از متد Application.DoEvents استفاده کنید
مثال :




For i=0 to 100000
application.Doevents
Listbox1.Items.add(i)
Next

TAHA
02-15-2010, 06:29 PM
ساختن Help در برنامه ، میتونه ارزش اون برنامه رو بالا ببره. مخصوصا اگه Help ایی قوی داشته باشه . و بخوبی با کاربر ارتباط برقرار کنه
این دفعه میخوام چند کنترل که برای ساختن Help بکار میروند را معرفی کنم . Sample زیر نحوه ی کار با این کنترل ها رو نشان میده.(بر گرفته از سایت Microsoft)
کنترل های HelpProvider , ToolTip , MenuStrip ,ErrorProvider

TAHA
02-15-2010, 06:29 PM
سلام
این هم یه پروپرتی Override شده برای سایه دار کردن فرم ها . زمانی که یه کنترل خواستید بسازید این تکه کد خیلی به دردتون میخوره.


Private Const CS_DROPSHADOW As Integer = 131072
' Override the CreateParams property
Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
cp.ClassStyle = cp.ClassStyle Or CS_DROPSHADOW
Return cp
End Get
End Property

TAHA
02-15-2010, 06:35 PM
این هم نمونه کدی برای تغییر زبان کامپیوتر. بعضی از افراد از Api ها برای این کار استفاده میکنن. بهشون پیشنهاد میکنم اولویت رو به توابع دات نت بدهند. در مواقعی که این توابع پاسخگو ی نیازتان نیستند به سراغ api ها بروید



If InputLanguage.CurrentInputLanguage.LayoutName = "US" Then
Dim farsi As New Globalization.CultureInfo("fa-IR")
InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(farsi)
Else
Dim en As New Globalization.CultureInfo("en-US")
InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(en)
End If

TAHA
02-15-2010, 06:37 PM
سلام
نخ ها :(Thearding) یکی از بهترین امکان برای استفاده بهینه منابع هست با این حال خیلی مورد بی توجهی قرار می گیره.
مثلاً با این موضوع بر خرده باشید که وقتی حلقه ای بینهایت یا طولانی داریم و نیاز هست که در هنگام پردازش حلقه به رویداد های دیگه رسیده مورد تقاضای کاربر جواب بده در این حالت یا شما باید از دستور Doevents استفاده کنید که اصلاً توصیه نمی شه چون اجرای این دستور حدوداً یک میلی ثانیه تاخیر ایجاد می کنه و اگر حلقه من 10000 هزار بار تکرار بشه در برنامه من به صورت ناخواسته 10 ثانیه وقت تلف می شه (برای پاسخ به رویداد های دیگر )
برای این منظور از نخ ها استفاده که کارایی برنامه شما رو به صورت چشم گیری افزایش می دهد
من یک حلقه بزرگ رو مثال می زنم ک من در اینجا قصد دارم یک جستجو در یک مسیر خاص در درایوم رو به شما نشون بدم لازم به ذکر هست که این برنامه تمام مسیر یعنی تمام زیر شاخه ها رو هم در بر می گیره:

(http://barnamenevis.org/forum/attachment.php?attachmentid=25299&d=1226176400)

این هم یک مثال ساده تا بهتر متوجه بشیم:

PublicEnum StatC
vbStop = 0
vbRun = 1
vbPause = 2
EndEnum
Dim Stat_1 As StatC


Dim
Tr As Threading.Thread
برای آغاز کار
Public

Sub Start()
If Stat = StatC.vbStop Then
Me.Tr = New Thread(New ThreadStart(AddressOf Me.Roshan))
Tr.Priority =ThreadPriority.Highest
Tr.Start()
EndIf
End sub
برای ادامه وقتی که Pause استفاده شود
Public Sub Resume_()
IfNot IsNothing(Tr) Then Tr.Resume()
Stat_1 = StatC.vbPause
EndSub
برای توقف موقت
PublicSub Pause()
IfNot IsNothing(Tr) Then Tr.Suspend()
Stat_1 = StatC.vbPause
EndSub
برای از بین بردن
Public Sub _Stop()
IfNot IsNothing(Tr) Then Tr.Abort()
Stat_1 = StatC.vbStop
EndSub
پردازه بی نهایت
PrivateSub Roshan()
While (1)
....دستورات شما
End While
EndSub










قسمتی که به رنگ قرمز در آمده است (پرسپولیس:55:) این قسمت اهمیت این نخ را برای سیستم عامل شرح می دهد و اولویت این نخ بر اساس این متد تغییر می کند پس از آن به درستی استفاده کنید.

TAHA
02-15-2010, 06:39 PM
این کد زمان روشن بودن کامپیوتر رو بر حسب میلی ثانیه بر میگرداند. این قابلیت میتونه خیلی کارامد باشه در ضمن چون در یک متغیر 32 بیتی ذخیره میشود پس از 24 روز مقدار آن صفر میشود.
کد:


System.Environment.TickCount

TAHA
02-15-2010, 06:40 PM
این هم ایجاد یک شی در زمان اجرا و انتصاب رویداد کلید در زمان اجرا به آن شی :

کد:



Dim Bt As New Button
PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
Bt.Parent = Me

Bt.Location =
New Point(Me.Width / 2, Me.Height / 2)
Bt.Text = "Ok"

AddHandler Bt.Click, AddressOf BtClick
EndSub

PrivateSub BtClick(ByVal sender As Object, ByVal e As EventArgs)
MsgBox("Hello ...")
EndSub

همه رویداد همه اشیا از همین سبک قابل هدایت هستند.

TAHA
02-15-2010, 06:40 PM
دوست عزیزمان ساختن باتون در زمان اجرا را گفتند ، من هم Move کردن این باتون در زمان اجرا رو میگم. البته این کار بدون استفاده از Api ها هست



Dim mouse_offset As Point
Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
mouse_offset = New Point(-e.X, -e.Y)
End Sub
Private Sub Button1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseMove
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim mousePos As Point = sender.MousePosition
mousePos.Offset(mouse_offset.X - Button1.Height, mouse_offset.Y - Button1.Width)
sender.Location = mousePos
End If
End Sub

TAHA
02-15-2010, 06:41 PM
Code Snippet
این دفعه شما رو با Code Snippet ها اشنا میکنم.
Code Snippet ها کد های کوچک شده ایی هستند که باعث تسهیل در کد نوشتن میشوند. برای اینکه با این کد ها آشنا بشین در محیط کد نویسی ویژوال استادیو کلیک راست کنید و گزینه ی Insert Snippet ر وانتخاب کنید . ملاحضه میکنین که لیستی از این کد ها رو براتون میاره
برای نمونه ایتم Windows Operating System\Find the current user رو انتخاب بکنین
ملاحضه میکنین که متغیری تعریف میکنه که نام کاربر جاری در آن ذخیره شده.
این کدها کار برنامه نویس رو خیلی راحت تر میکنه. (به زودی نحوه ی ساخت این کد ها رو کامل بهتون میگم.). یکی از تفاوت هایی که ویژوال 2005 با نسخه های قبلی داره همین Code Snippet هاست.
مثلا در دات نت حلقه ی For یک CodeSnippet هست.
برای اینکه بتونید سریع تر به ساختار این کد ها دسترسی داشته باشین پس از نوشتن اسم انها(مثلا For) کلید TAB رو بزنید ملاحضه میکنین که چه اتفاقی صورت میگیره

TAHA
02-15-2010, 06:42 PM
تغییر اندازه خودکار فرم

حتما تا حالا برای شما هم پیش آمده که وقتی که نوع فونت فرم رو عوض می کنید اندازه فرم هم تغییر می کنه و اندازه فرم از حالت تنظیم شده خارج شده . بد نیست بدانید که همه این کارها توسط گزینه Auto Scale Mode انجام میشه . و حالا تنظیمات این گزینه :
:none -1
وقتی این گزینه رو انتخاب کنیم دیگه تنظیمات صفحه اصلاً بهم نمی خورد.
:Font -2
وقتی این گزینه رو انتخاب می کنیم موجب تغییر اندازه خودکار فرم و اشیای درون آن بر حسب اندازه و نوع قلم انتخاب شده برای فرم می شود.
:DPI -3
انتخاب این گرینه موجب تغییر اندازه فرم و اشیای دورن آن بر حسب DPI سیستمی که برنامه در آن اجرا می شود تغییر می کند.
مسیر Desktop->Properties->Setting->Advanced->General=DPI

:Inherit -4
متاسفانه تاثیر این گزینه رو نتونستم پیدا کنم.

TAHA
02-16-2010, 02:39 PM
.wysiwyg { BACKGROUND: #f5f5ff; FONT: 10pt tahoma,tahoma,tahoma; COLOR: #000000 } P { MARGIN: 0px } .inlineimg { VERTICAL-ALIGN: middle } سلام
آیا تا حالا توی برنامه هاتون نیاز داشتین که یه یه کد برنامه نویسی توسط کاربرتون وارد بشه و برنامتون اون رو کمپایل کنه؟
آیا تا به حال نیاز داشتین که توی برنامتون یه سری فرمول ریاضی از کاربرتون دریافت کنید و حلش کنید؟
آیا تا به حال به فکرتون رسیده که یه ماشین حسابی بنویسید که وقتی Button های روی اون رو فشار میدین فقط تکست مربوطه به Button توی یه TextBox ریخته بشه و بقیه کارها رو به عهده کمپایلر دات نت بندازید؟
خوب راه حل تمامی اینها و خیلی دیگر از این قبیل مشکلات کلاسهای موجود توی فضا نام CodeDome هستش.
در اینجا یه مثال ساده از استفاده از این کلاسها رو براتون میزارم . که تو زمان اجرا کاربر میتونه کدهاش رو به زبان VB بنویسه و کدها رو کمپایل کنه و خروجیش رو هم به صورت یه فایل EXE در بیاره.
خو ب ابتدا یه پروژه جدید ایجاد کنید و روی فرم اصلیتون دوتا TextBox و دوتا Button بزارید. خاصیت MultiLine مربوط به TextBox ها رو True کنید.
این هم از کدهای برنامه.
کد:





Imports System.CodeDom
Imports System.CodeDom.Compiler
Public Class Form1
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click, button2.Click
Dim codeProvider As New VBCodeProvider
Dim icc As ICodeCompiler = codeProvider.CreateCompiler
Dim Output As String = "Out.exe"
Dim ButtonObject As Button = CType(sender, Button)

textBox2.Text = ""
Dim parameters As New CompilerParameters()
Dim results As CompilerResults
'Make sure we generate an EXE, not a DLL
parameters.GenerateExecutable = True
parameters.OutputAssembly = Output
results = icc.CompileAssemblyFromSource(parameters, textBox1.Text)

If results.Errors.Count > 0 Then
'There were compiler errors
textBox2.ForeColor = Color.Red
Dim CompErr As CompilerError
For Each CompErr In results.Errors
textBox2.Text = textBox2.Text & _
"Line number " & CompErr.Line & _
", Error Number: " & CompErr.ErrorNumber & _
", '" & CompErr.ErrorText & ";" & _
Environment.NewLine & Environment.NewLine
Next
Else
'Successful Compile
textBox2.ForeColor = Color.Blue
textBox2.Text = "Success!"
'If we clicked run then launch the EXE
If ButtonObject.Text = "Run" Then Process.Start(Output)
End If

End Sub
End Class


برای تست کردن برنامتون هم میتونید. این کد رو توی قسمت ورودی کاربر کپی کنید.





Imports System
Imports System.Console
Module Module1
Sub Main()
Console.WriteLine("THIS IS A CODE DOME EXAMPLE!!")
Console.ReadLine()
End Sub
End Module



شکل کلی فرمتون هم به شکل زیر باید باشه.

http://pnu-club.com/imported/mising.jpg

امیدوارم به دردتون بخوره

TAHA
02-16-2010, 02:41 PM
حالا درمورد Transaction ها چیزی شنیدید؟
اگه برنامه نویس بانک اطلاعاتی هستین تا حالا فکر کردید که اگه در هنگام کار با بانک به مشکل پیشبینی نشده ایی برخورد کنید چه اتفاقی می افته؟http://pnu-club.com/imported/mising.jpg . مثلا شما دارید اطلاعاتی مالی رو از حساب خریدار به حساب مشتری انتقالز میدین . ناگهان در حین انجام این کار، برق بره http://pnu-club.com/imported/mising.jpg. تا حالا فکر کردین که تکلیف این اطلاعات چی میشه؟
برای اینکه در چنین مواقعی مشکلی برای برنامه پیش نیاد و اطلاعات از دست نره میتونین از SqlTransaction استفاده کنید. اگه از این کنترل استفاده کنید پس از بروز چنین مشکلاتی اطلاعات به شکل قبلی خودش بر میگرده.
برای اینکه بتونین از این کلاس استفاده کنید ابتدا باید به صورت زیر اون رو تعریف کنین

کد:

Dim tran As SqlClient.SqlTransaction اگه دقت کرده باشن احتیاج به کلمه ی New نداره!!!
پس از تعریف ان شما باید این متغیر را به کانکشن خود ارتباط دهید که به صورت زیر میباشد

کد:

tran = con.BeginTransaction همچنین باید این متغیر رو با Command خود هم مرتبط کنید به صورت زیر

کد:

cmd.Transaction = tran اگه برنامه دچار مشکل شد با دستور زیر اطلاعات بازگردانی میشه

کد:

tran.Rollback() اگر هم دچار مشکل نشد با دستور زیر اطلاعات در بانک ثبت میشه

کد:

tran.Commit() شما میتونین این دستورات رو به شکل زیر بنویسید

کد:



Dim con As New SqlClient.SqlConnection
Dim cmd As New SqlClient.SqlCommand
Dim tran As SqlClient.SqlTransaction
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
con.Open()
tran = con.BeginTransaction
cmd.Transaction = tran
Try
cmd.ExecuteNonQuery()
tran.Commit()
Catch ex As Exception
tran.Rollback()
MsgBox("Error")
End Try
End Sub
__________________

TAHA
02-16-2010, 02:43 PM
.wysiwyg { BACKGROUND: #f5f5ff; FONT: 10pt tahoma,tahoma,tahoma; COLOR: #000000 } P { MARGIN: 0px } .inlineimg { VERTICAL-ALIGN: middle } گرفتن نسخه ی پشتیبان از برنامه به چند صورت انجام میشه که من ساده ترین حالت و پر کاربرد ترین اونها رو قرار میدهم.
برای اینکه بتونیم از برنامه نسخه ی پشتیبان تهیه کنیم به صورت زیر عمل میکنیم

کد:




Cmd.CommandText = "Backup Database databasename to Disk='" & path & "'"
Cmd.ExecuteNonQuery()

این کد از برنامه نسخه ی پشتیبانی تهیه میکنه که نام و مسیر اون در متغیر path قرار گرفته.
(برای دیدن سایر روشهای گرفتن نسخه ی پشتیبان به Help خود Sql که کامل ترین مرجع است مراجعه کنید).
اما Restore کردن به راحتی گرفتن نسخه ی پشتیبان نیست. دلیلش هم اینه که شما وقتی به یک بانک متصل هستید نمیتونین اون رو تغییر بدین. برای این کار شما در ابتدا باید از دستور UseMaster استفاده کنین که بانک فعال شما تغییر پیدا کنه .
برای Restore کردن از کد زیر استفاده کنید

کد:





cmd.CommandText = "Use Master;ALTER DATABASE databasename SET SINGLE_USER with ROLLBACK IMMEDIATE;" & _
"RESTORE DATABASE databasename FROM DISK= '" & path & "' with REPLACE;" & _
"ALTER DATABASE databasename SET MULTI_USER"
cmd.ExecuteNonQuery()


در متغیر Path هم نام و مسیر همون فایل Bacup قرار گرفتهhttp://www.pnu-club.com/imported/mising.jpg

TAHA
02-16-2010, 02:45 PM
با سلام
حل مشکل Attach و ِDetach برای همیشه
تا حالا زیاد دیدم در مورد این مطلب سوال بشه و بعد از جستجو در سایت های مختلف این کدها بدست آمد :
Attach کردن به سرور بوسیله فایل mdf و :ldf

کد:



EXEC sp_attach_db @dbname='نام بانک ',
@filename1='مسیر فایل mdf',
@filename2='مسیر فایل ldf'


Attach کردن بوسیله فایل mdf





EXEC sp_attach_single_file_db @dbname='نام بانک',
@physname='مسیر فایل mdf'


Detach کردن
کد:

EXEC sp_detach_db 'نام بانک'رشته اتصال در SQL Server 2000
کد:

"data source=(local);integrated security=true"رشته اتصال در SQL Server 2005
کد:

"data source=./SQLEXPRESS;integrated security=true"کد های گفته شده را در یک SQLcommand قرار داده

TAHA
02-16-2010, 02:46 PM
.wysiwyg { BACKGROUND: #f5f5ff; FONT: 10pt tahoma,tahoma,tahoma; COLOR: #000000 } P { MARGIN: 0px } .inlineimg { VERTICAL-ALIGN: middle } تبدیل تاریخ از/به شمسی و دیگر تقویم ها :

تبدیل به میلادی:
کد:



Dim x As New System.Globalization.PersianCalendar
Dim dt As Date = x.ToDateTime(1386, 1, 1, 0, 0, 0, 0, 0)
تبدیل از میلادی

کد:




Dim x As New System.Globalization.PersianCalendar()

Dim dt As Date
dt = #1/1/2007#
'Or یا
dt = New Date(2007, 1, 1)
'Or یا
dt = CDate("1/1/2007")

Dim y As Integer = x.GetYear(dt)
Dim m As Integer = x.GetMonth(dt)
Dim d As Integer = x.GetDayOfMonth(dt)


دات نت 2 با تقویم میلادی در کل شامل 11 تقویم است!
مثلاً PersianCalendar تقویم ایرانی یا همان هجری شمسی است
یا HijriCalendar تقویم هجری قمری است
JapaneseCalendar ژاپنی
KoreanCalendar کره ای
TaiwanCalendar تایوانی
و...

برای تبدیل تاریخ های تقویم های دیگر به هم (که یک سرش میلادی نباشد) باید اول تاریخ مورد نظر را به میلادی تبدیل کرد و سپس میلادی را به تقویم دوم تبدیل کرد.

TAHA
02-16-2010, 02:46 PM
برای اینکه برنامه ایی که نوشتین فقط یک بار باز بشه (به صورت همزمان) تنظیمات زیر را انجام بدینhttp://www.pnu-club.com/imported/mising.jpg
در داخل ویژوال استادیو در Solution Explorer بر روی آیتم My Project دابل کلیک کنید تا یک پنجره برگه دار (tabbed window) باز شود. در این پنجره تنظیمات برنامه شما قرار دارد.بر روی برگه tab Application کلیک کنید و در قسمت windows application framework properties بر روی چک باکس Make Single instance application کلیک کنید تا انتخاب گردد.

در صورت انجام دادن مراحل بالا دیگر شما قادر نخواهید بود که کپی‌های دیگری از این برنامه را به صورت هم زمان بر روی آن کامپیوتر اجرا کنید و در صورت اجرا کردن نسخه‌های دیگر هیچ اتفاقی روی نخواهد داد و آنها فورا بسته خواهند شد.http://www.pnu-club.com/imported/mising.jpg

TAHA
02-16-2010, 02:48 PM
.wysiwyg { BACKGROUND: #f5f5ff; FONT: 10pt tahoma,tahoma,tahoma; COLOR: #000000 } P { MARGIN: 0px } .inlineimg { VERTICAL-ALIGN: middle } تا حالا در مورد کلاس System.Management چیزی شنیدید؟
اصلا کار این کلاس چیه؟
تا حالا شده که اطلاعاتی در مورد سیستم عامل ، سخت افزار ، نرم افزار های موجود در ویندوز و .... لازم داشته باشید و Api ها هم جواب گوی شما نباشند یا مشخصات اون Api رو بلد نباشین؟
حالا من قصد دارم چیز جدید و جالبی رو معرفی کنم. (لازمه که بگم من خودم تازه مطالعه روی این زمینه رو شروع کردم و اگه اشتباهی در گفته های من است از اساتید خواهش میکنم که به بزرگی خودشون ببخشند و اون رو اصلاح کنند.)
شما میتونید به وسیله ی زبان اسکریپتی WQL که همانند زبان SQL است کار های خارق العاده ایی انجام بدین. (نمونه کدی که روی اون کار میکنیم گرفتن مشخصات کارت گرافیکه)
کد زیر رو ببینید :





Imports System.Management
Public Class Form1
Dim ObjMng As Management.ManagementObject
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim c As New Management.ManagementObjectSearcher("SELECT * FROM Win32_DisplayConfiguration")
Dim DeviceName As String
Dim DisplayFlags As String
Dim DisplayFrequency As String
Dim DriverVersion As String
Dim PelsHeight As String
Dim PelsWidth As String
'--------------------
For Each ObjMng In c.Get
PelsWidth = ObjMng("DisplayFlags").ToString
DeviceName = ObjMng("DeviceName").ToString
DisplayFrequency = ObjMng("DisplayFrequency").ToString
DriverVersion = ObjMng("DriverVersion").ToString
PelsHeight = ObjMng("PelsHeight").ToString
PelsWidth = ObjMng("PelsWidth").ToString
Next
'---------------------------
MsgBox(PelsWidth)
MsgBox(DeviceName)
MsgBox(DisplayFrequency)
MsgBox(DriverVersion)
MsgBox(PelsHeight)
MsgBox(PelsWidth)
End Sub
End Class



در ابتدا باید رفرنس System.Management رو به برنامه اضافه کنیم.
ما به وسیله ی این کد یک جستجو با دستورات WQL انجام میدیم که حاصل اون در یک حلقه ی ForEach در متغیر ریخته میشه.

TAHA
02-16-2010, 03:26 PM
این هم تمامی کلید های ترکیبی که در VisualBasic 2005 وجود دارند.http://www.pnu-club.com/imported/mising.jpg



http://pnu-club.com/imported/2010/02/54.png

http://pnu-club.com/imported/2009/10/38.png

از لينك هاي دانلود زير استفاده كنيد


RapidShare: 1-CLICK Web hosting - Easy Filehosting (http://pnu-club.com/redirector.php?url=http%3A%2F%2Frapidshare.com%2Ff iles%2F351312687%2FVB_2005_color_Borna66.pdf.html)

يا

http://www.zshare.net/download/72630445636713e5/ (http://pnu-club.com/redirector.php?url=http%3A%2F%2Fwww.zshare.net%2Fd ownload%2F72630445636713e5%2F)

يا

Hotfile.com: One click file hosting (http://pnu-club.com/redirector.php?url=http%3A%2F%2Fhotfile.com%2Fdl%2 F28774851%2F2c02659%2FVB_2005_color_Borna66.pdf.ht ml)

يا

Deposit Files (http://pnu-club.com/redirector.php?url=http%3A%2F%2Fdepositfiles.com%2 Fen%2Ffiles%2Fvasi5abcs)

يا

http://www.zshare.net/download/72630445636713e5/ (http://pnu-club.com/redirector.php?url=http%3A%2F%2Fwww.zshare.net%2Fd ownload%2F72630445636713e5%2F)

يا

VB_2005_color_Borna66.pdf - Powered by Multiupload.com - BADONGO (http://pnu-club.com/redirector.php?url=http%3A%2F%2Fwww.badongo.com%2F file%2F20582473)

TAHA
02-28-2010, 09:23 PM
یک نمونه برنامه برای کار با مقادیر پولی

http://pnu-club.com/imported/mising.jpg

به صورت همزمان هنگام تایپ عدد این امکانات رو به شما میده:
1- 3 رقم 3 رقم جدا کردن عدد
2- نمایش معادل به تومان
3- استفاده از مقدار عددی بدون علامت در انجام محاسبات عددی

TAHA
02-28-2010, 09:24 PM
اضافه کردن رویداد سه بار کلیک به یک کنترل





Dim WithEvents Click3 As New TripleClick
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Click3.Click()
End Sub
Private Sub Click3_TplClick(ByVal Text As String) Handles Click3.TplClick
TextBox1.Text = Text
End Sub
Public Class TripleClick
Public Event TplClick(ByVal Text As String)
Public Sub Click()
Static intCount As Integer = 0
intCount += 1
If intCount >= 3 Then
intCount = 0
RaiseEvent TplClick("The Button was triple clicked.")
End If
End Sub
End Class

TAHA
02-28-2010, 09:26 PM
.wysiwyg { BACKGROUND: #f5f5ff; FONT: 10pt tahoma,tahoma,tahoma; COLOR: #000000 } P { MARGIN: 0px } .inlineimg { VERTICAL-ALIGN: middle } یکی از مشکلاتی که افراد زیادی با اون درگیر هستند اینه که :
ما در بانک یک جدول داریم که مشخصات افراد رو در اون ثبت میکنه


حالا میخوایم رو فرم یک ComboBox داشته باشیم که در اون نام افراد نشان داده بشه و با انتخاب هر فرد از این ComboBox یک ID که مربوط به همون فرد هست رو به ما نشون بده
خب برای این کار در ابتدا ما اطلاعات جدول را در یک DataSet یا DataTable میریزیم سپس کد زیر رو مینویسیم




ComboBox1.DataSource=Dt
ComboBox1.DisplayMember="Name"
ComboBox1.ValueMember="ID"
ComboBox1.Show()

TAHA
02-28-2010, 09:26 PM
.wysiwyg { BACKGROUND: #f5f5ff; FONT: 10pt tahoma,tahoma,tahoma; COLOR: #000000 } P { MARGIN: 0px } .inlineimg { VERTICAL-ALIGN: middle } دفعه یک پروپرتی جالب از TextBox رو میگم


پروپرتی ShortcutsEnabled که از نوع Boolean هست
بعضی وقتها میخواین که کاربر نتونه از تو TextBox متنی رو کپی کنه یا Undo کنه و ...
برای انجام اینکار این پروپرتی رو برابر False قرار بدین
عملیاتی که این پروپرتی مانع از انجام اونها میشه اینها هستند








CTRL+Z


CTRL+E


CTRL+C


CTRL+Y


CTRL+X


CTRL+BACKSPACE


CTRL+V


CTRL+DELETE


CTRL+A


SHIFT+DELETE


CTRL+L


SHIFT+INSERT


CTRL+R

TAHA
02-28-2010, 09:28 PM
.wysiwyg { BACKGROUND: #f5f5ff; FONT: 10pt tahoma,tahoma,tahoma; COLOR: #000000 } P { MARGIN: 0px } .inlineimg { VERTICAL-ALIGN: middle } سلام
حتما" تا حالا عبارت Region# را دیدید؟ و این سوال براتون پیش اومده که این عبارت چی هست و چه کاری انجام میده !!!
این دفعه میخوام در باره ی Directive ها توضیح بدم

Directive ها دستوراتی هستند که کامپایل نمیشوند بلکه کامپایلر رو هدایت میکنند تا دستور خاصی را کامپایل کنه. تمامی Directive ها با علامت # اغاز میشوند. تعداد این دستورات در C#‎ از VB بیشتره. من در این پست دستوراتی که در vb به کار میروند را توضیح میدمhttp://www.pnu-club.com/imported/mising.jpg



#Region "Name"

#End Region
این Directive برای دسته بندی قسمت هایی از کد استفاده میشه. مثلا شما یک کلاس دارید که در اون اعمال مختلفی انجام میشه مثلا قسمتی از این کلاس اعمال مربوط به اساتید رو انجام میده و قسمت دیگری اعمال مربوط به دانشجویان. با این Directive میتونین این اعمال را دسته بندی کنید.

کد:

C#‎onst

کار این Directive تعریف یک مقدار ثابته مثلا" در دستور زیر شما به جای عدد 3.14 میتونید بنویسید PI . از این پس کامپایلر هر کجا که کلمه PI رو دید به جای آن مقدار 3.14 را قرار میدهد
کد:

C#‎onst PI = 3.14





#If Then

#Else

#End If



عمل این Directive ها هم مثل if معمولی هست و فقط تفاوت اون هم در اینه که کامپایل نمیشه. پس شرط اون هم نباید کامپایل بشه. مثلا شما میتونید به این صورت از اون استفاده کنید





#If Pi = 3.14 Then
'Return True
#Else
'Return False
#End If


Directive اخری که هست اینه :




#ExternalSource("FilePath", 1)
MsgBox("In FilePath")
#End ExternalSource



راستش من هر کاری کردم بفهمم دقیقا" کار این Directive چیه نفهمیدم http://pnu-club.com/imported/mising.jpg
ولی تا اونجا که دستگیرم شد هنگامی که قسمتی از کد ما در یک فایل دیگر باشد با این Directive میتونیم از اونها استفاده کنیم و از خطا های احتمالی جلوگیری کنیمhttp://pnu-club.com/imported/mising.jpg
(اگه اشتباه میگم دوستان اصلاح کنندhttp://www.pnu-club.com/imported/mising.jpg)

TAHA
02-28-2010, 09:30 PM
.wysiwyg { BACKGROUND: #f5f5ff; FONT: 10pt tahoma,tahoma,tahoma; COLOR: #000000 } P { MARGIN: 0px } .inlineimg { VERTICAL-ALIGN: middle }
سلام
شاید شما هم از نوشتن دستورات SQL در برنامه خسته شده باشید.
نوشتن این دستورات (Insert,Update,Delete) باعث بروز مشکلات زیادی برای برنامه نویس میشه که خودتون بهتر میدونید http://www.pnu-club.com/imported/mising.jpg
حالا روشی را معرفی میکنم که دیگه احتیاجی به نوشتن این دستورات نداشته باشین
تعریف متغیر ها و مقدار دهی اولیه:




Dim con As SqlClient.SqlConnection = New SqlClient.SqlConnection("StrConnection")
con.Open()
Dim da As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter("Select * From Table1", con)
Dim dt As DataTable = New DataTable
da.Fill(dt)
Dim cmdbuild As SqlClient.SqlCommandBuilder



اضافه کردن سطر به DataTable :




Dim dr As DataRow
dr = dt.NewRow
dr("Fild 1") = "Value 1"
dr("Fild 2") = "Value 2"
dr("Fild N") = "Value N"
dt.Rows.Add(dr)
cmdbuild = New SqlClient.SqlCommandBuilder(da)
da.Update(dt)


ویرایش :




dt.Rows(0)("Fild 1") = "Value 1"
dt.Rows(0)("Fild 2") = "Value 2"
dt.Rows(0)("Fild N") = "Value N"
cmdbuild = New SqlClient.SqlCommandBuilder(da)
da.Update(dt)


حذف:



dt.Rows(0).Delete()
cmdbuild = New SqlClient.SqlCommandBuilder(da)
da.Update(dt)
شی SqlCommandBuilder ، تغییراتی که در DataTable داده شده است را به صورت دستورات SQL تبدیل میکند و در Da میریزد

TAHA
02-28-2010, 09:31 PM
.wysiwyg { BACKGROUND: #f5f5ff; FONT: 10pt tahoma,tahoma,tahoma; COLOR: #000000 } P { MARGIN: 0px } .inlineimg { VERTICAL-ALIGN: middle } سلام
حتما" بعضی از متد ها را دیدید که میتونید یک یا چند پارامتر به انها پاس کنید؟
یعنی اگر یک پارامتر به ان ارسال کنید برنامه کامپایل میشود و اگر هم دو یا بیشتر پارامتر به انها ارسال کنید باز هم برنامه کامپایل میشود.
پیش بار گذاری یا OverLoading این امکان را به شما میده که یک متد با لیست آرگومانهای متفاوت داشته باشین.
مثلا" ما یک تابع MessageBox داریم. حالا میخوایم این تابع به سه صورت فراخوانی بشه
1- فقط متن. 2- متن و عنوان 3- متن و عنوان و آیکون
برای این کار به این صورت عمل میکنیم:




Public Sub Msg(ByVal Text As String)
عملیات مربوط به حالت اول
End Sub

Public Sub Msg(ByVal TextAs String , ByVal Title As String)
عملیات مربوط به حالت دوم
End Sub

Public Sub Msg(ByVal Text As String, ByVal Title As String, ByVal Icon As Integer)
عملیات مربوط به حالت سوم
End Sub


اگر به صورت بالا عمل کنیم یعنی متد ها را OverLoad کنیم به خواسته ی خود میرسیم.
فقط باید این نکته را بدانیم که زمانی متد ها با یکدیگر OverLoad میشوند که فقط و فقط آرگومانهای انها با هم تفاوت داشته باشد.
در ضمن این عمل را میتوان با اختیاری کردن پارامتر ها هم انجام داد به این صورت که قبل از کلمه ی ByVal از کلمه ی Optional استفاده کنیم که ان پارامتر را اختیاری میکند. ولی اگر تعداد پارامتر ها زیاد باشد این روش چندان مناسب نیست و باعث گمراه کردن کاربر نیز میشود http://www.pnu-club.com/imported/mising.jpg

TAHA
02-28-2010, 09:33 PM
سلام دوستان
یکی از کار هایی که در خیلی از برنامه ها ی روتین مورد استفاده قرار میگیره تبدیل دیتاگرید و اطلاعات اون به فرمتهای مختلفی مثل Word,Excel و PDF هست که در این بین تبدیل اطلاعات به فرمت PDF از بقیه مشکل تر به نظر میاد. برنامه ای گذاشتم این کار رو با استفاده از کامپوننت rzPDFCreator.dll خیلی راحت کرده.

TAHA
02-28-2010, 09:34 PM
.wysiwyg { BACKGROUND: #f5f5ff; FONT: 10pt tahoma,tahoma,tahoma; COLOR: #000000 } P { MARGIN: 0px } .inlineimg { VERTICAL-ALIGN: middle } یه راهه خیلی ساده برای تبدیل اطلاعات دیتاگرید به Excel:







Private Sub ExportToExcel()
SaveFileDialog1.Filter = "*.xls|*.xls"
SaveFileDialog1.ShowDialog()
If SaveFileDialog1.FileName <> "" Then
Dim oExcel As Object
Dim oWorkBook As Object
Dim oSheet As Object
oExcel = CreateObject("Excel.Application")
oWorkBook = oExcel.Workbooks.Add
oExcel.visible = True
Dim c, r As Integer
Dim ColNum As Integer = DataGridView1.ColumnCount
Dim RowNum As Integer = DataGridView1.RowCount
Dim col As Integer = 65
oSheet = oWorkBook.worksheets(1)
For c = 1 To ColNum
oSheet.Range(CStr(Chr(col) & 1)).Value = DataGridView1.Columns(c - 1).HeaderText
col += 1
Next
For r = 1 To RowNum
For c = 1 To ColNum
oSheet.Cells(r + 1, c) = DataGridView1.Rows(r - 1).Cells(c - 1).Value
Next
Next
oWorkBook.SaveAs(SaveFileDialog1.FileName, True)
oSheet = Nothing
oWorkBook = Nothing
oExcel = Nothing
End If
End Sub