hamidahmadi
Active Member
دوستان به این نتیجه رسیدم که فقط خواندن کتاب ویژوال بیسیک نمیتواند در یادگیری این زبان کاملا" موفق باشد و می بایست خود نیز مسئله هائی را طرح کرده و آن ها را انجام دهیم.
شاید برایتان جالب باشد که بدانید من برای فکر کردن به این مثالی که در ذیل خواهم گفت حداقل یک ساعت وقت گذاشتم
مسئله من حرکت یک برچسب در روی فرم بود به شرطی که وقتی این برچسب به سمت چپ فرم رسید به سمت راست حرکت کند و وقتی به سمت راست رسید به سمت چپ حرکت کند .
اولش به نظرم آسان می آمد و پیش خود میگفتم خوب کاری ندارد یک شرط می سازم بدین صورت که اگر Left برچسب من مساوی صفر شد به برچسب خود در یک رویداد تایمر یک مقدار اضافه میکنم و اگر به قسمت راست فرمم رسید از آن کم می کنم . اما مسئله به همین راحتی هم نبود.
خوب حالا من سعی می کنم برای راهنمائی شما و اینکه در ویژوال بیسیک معمولا" اینطور مطرح است که سعی کنید رویدادهای بزرگ را به قسمت های کوچک تقسیم کنید و آنها را در مدول های عمومی قرار دهید این مسئله را که به راحتی در یک مدول فرم میتوان نوشت از مدول های عمومی نیز استفاده کنم
خوب حالا مواد لازم برای طرح این مسئله و حل آن :
یک فرم
یک لیبل
یک تایمر
بهترین مکان برای بار کردن خصوصیات این فرم و برچسب معمولا" قسمت لود فرم می باشد پس در لود فرم می نوسیم :
توضیح درباره قسمت With و End With این است که هرگاه بخواهیم خاصیتهای زیادی از یک کنترل خود را استفاده کنیم برای راحتی کار از کلمه With همراه با اسم آن کنترل شروع کرده و با گذاشتن یک نقطه از خاصیتهای مختلف آن کنترل استفاده می کنیم و با کلمه End With آن را خاتمه میدهیم .
پس ما نیز در مورد فرم و برچسب خود اینکار را کردیم تا هرگاه فرم ما لود شود این خاصیتهای ذکر شده در مورد فرم اصلاح شود
حال ما از دو مدول استفاده میکنیم یکی برای حرکت برچسب به سمت راست و یکی برای حرکت برچسب به سمت چپ
در قسمت Project Explorer در قسمت راست ویژوال بیسیک راست کلیک کرده گزینه Add و سپس گزینه Module را انتخاب کنید و در صفحه باز شده بر روی Open کلیک کنید یک صفحه کد باز می شود به قسمت مشخصات خاصیتها بروید و اسم مدول را Jam بگذارید از این مدول برای حرکت به سمت راست استفاده می کنیم به قسمت منوی ویژوال بیسیک بروید و از منوی Tools بر روی گزینه Add Procedure کلیک کنید در قسمت Name کلمه J را بنویسید و آن را از نوع Sub و Public انتخاب کنید و در قسمت وسط آن این کد را بنویسید
دوباره یک مدول جدید باز کنید به اسم Menha و رویداد M برای حرکت به سمت چپ و این کد را در آن بنویسید
توضیح در مورد این کدها این است که اولا" برای اینکه این کدها را در فرم خود صدا کنیم می بایست این رویداد یک اسم داشته باشد و آن هم از نوع Public که فرم ما بتواند این رویداد را بشناسد و توضیح اینکه در یک مدول عمومی اگر بخواهید از خاصیت یک کنترل استفاده کنید حتما" می بایست توضیح دهید این کنترل در کدام فرم استفاده شده است و ما در اینجا قسمت چپ برچسب خود را با حالت انتساب در هر حرکت به مقدار 10 تیوپ کم و یا اضافه می کنیم
حال برمیگردیم به فرم خود و بر روی قسمت تایمر با یک دستور If به فرم خود میگوئیم که اگر برچسب ما به چپ فرم رسید مدول Jam را اجرا کن و اگر به راست فرم رسید مدول Menha را اجرا کن و خاصیت Interval تایمر خود را 10 میگذاریم
اما اینجا یک مسئله خیلی بزرگ بوجود می آید و آن این است که قسمت چپ برچسب فقط در یک حالت به صفر و در یک حالت به قسمت راست فرم می رسد و برچسب دیگر نمیتواند حرکت کند و اگر از علامت بزرگتر و کوچکتر هم استفاده کنیم می بینم که باز مشکل دارد چون حرکت برچسب در یک نقطه هی 10 تیوپ کم می شود و هی 10 تیوپ اضافه می شود و در واقع برچسب در یک نقطه می ماند به نظر شما راه حل چیست ؟
من آن را با یک متغیر از نوع Boolean حل کردم و در واقع به فرم گفتم که اگر چپ برچسب من به صفر رسید مدول منها را خاموش کن و مدول جم را اجرا کن و اگر برچسب من به راست فرم رسید مدول منها را خاموش کن و مدول جم را اجرا کن
پس ما نیاز به یک متغیر از نوع بولن داریم و آن را در قسمت General فرم خود تعریف میکنیم و در قسمت لود فرم هم تغییراتی می دهیم
در ذیل کد فرم را مشاهده می کنید
اگر به یک خط از کد فرم توجه کرده باشید به قسمت چپ فرم با خاصیت انتساب عرض برچسب از عرض ScaleWidth فرم کم شده است و اگر این خط را حذف کنید می بیند که در هنگامی که برچسب به راست فرم میرسد به اندازه عرض برچسب نیز برچسب ما به سمت راست حرکت می کند و سپس برمیگردد که با این خط کد این مشکل حل شده است اما چرا ScaleWidth فرم و نه width فرم و آن به این خاطر است که قسمت های لبه فرم در خاصیت ScaleWidth حساب نمیشود و آن را نیز شما میتواند با عوض کردن متن کد از ScaleWidth فرم با width فرم شاهد باشید.
حال آن را اجرا کنید و به حرکت متن حمید احمدی که به راست و چپ فرم خورده و حرکت میکند توجه کنید
شاید برایتان جالب باشد که بدانید من برای فکر کردن به این مثالی که در ذیل خواهم گفت حداقل یک ساعت وقت گذاشتم
مسئله من حرکت یک برچسب در روی فرم بود به شرطی که وقتی این برچسب به سمت چپ فرم رسید به سمت راست حرکت کند و وقتی به سمت راست رسید به سمت چپ حرکت کند .
اولش به نظرم آسان می آمد و پیش خود میگفتم خوب کاری ندارد یک شرط می سازم بدین صورت که اگر Left برچسب من مساوی صفر شد به برچسب خود در یک رویداد تایمر یک مقدار اضافه میکنم و اگر به قسمت راست فرمم رسید از آن کم می کنم . اما مسئله به همین راحتی هم نبود.
خوب حالا من سعی می کنم برای راهنمائی شما و اینکه در ویژوال بیسیک معمولا" اینطور مطرح است که سعی کنید رویدادهای بزرگ را به قسمت های کوچک تقسیم کنید و آنها را در مدول های عمومی قرار دهید این مسئله را که به راحتی در یک مدول فرم میتوان نوشت از مدول های عمومی نیز استفاده کنم
خوب حالا مواد لازم برای طرح این مسئله و حل آن :
یک فرم
یک لیبل
یک تایمر
بهترین مکان برای بار کردن خصوصیات این فرم و برچسب معمولا" قسمت لود فرم می باشد پس در لود فرم می نوسیم :
کد:
[left][color=green]
Private Sub Form_Load()
With Form1
.Height = 750
.Width = 4800
End With
With Label1
.Top = 0
.Left = 0
.AutoSize = True
.Caption = "Hamid Ahmadi"
.ForeColor = vbBlue
End With
End Sub
[/color][/left]
پس ما نیز در مورد فرم و برچسب خود اینکار را کردیم تا هرگاه فرم ما لود شود این خاصیتهای ذکر شده در مورد فرم اصلاح شود
حال ما از دو مدول استفاده میکنیم یکی برای حرکت برچسب به سمت راست و یکی برای حرکت برچسب به سمت چپ
در قسمت Project Explorer در قسمت راست ویژوال بیسیک راست کلیک کرده گزینه Add و سپس گزینه Module را انتخاب کنید و در صفحه باز شده بر روی Open کلیک کنید یک صفحه کد باز می شود به قسمت مشخصات خاصیتها بروید و اسم مدول را Jam بگذارید از این مدول برای حرکت به سمت راست استفاده می کنیم به قسمت منوی ویژوال بیسیک بروید و از منوی Tools بر روی گزینه Add Procedure کلیک کنید در قسمت Name کلمه J را بنویسید و آن را از نوع Sub و Public انتخاب کنید و در قسمت وسط آن این کد را بنویسید
کد:
[left][color=red]
Public Sub J()
Form1.Label1.Left = Form1.Label1.Left + 10
End Sub
[/color][/left]
دوباره یک مدول جدید باز کنید به اسم Menha و رویداد M برای حرکت به سمت چپ و این کد را در آن بنویسید
کد:
[left][color=blue]
Public Sub M()
Form1.Label1.Left = Form1.Label1.Left - 10
End Sub
[/color][/left]
توضیح در مورد این کدها این است که اولا" برای اینکه این کدها را در فرم خود صدا کنیم می بایست این رویداد یک اسم داشته باشد و آن هم از نوع Public که فرم ما بتواند این رویداد را بشناسد و توضیح اینکه در یک مدول عمومی اگر بخواهید از خاصیت یک کنترل استفاده کنید حتما" می بایست توضیح دهید این کنترل در کدام فرم استفاده شده است و ما در اینجا قسمت چپ برچسب خود را با حالت انتساب در هر حرکت به مقدار 10 تیوپ کم و یا اضافه می کنیم
حال برمیگردیم به فرم خود و بر روی قسمت تایمر با یک دستور If به فرم خود میگوئیم که اگر برچسب ما به چپ فرم رسید مدول Jam را اجرا کن و اگر به راست فرم رسید مدول Menha را اجرا کن و خاصیت Interval تایمر خود را 10 میگذاریم
اما اینجا یک مسئله خیلی بزرگ بوجود می آید و آن این است که قسمت چپ برچسب فقط در یک حالت به صفر و در یک حالت به قسمت راست فرم می رسد و برچسب دیگر نمیتواند حرکت کند و اگر از علامت بزرگتر و کوچکتر هم استفاده کنیم می بینم که باز مشکل دارد چون حرکت برچسب در یک نقطه هی 10 تیوپ کم می شود و هی 10 تیوپ اضافه می شود و در واقع برچسب در یک نقطه می ماند به نظر شما راه حل چیست ؟
من آن را با یک متغیر از نوع Boolean حل کردم و در واقع به فرم گفتم که اگر چپ برچسب من به صفر رسید مدول منها را خاموش کن و مدول جم را اجرا کن و اگر برچسب من به راست فرم رسید مدول منها را خاموش کن و مدول جم را اجرا کن
پس ما نیاز به یک متغیر از نوع بولن داریم و آن را در قسمت General فرم خود تعریف میکنیم و در قسمت لود فرم هم تغییراتی می دهیم
در ذیل کد فرم را مشاهده می کنید
کد:
[left][color=green]
Dim B As Boolean
Private Sub Form_Load()
With Form1
.Height = 750
.Width = 4800
End With
With Label1
.Top = 0
.Left = 0
.AutoSize = True
.Caption = "Hamid Ahmadi"
.ForeColor = vbBlue
End With
Timer1.Enabled = True
Timer1.Interval = 10
B = True
End Sub
Private Sub Timer1_Timer()
If B = True Then
If Label1.Left = 0 Then
B = False
Else
Menha.M
End If
End If
If B = False Then
If Label1.Left = (Form1.ScaleWidth - Label1.Width) Then
B = True
Else
Jam.J
End If
End If
End Sub
[/color][/left]
اگر به یک خط از کد فرم توجه کرده باشید به قسمت چپ فرم با خاصیت انتساب عرض برچسب از عرض ScaleWidth فرم کم شده است و اگر این خط را حذف کنید می بیند که در هنگامی که برچسب به راست فرم میرسد به اندازه عرض برچسب نیز برچسب ما به سمت راست حرکت می کند و سپس برمیگردد که با این خط کد این مشکل حل شده است اما چرا ScaleWidth فرم و نه width فرم و آن به این خاطر است که قسمت های لبه فرم در خاصیت ScaleWidth حساب نمیشود و آن را نیز شما میتواند با عوض کردن متن کد از ScaleWidth فرم با width فرم شاهد باشید.
حال آن را اجرا کنید و به حرکت متن حمید احمدی که به راست و چپ فرم خورده و حرکت میکند توجه کنید
آخرین ویرایش: