آموزش ویژوال بیسیک توسط حمید احمدی

hamidahmadi

Active Member
سایر انواع داده

درک داده های غیرعددی آسانتر است. توانائی ویژوال بیسیک در کار با رشته های متن فوق العاده می باشد. رشته ( String ) ترکیبی است از چند کاراکتر که حتی میتوانند عدد باشند ولی نمی توان بر روی آنها محاسبه انجام داد.
نام ، آدرس ، شماره تلفن یا حساب بانکی را میتوان به صورت رشته نمایش داد

ما در ویژوال بیسیک هفت نوع داده غیرعددی داریم



واژه های رشته ای همیشه بین دو علامت نقل قول (") یا کوتیشن قرار میگیرند و میتوانند شامل هر کاراکتری باشند

کد:
[color=blue]
"Oh Hamid Ahmadi"
"88-654-85296"
"521 Tehran"
""
[/color]

هر چیزی که بین دو علامت کوتیشن قرار گیرد یک رشته است حتی مثال آخر که هیچ کاراکتری ندارد.
رشته ای که طول آن صفر باشد رشته Null نامیده می شود

هنگام تعریف واژه هایی که حاوی تاریخ و وقت می باشند از علامت # استفاده می شود

کد:
[color=blue]
#10:20 pm#
#10.Dec.2007#
[/color]

نوع داده Boolean برای مواردی مناسب است که فقط دو مقدار بله یا خیر و از این قبیل می گیرد
نوع داده Variant می تواند هر مقداری ( به جز رشته های با طول ثابت ) را در خود جای دهد از این نوع داده زمانی استفاده کنید که از قبل دقیقا" ندانید با چه نوع داده ای سروکار خواهید داشت
به طور پیش فرض اگر نوع داده تعریف نشود ویژوال بیسیک نوع داده را Variant حساب می کند
 

hamidahmadi

Active Member
کار با متغیرها

متغیر مکانی برای نگهداری یک مقدار است. مقداری که در متغیر قرار داده میشود قابل تغییر است و وقتی مقداری را در یک متغیر قرار میدهید مقدار قبل آن از بین خواهد رفت. متغیر مکانیست در حافظه برای ذخیره کدن داده های موقتی برنامه.
برای اینکه یک متغیر در ویژوال بیسیک قابل استفاده باشد می بایست حتما قبلا" تعریف شده و نوع مقدار آن مشخص شود
 

hamidahmadi

Active Member
تعریف متغیرها

برای تعریف یک متغیر از کلمه کلیدی Dim استفاده می شود
شکل کلی این دستور به شرح ذیل می باشد

کد:
[color=green]
Dim VarName As DataType
[/color]

که در آن VarName نام متغیر و DataType یکی از انواع داده ویژوال بیسیک می باشد


متغیرهای مورد استفاده در یک روال باید در همان ابتدای روال تعریف شوند
متغیرهای تعریف شده در یک روال فقط در همان روال قابل استفاده اند و در هیچ روال دیگری قابل دسترسی نیستند به این قبیل متغیرها ( متغیرهای محلی ) گفته می شود.
متغیرهائی که در قسمت تعاریف مدول تعریف شوند از تمام روال های آن مدول قابل دسترسی خواهند بود به این گونه متغیرها ( متغیرهای عمومی ) گفته می شود
قواعد نامگذاری متغیرها به شرح ذیل می باشد

1- نام متغیر باید یکی از حروف الفبا باشد
2- نام متغیر میتواند از حروف و اعداد استفاده کند
3- طول یک متغیر نباید بیشتر از 255 کاراکتر داشته باشد
4- فاصله در نام متغیرها مجاز نیست

سعی کنید همیشه نام متغیرها را با این پیشوندها شروع کنید تا با یک نگاه سرسری در کد بتوانید نوع داده را متوجه شوید



در هر دستور Dim با استفاده از کاما میتوان بیش از یک متغیر را تعریف کرد

کد:
[color=red]
Dim intTotal As Integer , CurSales2007 As Currency
[/color]

اگر نوع داده را تعریف نکنیم ویژوال بیسیک آن را از نوع Variant تعریف خواهد کرد
سعی کنید از نامگذاری شتری برای تعریف متغیر استفاده کنید
 
آخرین ویرایش:

hamidahmadi

Active Member
تعریف رشته ها

هنگام تعریف یک رشته یک مشکل بوجود می آید چون دو نوع String وجود دارد : با طول ثابت و با طول متغیر
متداولترین رشته ها رشته های با طول متغیر هستند
کد:
[color=red]
Dim strCityName As String
[/color]

اما با طول ثابت اگر ما بخواهیم طول رشته ما ثابت باشد می بایست از این دستور استفاده کنیم
کد:
[color=red]
Dim varName As String * Lenght
[/color]

که در آن Length * به ویژوال بیسیک می گوید که طول رشته ما ثابت است
مثال :

کد:
[color=red]
Dim strZipCode As String * 5
[/color]

در اینجا ویژوال بیسیک یک رشته به طول 5 کاراکتر می گیرید و بقیه را دور می ریزد
 
آخرین ویرایش:

hamidahmadi

Active Member
مقدار دادن به متغیرها

بعد از تعریف یک متغیر می توان داده ها را در آن ذخیره کرد. ساده ترین راه برای ذخیره کردن یک مقدار در یک متغیر دستور انتساب است
شکل کلی این دستور به شرح زیر می باشد

کد:
[color=green]
ItemName = Expression
[/color]

که در آن ItemName نام یک متغیر ( یا خاصیت ) است و Expression می تواند یکی از موارد ذیل باشد

- یک عبارت محاسباتی
- یک واژه
- یک عبارت منطقی یا رشته ای
- مقدار خاصیت یک کنترل
- ترکیبی از عبارات محاسباتی یا منطقی ، واژه ها ، متغیرها و مقدار خواص کنترل

کد:
[color=green]
curSales = 12.20
dblValue = 45.1#
sngOld20Total = sngNew20Total – 1000.00
[/color]

مهمترین نکته درباره یک عبارت آن است که مقدار سمت راست عبارت به متغیر سمت چپ آن نسبت داده می شود . توجه به این نکته که مقدار سمت راست عبارت بایستی با نوع متغیر سمت چپ عبارت متناسب باشد
 

hamidahmadi

Active Member
عملگرهای ویژوال بیسیک

ویژوال بیسیک از عملگرهای محاسباتی و رشته ای متعددی پشتیبانی می کند



برای حالت Mod این عملگر باقیمانده یک تقسیم را برمیگرداند
برای حالت \ این عملگر حاصل تقسیم صحیح را برمیگردند
در عملگر & یا + که ترکیب رشته ها می باشد این عملگر با توجه به محلی که مورد استفاده قرار گرفته ( بین دو عدد و یا دو رشته ) واکنش مناسب را نشان می دهد
 
آخرین ویرایش:

hamidahmadi

Active Member
تقدم عملگرها

ویژوال بیسیک اعمال ریاضی را به ترتیب خاصی انجام می دهد

تقدم عملگرها



اگر از پرانتز استفاده نکنید ویژوال بیسیک همیشه ابتدا توان سپس ضرب و تقسیم و بعد از آن جمع و تفریق را انجام خواهد داد. اگر در یک عبارت عملگرهایی با تقدیم یکسان وجود داشته باشد ویژوال بیسیک محاسبات را از چپ به راست انجام می دهد
 
آخرین ویرایش:

hamidahmadi

Active Member
عملگرهای شرطی

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

عملگرهای شرطی ویژوال بیسیک به قرار ذیل می باشد


توجه کنید که نتیجه عملگرهای شرطی همیشه درست یا نادرست بوده و اینها مقادیر Boolean می باشند

عملگرهای شرطی نه فقط روی واژه ها بلکه روی عبارات ، متغیرها ، کنترل ها و یا ترکیبی از آنها هم عمل می کنند
هنگام استفاده از عملگرهای شرطی ممکن است حالت خاصی که به آن Null گفته می شود پیش بیاید که در این حالت ویژوال بیسیک مقدار Null برمیگرداند و برنامه نویس می بایست برای این حالت تمهیدی بیندیشد.

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

در صورتیکه این دستور در قسمت تعاریف باشد ویژوال بیسیک بین حروف بزرگ و کوچک تفاوتی قائل نمی شود

کد:
[color=green]
Option Compare Text
[/color]


در هنگام مقایسه دو مقدار نوع آنها می بایست با هم سازگار باشند یعنی نمیتوان یک عدد را با یک رشته مقایس کرد
 

hamidahmadi

Active Member
ترکیب عملگرهای شرطی و منطقی

از لحاظ تئوری شش عملگر شرطی ویژوال بیسیک قدرت کافی برای هر نوع مقایسه های را دارند ولی قدرت آنها با استفاده از عملگرهای منطقی بیشتر می شود
با عملگرهای منطقی میتوان دو یا چند مقایسه را با هم ترکیب کرد
عملگرهای منطقی عبارتند از :

1- And هر دو طرف باید درست باشند
2- Or یکی از دو طرف باید درست باشد
3- Xor فقط یکی از دو طرف باید درست باشد نه هر دو
4- Not نفی ارزش

 

hamidahmadi

Active Member
تقدیم عملگرهای ریاضی ، شرطی و منطقی

تقدیم عملگرهای ریاضی ، شرطی و منطقی به شرح ذیل می باشد

باز هم تکرار می کنیم سعی کنید از پرانتزها استفاده کنید تا عبارات شما قابل فهم باشد
 
آخرین ویرایش:

hamidahmadi

Active Member
دستور If و عملگرهای شرطی

یکی از مهمترین دستورات و به نظر من قشتنگترین دستور زبان برنامه نویسی ویژوال بیسیک دستور If است چون دقیقا" مانند یک گفتگوی روزمره زندگی است
کد:
[color=green]
اگر زود سر کارم بروم پس کارم زودتر تمام می شود
If ( زود سرکارم بروم ) then ( کارم زودتر تمام می شود )
[/color]

به همین راحتی
شکل کلی دستور اینچنین است

کد:
[color=green]
If Conditional Then
دستورات ویژوال بیسیک    
End If
 [/color]

که در اینجا Conditional یک عبارت یا متغیر شرطی است که جواب آن True و یا False است

مثال :

کد:
[color=green]
If ( txtPool.txt < 2000 Then )
   Lb1Pool = "شما پول کم دارید"
End If
[/color]

دستورات If زمانی کامل می شود که حالت نادرست هم پردازش شود

شکل کلی دستور اینچنین است

کد:
[color=green]
If Conditional Then
دستورات ویژوال بیسیک    
Else
دستورات ویژوال بیسیک    
End If
 [/color]

مثال
کد:
[color=green]
If ( txtPool.txt < 2000 Then )
    lb1Pool = "شما پول کم دارید"
Else
    lblPool = "از دستور خارج شو"
End If
[/color]

خروج زودرس
گاهی اوقات لازم است که بخواهیم یک رویداد را زودتر از موعد مقرر خاتمه دهیم برای اینکار از فرمان Exit sub استفاده میکنیم و اگر تابع باشد ( در مورد تابع بعدا" می خوانیم ) از Exit Function استفاده می کنیم


کد:
[color=green]
If ( txtSales.text < 500 ) then
     Exit sub    
End If
[/color]

دستور ElseIf
اگر بخواهیم یک دستور If … Else را در دستور دیگر If … Else قرار دهیم از ElseIf استفاده میکنیم

کد:
[color=green]
If ( intHours <= 40 ) then
     curOvertime = 0
ElseIf ( intHours <= 50 ) then
     curOvertime = 10
Else 
     Exit sub   
End If
[/color]
 
آخرین ویرایش:

hamidahmadi

Active Member
انتخاب با Select Case

بهترین روش برای بررسی شروط چندگانه دستور Select Case است اگر تعداد If تو دو تو بیش از سه یا چهار شود برنامه بسیار پیچیده خواهد شد
شکل کلی دستور اینچنین است
کد:
[color=red]
Select Case Expression
   Case expressin 
        یکی از دستورات ویژوال بیسیک
   Case expressin 1
        یکی از دستورات ویژوال بیسیک
   Case expressin 2
        یکی از دستورات ویژوال بیسیک
….
….
   Case expressin N
        یکی از دستورات ویژوال بیسیک
   Case Else
        یکی از دستورات ویژوال بیسیک
End Select
[/color]

مثال :

کد:
[color=red]
Select Case txtGrade.Text
Case A
   lblAnnotunce.Caption = "Perfect"
Case B
   lblAnnotunce.Caption = "Great"
Case C
   lblAnnotunce.Caption = "Study harder"
Case D
   lblAnnotunce.Caption = "Get help"
Case E
   lblAnnotunce.Caption = "Back to basics"
Case Else
   lblAnnotunce.Caption = "Error in grade"
End Select
[/color]

مثالی که من را با Select Case بهتر آشنا کرد این کد بود
کدی که در رابطه با زدن کلیدهای کیبرد مربوط به سه دکمه Shift و Ctrlو Alt بود. فعلا" به بعضی از کدها توجه نکنید و فقط به Select Case توجه کنید

کد:
[color=red]
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim intShift As Integer
intShift = Shift And 7
Select Case intShift
Case 1
   lblShift.Caption = "Shift"
Case 2
   lblShift.Caption = "Ctrl"
Case 3
   lblShift.Caption = "Shift & Ctrl"
Case 4
   lblShift.Caption = "Alt"
Case 5
   lblShift.Caption = "Shift & Alt"
Case 6
   lblShift.Caption = "Alt & Ctrl"
Case 7
   lblShift.Caption = "Shift & Ctrl & Alt"
End Select
End Sub
[/color]


در این مثال با زدن دکمه Shift بر روی برچسب ما میزند Shift
با زدن دکمه Ctrl بر روی برچسب ما میزند Ctrl
و الی آخر ( به کد توجه کنید )


Select Case از نوع های دیگری نیز پیروی می کند که در آن از عملگر شرطی Is برای تست شروط استفاده می شود

مثال :
کد:
[color=red]
Select Case txtGrade.Text
Case is > = 90
   lblAnnotunce.Caption = "Perfect"
Case is > = 80
   lblAnnotunce.Caption = "Great"
Case is > = 70
   lblAnnotunce.Caption = "Study harder"
Case is > = 60
   lblAnnotunce.Caption = "Get help"
Case Else
   lblAnnotunce.Caption = "Error in grade"
End Select
[/color]

و نوع دیگر آن استفاده از عملگر To می باشد به مثال توجه کنید

کد:
[color=red]
Select Case txtGrade.Text
Case 0 to 59
   lblAnnotunce.Caption = "Back to Basics"
Case 60 to 69
   lblAnnotunce.Caption = "Get help"
Case 70 to 79
   lblAnnotunce.Caption = "Study harder"
Case 80 to 89
   lblAnnotunce.Caption = "Great"

Case Else
   lblAnnotunce.Caption = "Prefect"
End Select
[/color]

سه نوع دستور Select Case را می توان با هم ترکیب کرد
کد:
[color=red]
Case 101,102, 201 To 205, is > 300
[/color]
 

hamidahmadi

Active Member
تکرار با استفاده از حلقه

در ویژوال بیسیک با دستوراتی که به دستورات حلقه معروفند میتوان تعدادی دستور را به دفعات دلخواه تکرار کرد.
برای این بتوان بدون استفاده از جعبه متن با کاربر ارتباط برقرار کرد و اطلاعاتی را از وی گرفت می بایست از حلقه استفاده کرد

در ویژوال بیسیک دو نوع حلقه وجود دارد

1- حلقه Do
2- حلقه For
 

hamidahmadi

Active Member
حلقه Do

ساختار حلقه چند خطی Do نیز چند شکل مختلف دارد

شکل کلی آن به قرار ذیل می باشد
کد:
[color=blue]
Do While condition
یکی از دستورات ویژوال بیسیک
Loop

Do 
یکی از دستورات ویژوال بیسیک
Loop While condition
[/color]

کد:
[color=blue]
Do Until condition
یکی از دستورات ویژوال بیسیک
Loop

[code][color=blue]
Do 
یکی از دستورات ویژوال بیسیک
Loop Until condition 
[/color]

شرط condition در حلقه Do میتواند هر عبارت یا متغیر منطقی باشد که True یا False بر میگرداند

- محل تست شرط حلقه : اگر شرط حلقه در ابتدای آن تست شود ممکن است این حلقه هرگز اجرا نشود اما اگر تست حلقه در انتهای آن صورت بگیرد حلقه حداقل یکبار اجرا میشود چون ویژوال بیسیک فقط بعد از اجرای حلقه است که شرط را تست خواهد کرد
- خصلت تست حلقه : حلقه هایی که While دارند مادامی که تست درست است اجرا میشوند ولی در حلقه های Until اگر شرط درست شود اجرای حلقه پایان خواهد یافت

کد:
[color=blue]
Do While intCtr <= 10
lblOut.Caption = intCtr
[color=red]
intCtr = intCtr + 1
[/color]
Loop
[/color]


یکی از مهمترین نکات در حلقه ها این است که شرط حلقه باید در بدنه حلقه تغییر کند چون اگر چنین نشود حلقه تا ابد ادامه خواهد یافت به همین خاطر در مثال بالا توسط عملگر انتساب مقدار intCtr یکی اضافه میشود

intCtr = intCtr + 1


یک مثال :

کد:
[color=blue]
Private Sub cmdPrint_Click()
Dim Counter As Integer
Counter = txtInput.Text
lblDisplay.Caption = ""
If txtInput.Text = Null Then
Exit Sub
End If
Do While Counter > 0
lblDisplay.Caption = lblDisplay.Caption & "#"
Counter = Counter - 1
Loop
End Sub
[/color]

در این مثال می بایست برای txtInput.Text فقط از عدد استفاده کنید چون در غیر اینصورت دچار Error می شوید
 

hamidahmadi

Active Member
حلقه For

در این حلقه مجموعه ای شامل یک یا چند دستور به تعداد دفعات ثابت یا تا وقتی یک شرط ارضاء شود اجرا می گردند

شکل کلی دستور به قرار ذیل می باشد

کد:
[color=blue]
For intCounter = intStart To intend [Step intIncrement]
یکی از دستورات ویژوال بیسیک
Next [intCounter]
[/color]

intCounter یک متغیر عددیست که بدنه حلقه را کنترل می کند. ویژوال بیسیک قبل از شروع حلقه intCounter را به intStart تنظیم می کند.
مقدار intStart معمولا" از عدد 1 شروع می شود ولی میتواند هر عدد دیگری هم باشد با هر تکرار حلقه مقدار intIncrement به intCounter اضافه می شود اگر قسمت Step حذف شود حلقه For مقدار 1 را برای intIncrement فرض خواهد کرد. عدد intend پایان حلقه را کنترل می کند. هرگاه intCounter از intend بیشتر شود ویژوال بیسیک دیگر حلقه را تکرار نمی کند و برنامه را از دستورات بعد از Next دنبال خواهد کرد
توجه به این نکته که اگر مقدار Step مثبت باشد شمارش حلقه صعودی و اگر مقدار Step منفی باشد شمارش حلقه نزولی خواهد بود


کد:
[color=blue]
For intCounter = 1 to 10
lblOut.Caption = intCtr
Next 
[/color]


و با استفاده از Step


کد:
[color=blue]
For intCounter = 10 to 100 Step 5
lblOut.Caption = intCtr
Next 
[/color]
حلقه از 10 شروع شده و با افزایش های 5 تایی تا 100 بالا می رود
در زمانی که حلقه های تودرتو داریم حلقه از داخلی ترین حلقه شروع می شود و به حلقه بیرونی می آید

کد:
[color=blue]

Private Sub cmdPrint_Click()
Dim intX As Integer
For intX = 1 To 10
If intX = 5 Then
   Exit For
End If
Print intX
Next intX
End Sub
[/color]
برای خروج زودرس از دستور Do و دستور For ازExit Do و Exit For استفاده می شود
 
آخرین ویرایش:

hamidahmadi

Active Member
تعریف توابع

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

توابع داخلی

تابع داخلی مثل یک جعبه جادوئی است که مقادیری را که به آن میفرستیم میگیرد و سپس یک مقدار را به برنامه ما برمیگرداند و به آن تابع ذاتی نیز گفته می شود چون همراه ویژوال بیسیک ارائه میشود و یک کار خاص مثل محاسبه یا عملیات ورودی و خروجی را انجام می دهد

آرگومان

- مقادیری که به یک تابع منتقل می شود آرگومان می گویند. آرگومانها درون پرانتزی که به همراه تابع است قرار میگیرند. در صورت ارسال چند آرگومان از کاما استفاده می شود
- می بایستی نوع آرگومان را با ترتیبی که تابع نیاز دارد مطابقت دهیم مثلا" اگر یک تابع به دو آرگومان نیاز داشته باشد که اولی یک رشته و دومی یک مقدار صحیح می باشند باید این آرگومانها را با همان ترتیب وارد کنیم.
 

hamidahmadi

Active Member
تابع ( )LoadPicture

این تابع فقط یک آرگومان می گیرد که آن نام فایل تصویر می باشد
و چه چیزی برمیگرداند ؟ واضح است تصویری که نام فایل آن داده شده است. مقدار برگشتی این تابع به خاصیت Picture کنترل imgHappy نسبت داده شده چون بدون این کار کنترل مزبور نمی تواند تصویر را نمایش دهد



 

hamidahmadi

Active Member
تابع ( )MsgBox

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

شکل کلی دستور MsgBox ( ) به قرار ذیل است
کد:
[color=green]
intResponse = msgbox(strPrompt [,intSytle][, strTitle])
[/color]

این تابع یک آرگومان اجباری strPrompt و دو آرگومان اختیاری intStyle و strTitle دارد و از نوع پیشوند آنها میتوان فهمید که نوع آنها چیست ؟

- آرگومان اول strprompt پیامیست که جعبه پیام باید نشان دهد
- آرگومان دوم intStyle تعداد و نوع دکمه های جعبه پیام را تعیین می کند
- آرگومان سوم strTitle عنوان پنجره جعبه پیام خواهد بود
- مقدار برگشتی تابع در متغیر صحیح intResponse قرار خواهد گرفت.




برای تعیین تعداد و نوع دکمه های جعبه پیام از جدول ذیل استفاده می کنیم.



و برای اینکه بفهمیم کدام دکمه کلیک شده است از جدول ذیل استفاده میکنیم



 

hamidahmadi

Active Member
استفاده از ثابت های نام دار

اگر در جدول توجه کرده باشید ستونی تحت عنوان نام ثابت در آن می بینید. ویژوال بیسیک صدها ثابت دارد که آنها را به نام می شناسد به اینها ثابت نامدار می گویند
مقدار این ثابت ها همیشه ثابت است و نمیتوان آنها را تغییر داد. استفاده از ثابت های نامدار وضوح برنامه را افزایش خواهد داد.
ضمن اینکه میتوان از اعداد کنار آنها نیز بهره برد
 

hamidahmadi

Active Member
دکمه های پیش فرض

همیشه اولین دکمه جعبه پیام ( از سمت چپ ) دکمه پیش فرض است یعنی زدن Enter معادل کلیک کردن آن دکمه خواهد بود
اما با استفاده از مقادیر جدول ذیل میتوان این رفتار را تغییر داد




در اعمال بحرانی مانند حذف فایل ها دکمه Cancel را دکمه پیش فرض جعبه پیام قرار دهید تا اگر کاربر تصادفا" کلید Enter را زد عملیات لغو شود.
 

جدیدترین ارسال ها

بالا