1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

آموزش مقدماتي و جامع ويژوال بيسيك 6 Visual Basic

شروع موضوع توسط minaaa ‏11/11/11 در انجمن VB

  1. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش مقدماتي و جامع ويژوال بيسيك 6 Visual Basic

    كنترلهاي ديگر

    1- دكمه هاي گزينه اي

    دكمه هاي گزينه اي يا همان OptionButton امكان انتخاب تنها يك گزينه را بين گزينه هاي موجود فراهم مي آورد.با كليك كردن دكمه گزينه اي يا با ارسال فوكوس به دكمه گزينه اي و فشردن Spacebar جهت گزينش آن ، كاربر يك دكمه گزينه اي را انتخاب مي كند يا از انتخاب خارج مي سازد.وقتي كه دكمه اي انتخاب شده باشد،نقطه سياه رنگي در مركز دايره آن پديدار مي گردد.
    دكمه هاي گزينه اي به صورت يك به چند عمل مي كنند.يعني در هر زمان تنها يك دكمه گزينه اي مي تواند انتخاب شده باشد.براي اينكه مطمئن شويد كه در هر زمان تنها يك گزينه انتخاب شده است لازم نيست كار خاصي انجام دهيد،وقتي كه گزينه ديگري را انتخاب مي كنيد ،ويژوال بيسيك ابتدا گزينه اي كه قبلا انتخاب شده بود را غير فعال مي سازد و سپس گزينه جديد را انتخاب مي نمايد.

    نكته: به دكمه هاي گزينه اي گاهي اوقات دكمه هاي راديوئي نيز گفته مي شود.

    دكمه هاي گزينه اي داراي خصوصيات زيادي هستند كه از قبل با آنها آشنائي داريد.خصوصيت Alignment مشخص مي سازد كه متن دكمه گزينه اي در سمت چپ يا در سمت راست قرار گيرد.
    خصوصيت Value احتمالا مهمترين خصوصيت دكمه هاي گزينه اي است .زيرا خصوصيت Value در زمان اجرا تغيير مي يابد و مشخص مي سازد كه كدام دكمه گزينه اي انتخاب شده است؟

    قاب ها و دكمه هاي گزينه اي

    قاب ، ناحيه مستطيلي بر روي فرم است كه كنترل هاي ديگر را در بر دارد و كنترل ها را در يك مجموعه گروه بندي مي كند.قاب ممكن است داراي عنواني نيز باشد.
    اگر دكمه هاي گزينه اي داخل يك قاب (Frame) قرار گيرند و دكمه هاي ديگري نيز در خارج قاب روي فرم و يا در قاب ديگري داشته باشيم.قانون انتخاب يك گزينه از چند گزينه تنها در هر دسته تعريف مي شود.
    اجازه دهيد با ذكر مثال با مفهوم دكمه هاي گزينه اي و قاب و كار با مشخصات دكمه ها بيشتر آشنا شويم.

    همانند شكل زير يك قاب يا همان frame روي فرم قرار دهيد ونام انرا framcolor و دو دكمه راديوئي به نامهاي optred و optblue روي آن قرار دهيد.خاصيت Caption آن را به ترتيب برابر Red و Blue قرار دهيد.
    همچنين دو دكمه گزينه اي ديگر به نامهاي optred1 و optblue1 با caption هاي red و Blue را روي فرم و خارج از قاب قرار دهيد.

    [​IMG]


    كد هاي زير را بنويسيد ( به روالهاي كد ها دقت كنيد).

    کد:
    کد:

    Private Sub optblue_Click() framcolor.BackColor = vbBlue End Sub Private Sub optblue1_Click() Form1.BackColor = vbBlue End Sub Private Sub optred_Click() framcolor.BackColor = vbRed End Sub Private Sub optred1_Click() Form1.BackColor = vbRed End Sub

    حال با اجراي برنامه خواهيد ديد كه هر كدام از دكمه ها كه در يك دسته قرار گرفته اند مستقل نسبت به دسته ديگر عمل مي كنندو شما با فشردن دكمه هاي درونقاب رنگ قاب را به رنگ نوشته شده و با انتخاب هر كدام از دكمه هاي روي فرم رنگ فرم را به رنگ نوشته شده تغيير خواهيد داد.
    دقت كنيد كه با انتخاب هر كدام از دكمه ها خاصيت Value آن دكمه مقدار True و خاصيت Value دكمه ديگر مقدار False خواهد گرفت.

    نكته مهم: شما به جاي نوشتن كد رنگ مورد نظر مي توانيد از اسامي آنها با يك پيشوند Vb استفاده كنيد.(به كد نوشته شده دقت كنيد)
     
  2. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش مقدماتي و جامع ويژوال بيسيك 6 Visual Basic

    كنترلهاي ديگر ( ادامه )

    2- كادرهاي بررسي (CheckBox)

    كنترل كادر بررسي با دو تفاوت ،درست مانند دكمه گزينه اي عمل مي كند:
    1- كادر بررسي انتخاب شده ، حالت انتخاب را با يك علامت بررسي نشان مي دهد.
    2- كادرهاي بررسي هيچگاه دو به دو ناسازگار نيستند.
    بنابراين كار بر مي تواند يك يا چند كادر بررسي را انتخاب كند، حتي اگر آن كادر هاي بررسي بر روي يك قاب يا بر روي يك فرم قرار داشته باشند.

    3- نوارهاي پيمايش عمودي و افقي

    نوار هاي پيمايش امكان كنترل تغيير مقادير را براي كاربران فراهم مي آورند .به جاي تايپ كردن مقاديري مشخص كاربر مي تواند با ماوس نوارهاي پيمايش را حركت دهدتا موقعيت هاي نسبي را درون محدوده اي از مقادير مشخص سازد.جعبه ابزار داراي كنترل هائي براي نوارهاي پيمايش عمودي و افقي است.
    از مهمترين خصوصيات نوارهاي پيمايش مي توان به موارد زير اشاره كرد:
    LargeChange: مقدار تغيير نوار پيمايش را در هنگامي كه كاربر درون ناحيه نوار پيمايش كليك مي نمايد،مشخص ميسازد.
    Max: حداكثر تعداد واحدي كه مقدار نوار پيمايش در بيشترين تنظيم خود نشان مي دهد،تعيين مي نمايد.محدوده از مقدار 1 (مقدار پيش گزيده Max) تا 32767 است.
    Min: حداقلر تعداد واحدي كه مقدار نوار پيمايش در كمترين تنظيم خود نشان مي دهد،تعيين مي نمايد.محدوده از مقدار 1 (مقدار پيش گزيده Min) تا 32767 است.
    SmallChange: مقداري كه در هر بار كليك كردن كاربر روي نوار پيمايش يا بر روي يكي از دو سر نوار پيمايش ،نوار پيمايش تغيير مي كند را مشخص مي سازد.
    Value: واحد اندازه گيري را كه در حال حاضر توسط موقعيت نوار پيمايش نشان داده شده است را شامل ميشود.
    وقتي نوار پيمايش را بر روي يك فرم قرار مي دهيددر آن زمان بايد تصميم بگيريد كه چه محدوده اي از مقادير را نوار پيمايش بايد نمايش دهد.
    اندازه فيزيكي نوار پيمايش وقتي كه كاربر از نوار يمايش چيزي را انتخاب مي كند بر روي مقادير برگردانده شده نوار پيمايش اثري ندارد.نوارهاي پيمايش فرم خود را طوري تنظيم كنيدكه به اندازه كافي دراز يا پهن باشند تا تقريبا براي كليه اقلامي كه بايد نمايش دهند اندازه باشند.
    اجازه دهيد با يك مثال به تشريح كادرهاي بررسي و نوار پيمايش بپردازيم:
    روي فرم دو عدد كنترل كادر بررسي قراردهيد و به ترتيب خاصيت Name آنها را ChkBold و ChkItalic و خاصيت Caption آنها را Bold و Italic قرار دهيد.
    يك برچسب به فرم اضافه كنيد و خاصيت Name آنرا lblTest و ‍Caption آنرا ‌WWW.Binyaz.net قرار دهيد.ضمن اينكه خاصيت Alignment آنرا Center قرار دهيد.
    همچنين يك كنترل نوار پيمايش عمودي كنار برچسب قرار دهيد و خاصيت Name آنرا به svbFontChange تغيير دهيد.در خاصيت Min مقدار 8 , در خاصيت Max مقدار 24 را قرار دهيد ضمن اينكه در خاصيت ُSmallChange مقدار 2 را قرار دهيد.
    يك Textbox كوچك زيز برچسب قرار دهيد تا بتوانيد اندازه فونت را در آن ببينيد(مقدار نوار پيمايش).نام آنرا txtFontSize قرار دهيد و در خاصيت Text جمله نوشته شده را پاك كنيد و مقدار خالي بگذاريد.


    [​IMG]

    حال كد زير را بنويسيد.(مي دانيد كه روي هر كنترلي مي توانيد دابل كليك كرده و كد مربوطه را در روال ذكر شده بنويسيد ولي در اينجا مي توانيد كل كد را كپي و در صفحه كد Paste نمائيد.)

    کد:
    کد:

    Private Sub chkBold_Click() If chkBold Then lbltest.FontBold = True Else lbltest.FontBold = flse End If End Sub Private Sub chkItalic_Click() If chkItalic Then lbltest.FontItalic = True Else lbltest.FontItalic = False End If End Sub Private Sub Form_Load() txtFontSize.Text = vsbFontChange.Value End Sub Private Sub vsbFontChange_Change() lbltest.FontSize = vsbFontChange.Value txtFontSize.Text = vsbFontChange.Value End Sub ُ ​

    حال برنامه را اجرا كنيد خواهيد ديد كه با تغيير دادن نوار پيمايش علاوه بر تغيير سايز فونت برچسب مقدار سايز فونت نيز نمايش مي يابد و با انتخاب كادرهاي ليستي بالا حالت فونت را به Bold و Italic و با عدم انتخاب آنها به بالعكس تغيير دهيد
     
  3. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش مقدماتي و جامع ويژوال بيسيك 6 Visual Basic

    كنترل زمان سنج (Timer)

    برنامه نويسان حرفه اي معمولا از اين كنترل استفاده مي كنند.در هنگام نوشتن برنامه ممكن است اين نياز به وجود آيد كه مايل باشيد يك اتفاق يا رويداد و يا عملي در برنامه با فاصله هاي زماني مشخص ، حادث شود.اينجاست كه اين كنترل مورد استفاده قرار مي گيرد.
    كنترل تايمر برخلاف هر كنترل ديگري كه تا به حال ديده ايد عمل مي نمايد.اين كنترل هميشه درپس زمينه در حال اجراست و كاربر هيچ گاه آنر روي فرم نمي بيند.در حين زمان طراحي ،كنترل تايمر را خواهيد ديد زيرا لازم است كه قادر به انتخاب كنترل و تغيير خصوصيات آن باشيد.
    كامپيوتر شما داراي ساعتي داخلي است كه هميشه در حال اجرا است.سخت افزار كامپيوتر براي نوسازيهاي حافظه و تنظيم چرخه CPU به ساعت دقيقي نياز دارد.
    كنترل تايمر تنها هفت خصوصيت دارد و مانند ساير كنترلهاي ديگر داراي تنظيمات ظاهري نظير تنظيم و انتخاب رنگ ، فونت و از اين دست نيست زيرا اين كنترل هيچگاه در هنگام اجرا پديدار نمي گردد.

    نكته : محل قرار گرفتن زمان سنج روي فرم كاملا اختياري است و تاثيري در اجراي برنامه ندارد.

    حال به خصوصيات كنترل زمان سنج يا همان تايمر مي پردازيم:
    name: اين خاصيت نام تايمر است كه قبلا با موارد مشابه توضيح داده شد.با انتخاب اين نام هنگام دابل كليك روي تايمر و براي نوشتن كدهاي مربوط به رويداد تايمر اين نان براي شناسائي رويداد مورد استفاده قرار مي گيرد.
    Enabled : خاصيت مهمي است كه براي آماده به كار بودن تايمر و يا عدم آماده به كار بودن تايمر با قرار دادن مقادير True و False مورد استفاده قرار مي گيرد.
    اگر مقدار اين خصوصيت False باشد ديگر رويداد مربوط به تايمر اتفاق نخواهد افتاد.
    Interval: اين خصوصيت مهمترين خصوصيت كنترل تايمر است. اين خصوصيت مي تواند مقاديري بين 1 تا 65535 بپذيرد.اين مقدار به ميلي ثانيه بوده كه بر مبناي آن رويداد مربوط به تايمر اتفاق مي افتد به عنوان مثال اگر اين مقدار 1000 در نظر گرفته شود رويداد مربوط به تايمر هر ثانيه اتفاق مي افتد.
    به مثال زير توجه كنيد:
    روي فرم يك كنترل تايمر قرار دهيد و به ترتيب خاصيت Name آنرا tmrColor و مقدار Interval آنرا 1000 قرار دهيد.روي كنترل تايمر دابل كليك كنيد و كد زير را بنويسيد.با اجراي اين برنامه رنگ فرم شما هر ثانيه به آبي و قرمز تبديل مي شود يعني ثانيه اي آبي و ثانيه اي بعد قرمز.

    کد:
    کد:

    Dim mode As Boolean Private Sub tmrColor_Timer() mode = Not mode If mode Then Me.BackColor = vbRed Else Me.BackColor = vbBlue End If End Sub

    نكته مهم : در كد به عبارت Me توجه كنيد.اين عبارت به فرم جاري اشاره دارد و شما به جاي نوشتن فرم جاري و استفاده از خصوصيات آن مي توانيد از عبارت Me استفاده كنيد.

    نكته : مقدار Interval تايمر در خود برنامه و حين اجراي برنامه نيز قابل تغيير است.
     
  4. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش مقدماتي و جامع ويژوال بيسيك 6 Visual Basic

    [h=2][​IMG][/h]
    كادر هاي تبادلي

    كنترل كادر هاي تبادلي اين امكان را به شما مي دهند كه كه در برنامه خود بتوانيد فايلي را باز ويا ذخيره كنيد، رنگ و يا فونتي دلخواه را به كار گيريد و ...
    اگر چه كنترل كادر هاي تبادلي به عنوان يكي از كنترل هاي استاندارد شناخته مي شود،اما تا وقتي اين كنترل را اضافه نكنيد،در جعبه ابزار نمايش نمي يابد.اين مراحل را دنبال كنيد تا اين كنترل به جعبه ابزار شما اضافه گردد.
    از منوي Project گزينه components را انتخاب نمائيد تا اين پنجره نمايش داده شود.
    نمونه هاي مختلفي از كامپوننتهايي كه مي توانيد در برنامه استفاده كنيدرادر اينجا خواهيد ديد.
    به دنبال گزينه Microsoft common Dialog Control 6.0 بگرديد و تيك آنرا بگذاريدو روي دكمه Ok كليك كنيد.
    خواهيد ديد كه يك كنترل همانند شكل زير به جعبه ابزار شما اضافه گرديده است:

    [​IMG]


    حال مي توانيد اين كنترل را به فرم خود اضافه كنيد.اما قبل از آشنايي با نحوه كد نويسي اجازه دهيد توضيح مختصري در مورد امكانات اين كنترل عرض كنم.
    اين كنترل امكان باز گشايي كادر هاي كنترلي File Open و File Save ، Font، Color و همچنين Printer را به شما مي دهد.
    كادر تبادلي File Open و file Save را در بسياري از برنامه هاي ويندوز ديده ايد همان كادر معروفي كه بهشما امكان باز كردن و ذخيره يك فايل با نام دلخواه را مي دهد.كادر تبادلي Color امكان انتخاب ميليونها رنگ را براي استفاده در اختيار شما قرار مي دهد.همچنين كادر تبادلي Font نيز اين امكان را به شما مي دهد كه از ميان فونتهاي نصب شده روي كامپيوتر خود فونتي دلخواه را براي كنترلهاي ديگر برنامه انتخاب كنيد.همچنين كادر تبادلي Print اطلاعاتي را كه كاربر در مورد كادر چاپي انتخاب مي كند برمي گرداند.

    توليد كادر هاي تبادلي مرسوم

    وقتي كنترل كادرهاي تبادلي را به فرمتان اضافه كرديد در پنجره خصوصيات اين كنترل گزينه اي را به نام Custom مشاهده خواهيد كرد.با انتخاب سه نقطه كنار اين خوصيت پنجره Property Pages را مشاهده خواهيد كرد كه داراي سربرگ هايي به شكل زير است:

    [​IMG]



    از اين برگه به عنوان تنظيمات سريع و پيش فرض كنترل تبادلي مي توانيد استفاده كنيد.به عنوان مثال مي توانيد نام فونت و size آن همچنين يك رنگ دلخواه و مسيري پيش فرض را براي باز كردن بگنجانيد.

    براي نمايش يك كادر تبادلي خاص ف برنامه كاربردي شما بايد يكي از روش هاي زير را بكا برد.
    ShowColor
    ShowFont
    ShowHelp
    ShowOpen
    ShowPrinter
    ShowSave

    بنابراين اگر نام كنترل كادرهاي تبادلي مرسوم شما cdbFile باشد برنامه كاربردي شما مي تواند كادر تبادلي Filesave را با اين حكم نمايش دهد:
    cdbFille.ShowSave
    براي نكمايش كادر تبادلي File Open برنامه كاربردي شما ممكن است حاوي كد زير باشد:

    کد:
    کد:

    cdbFile.DialogTitle = "File Open" cdbFile.Filter = "*.txt" cdbFile.FileName = "*.txt" cdbFile.ShowOpen

    همچنين براي file save نيز مي توانيد از موارد مشابه استفاده كنيد.
    نكته مهم :اين دستورات فقط باعث نمايش كادر تبادلي و باز گرداندن نام فايل انتخاب شده خواهند شد و فايلي را باز يا Save نخواهند كرد.براي اين منظور بايد به كد نويسي مربوط به آن مسلط باشيد.
    براي كادر تبادلي Color لازم است كه خصوصيت Dialog Title آنرا تغيير دهيدو روش صحيح را تغيير دهيداگر كد زير را در روال Load فرم قرار دهيد به محض اجراي برنامه كادر تبادلي Color نمايش خواهد يافت و شما با انتخاب رنگ دلخواه BackColor فرم خود را مي توانيد تغيير دهيد.

    کد:
    کد:

    Private Sub Form_Load() cdbFile.DialogTitle = "select color" cdbFile.ShowColor Me.BackColor = cdbFile.Color End Sub
    همچنين براي نمايش كادر تبادلي فونت به مثال زير توجه كنيد:
    يك Lable روي فرم قرار دهيد و كد زير را در روال Load فرم بنويسيد:

    کد:
    کد:

    Private Sub Form_Load() Label1.Caption = "shahram" cdbFile.Flags = cdlCFEffects Or cdlCFBoth cdbFile.ShowFont Label1.Font = cdbFile.FontName Label1.FontBold = True End Sub

    به خط سوم كد هاي فوق دقت كنيد.جايي كه Flag مربوط به فونت معرفي شده است.اگر اين كار انجام نشود ممكن است در حين اجراي برنام با پيغام خطايي مبني بر عدم نصب فونتها مواجه شويد.

     
  5. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش مقدماتي و جامع ويژوال بيسيك 6 Visual Basic

    برنامه نويسي ساخت يافته 1(استفاده از زير برنامه ها)

    هنرمندي برنامه نويسان حرفه اي استفاده از يك ساختار مناسب كد نويسي است.ساختاري كه با يك ايده منطقي و هدفمند به ما در استفاده ، عيب يابي و ارتقا برنامه كمك ميكند.
    هنر شما در اين نيست كه كدهاي طولاني بنويسيد بلكه در اين است كه رويه هاي كد كوتاهي بنويسيد.اصطلاحا بدنه اصلي برنامه شما بايد نسبتا كم حجم باشد و كدهاي طولاني را به زير روال ها واگذار كنيد.برنامه نويسي ساخت يافته روشي در برنامه نويسي است كه براي تقسيم بندي برنامه هاي بزرگ به چندين رويه كوچك كه هر كدام كار خاصي انجام مي دهند ، مورد استفاده قرار مي گيرد.

    فراخواني رويه ها و بازگشت آنها

    براي فراخواني يك زير برنامه در برنامه اصلي به شكل زير عمل مي كنيم:

    Call Procedure
    وقتي كه رويه اي داراي يك حكم Call است حكم Call رويه جاري را در انتظار مي گذارد و رويه فراخواني شده (Procedure) را اجرا مي نمايد.

    نكته مهم: واژه Call به ندرت در VB استفاده مي شود و استفاده از اين واژه اختياري است.يعني براي فراخواني رويه نوشتن نام رويه هم كفايت مي كند.

    وقتي كه اجراي رويه اي به يك حكم Call برخورد مي كند آن رويه در حالت انتظار قرار مي گيرد تا در اجراي رويه جديد به حكم End Sub و يا Exit Sub برخورد كند.

    براي نوشتن يك رويه بدين ترتيب عمل مي كنيم:
    بعد از اجراي ويژوال بيسيك و رفتن به بخش كدنويسي از منويTools گزينه Add Procedure را برمي گزينيم تا نجره اي باز شود .در قسمت Name نام زير روال و در قسمت type گزينه Sub و در قسمت Scope يكي از گزينه هاي Public و يا Private را انتخاب مي كنيم.

    نكته مهم : اگر رويه اي با كليد Private آغاز شده باشد تنها رويه هايي كه در همان يمانه قرار دارند مي توانند آن را فراخواني كنند.برعكس اگر با Public به معني عمومي فراخوانده شوند تمامي رويه هاي داخل پروژه مي توانند آنرا فراخواني كنند.

    مثال :
    فرض كنيد در يك برنامه بخواهيد ابتدا نمرات 10 درس خود را وارد كنيد و برنامه ميانگين نمره شما را نمايش دهد.
    يك دكمه روي فرم قرار دهد و كدهاي زير را وارد كنيد:

    کد:
    کد:

    Dim Number(9) As Single Private Sub Command1_Click() ‍Call InputData Call Avrage End Sub Private Sub InputData() For i = 0 To 9 Number(i) = InputBox("enter " & i & " Grade") Next End Sub Private Sub Avrage() Dim sumgarade As Single Dim avg As Single sumgrade = 0 For i = 0 To 9 sumgrade = sumgrade + Number(i) Next avg = sumgrade / 10 MsgBox "Your Avrage is: " & avg End Sub

    همانطور كه ملاحظه مي كنيد من هر قسمت از كدها را با رنگهاي متفاوت براي درك بهتر شما جدا كرده ام.كد تك خطي اول براي معرفي يك آرايه به نام Number جهت ذخيره كردن نمرات 10 درس شماست.
    قسمت بعد رويه اصلي برنامه است كه با فشردن دكمه فراخواني مي شود.در اين رويه ميبينيد كه تنها 2 خط كد نوشته شده است كه يكي زير روال دريافت نمرات و ديگري زير روال محاسبه ميانگين نمرات را فراخواني مي كند.
    دو زير روال ذكر شده هم از هم متمايز شده اند و شما به راحتي مي توانيد به منطق ساده آن پي ببريد.
    در رويه اصلي هنگامي كه برنامه به خط InputData رسيد به زير روال InputData پرش كرده و كدهاي داخل آن زير روال را اجرا مي كند.پس از رسيدن به حكم End Sub مجددا به رويه اصلي بازگشته و به خط Avrage مي رود و اين بار به زير روال Avrage رفته و كدهاي درون اين زير روال را اجرا مي كند.
    تا اينجا با نحوه نوشتن روال و زير روال و همچنين نحوه فراخواني زير روال آشنا شديد. در درسهاي بعدي با آرگومانها و توابع بازگشتي آشنا خواهيد شد.

    نكته: در يك زير روال نيز مي توانيد يك زير روال ديگر را فراخواني كنيد.

     
    یک شخص از این تشکر کرد.