PDA

View Full Version : مبتدی: غیر فعال کردن sub مورد نظر



mr-adler
چهارشنبه 20 مهر 1390, 12:53 عصر
با سلام خدمت همه عزیزان :قلب:
ایا راهی است که از اجرای یک sub که باید اجرا بشه جلوگیری کرد؟مثلا فرض کنید یک تایمر با اینترول 5000 داریم و تو قسمت کد این تایمر دستوراتی رو نوشتیم.میشه قبل از فرا رسیدن زمان اجرا شدن دستور , sub رو غیر فعال کرد تا دستوراتی که تایمر قراره اجرا کنه اجرا نشه؟
منظورم استفاده از خاصیت هایی مثل enable یا مثلا دستور timer1.interval=0 نیست:لبخند:. میخوام یه چیزی به شکل زیر باشه exite sub یا end یا ... :متفکر:
سوال مهم تر اینه که راه دوباره فراخوانی اون دستورات بعد از اینکه غیر فعال شدند چیه؟{(با دستور call که برای فراخوانی دستورات یک کنترل استفاده میشه تا حدودی اشنا هستم.اما ترکیب این دو عمل یعنی فعال شدن پس از غیر فعال بودن رو نمیدونم)}
ممنون میشم یکم توضیح بدید.../:ناراحت:

Restlesa
چهارشنبه 20 مهر 1390, 13:26 عصر
براي غير فعال كردن يه Sub Rootin كافي كه از دستور Exit Sub استفاده كنيد
براي فعال كردن دوباره Sub‌ موزد نظر از همون دستور Call هم مي تونيد استفاده كنيد و يا تنها نام Sub Rootin مورد نظرتونو ذكر كنيد

mr-adler
چهارشنبه 20 مهر 1390, 14:39 عصر
ممنونم :قلب:
کلمه exit sub رو چطور استفاده کنم و همچنین call رو؟ اگه یه مثال بزنید خیلی عالی میشه. در مورد غیر فعال کردن و فراخوانی غیر فعال شده

Restlesa
چهارشنبه 20 مهر 1390, 14:52 عصر
كاري نداره كه دوست عزيز
دستور Exit Sub رو به همين نحوي كه نوشتم به قسمت مورد نظر برنامه ات اضافه كن و براي استفاده از دستور Call هم كافي كه اين دستور رو به اضافه نام Sub روتين مورد نظرت به كار ببري. به مثال زير توجه كن :

Public Sub SaveFile()
If CommonDialog.FileName = "" Then
Call SaveAsFile
Exit Sub
End If
On Error Resume Next
If Err.Number = cdlCancel Then
Cancel = 1
Else
Open CommonDialog.FileName For Random As #1 Len = Len(NewAUCFile)
Records = LOF(1) \ Len(NewAUCFile)
Put #1, Records + 1, NewAUCFile
Close #1
ActiveForm.Caption = SetCaptionForm
FState(ActiveForm.Tag).Dirty = False
End If
End Sub
در اين مثال ميايم خاصيت FileName ابزار CommonDialog خودمون رو چك مي كنيم. اگر اين خاصيت برابر با Null بود ( يعني هيچ مسيري انتخاب نشده بود) Sub روتين SaveAzFile رو صدا ميزنيم. وقتي كه اين دستور اجرا بشه كامپايلر برنامه به قسمت Sub روتين SaveAzFile ميره و دستورات اونو اجرا مي كنه و دوباره برمي گرده به SaveFile و خط بعدي اين Sub رو كه Exit Sub هستش اجرا مي كنه و كلا از داخل اين Sub خارج مي شه و مابقي كدها اجرا نميشن
اميدوارم توضيحم كامل بوده باشه ... براي تشكر كردن هم نياز به زدن پست اضافي نيست ... رو همون دكمه تشكر كه كليك كني كافيه :چشمک:

mr-adler
چهارشنبه 20 مهر 1390, 15:05 عصر
این مباحث درست , عملکرد exit sub & call رو نشون میده اما وقتی بخواهیم به وسیله یه کنترل عملکرد کدهای کنترلی دیگر را تعیین کنیم چیکار باید بکنیم؟
مثلا در مثالی که در پست یک زدم اگه بخوام به وسیله یه کامند از اجرای دستورات تایمر جلوگیری کنم(همچنین فراخوانی)اونوقت چیکار باید بکنم؟

اميدوارم توضيحم كامل بوده باشه ...
عالی بود ممنونم

براي تشكر كردن هم نياز به زدن پست اضافي نيست ...
پستی که من زدم صرفا جهت تشکر نبود برای درخواست مثال هم بود

ممنون:لبخندساده:

M.T.P
چهارشنبه 20 مهر 1390, 17:35 عصر
اگه Sub مربوط به تایمر باشه که با Enabled تایمر فعال و غیر فعال میشه اما اگه یک Sub در برنامه دارید و در شرایطی خاص می خواهید از کار بیفته و یا خونده نشه راه های مختلفی هست.
به عنوان مثال ابتدا شرط رو بررسی کنید بعد Sub رو صدا بزنید:


If condition = True Then Call MySub

و یا اینکه شرط رو در Sub بررسی کنید و در صورت درست نبودن شرط از Sub خارج بشه:


Sub MySub()
If condition = False Then Exit Sub

'Sub Codes...
End Sub

mr-adler
چهارشنبه 20 مهر 1390, 17:58 عصر
ممنونم , این مواردی که گفتید کاملا درسته اما"

این مباحث درست , عملکرد exit sub & call رو نشون میده اما وقتی بخواهیم به وسیله یه کنترل عملکرد کدهای کنترلی دیگر را تعیین کنیم چیکار باید بکنیم؟
مثلا فرض کنیم بخواهیم از طریق رویداد کلیک کامند ,کدی که در رویداد کلیک کامندی دیگر رخ میدهد را به وسیله exit sub غیر فعال کنیم.ایا راهی وجود داره؟ یا فقط از درون خود کنترل میشه اینکارا رو کرد؟
مثلا در کامند یک بنویسیم exit sub command2 و به وسیله این کد کامند دوم را غیر فعال کنیم.

aria1o
چهارشنبه 20 مهر 1390, 18:33 عصر
سلام
دوست عزیز دقیق تر بگو میخوای چکاری انجام بدی.
ولی این سئوالای شما به نظر من برنامه شما رو شلوغ میکنن. شرط و حلقه در برنامه نویسی برای طراحی این چیزایی که شما میخوای انجام بدی. ایجاد یه function که اگه شرط برقرار بود برنامه function رو صدا بزنه "call"....
برای توقف در یه روال البته اگه منظورت "STOP" یا "Puse" کردن برنامه باشه کافی یه متغیر از نوع Boolean تعریف کنی و درون حلقه این متغیر چک بشه.تا زمانی که True هست کار انجام میشه و وقتی False شد برنامه به حالت انتظار میره....

امید وارم منظورت رو درست گرفته باشم..

mr-adler
چهارشنبه 20 مهر 1390, 18:56 عصر
نمونه بسیار جالبی بود ممنون .
بزارید یه مثال براتون بزنم:
فرض کنید ما یه کامند داریم که 5 خط کد در رویداد کلیک برای این کامند تعریف کردیم.با کلیک بر روی کامند دستورات اون اجرا میشه. کامند دو را روی صفحه ایجاد میکنیم.میخوام با کلیک بر روی کامند دوم , کامند اولی یا اصلا اجرا نشه یا مثلا از خط سوم به بعد اجرا بشه . دقت کنید که این کا رو میشه با exit sub از داخل کامند اولی انجام داد اما میخوام این کار رو به وسیله یک کنترل دیگه انجام بدم. ایا ممکنه؟
میدونید هدفم چیه:
به راحتی میشه با خاصیت enabled از طریق یک شی ,شی دیگر رو غیر فعال کرد اما اینطوری تمام کدهای اون غیر فعال میشه . من میخوام اون قسمتهایی رو که تعیین میشه باقی بمونه(منظورم کدها هستن) که این مورد به وسیله خاصیت enabled قابل انجام نیست.اگه راهی هست خیلی لازمش دارم:ناراحت: ممنون میشم عنوان کنید

aria1o
چهارشنبه 20 مهر 1390, 19:33 عصر
دوست عزیز اول از همه این مطلب رو مد نظر بگیر که هر کد در کمتر از ثانیه داره اجرا میشه...پس کاربر نمیتونه بفهمه کجای کد هست که بخواد برنامه رو قطع کنه...

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

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

just4froum
چهارشنبه 20 مهر 1390, 19:52 عصر
یه روش عجیب

ببین با این کارت راه میفته ؟؟؟

Dim ms1 As Boolean, ms2 As Boolean, ms3 As Boolean

Private Sub Command1_Click()
If ms1 = True Then Call ms_sub1
If ms2 = True Then Call ms_sub2
If ms3 = True Then Call ms_sub3
End Sub

Private Sub ms_sub1()
MsgBox "This is first Sub"
End Sub

Private Sub ms_sub2()
MsgBox "This is second Sub"
End Sub

Private Sub ms_sub3()
MsgBox "This is third Sub"
End Sub

Private Sub Command2_Click()
ms1 = False
ms3 = False
Command1_Click
End Sub

Private Sub Form_Load()
ms1 = True
ms2 = True
ms3 = True
End Sub


موفق باشید .

mr-adler
چهارشنبه 20 مهر 1390, 21:10 عصر
جالب بود . بهم ایده داد.هر چند که پاسخ سوالم هنوز برام مبهمه:متفکر:

Private Sub ms_sub2()
MsgBox "This is second Sub"
End Sub
ms_sub1 مربوط به کدوم شی و کدوم رویداده؟ تا به حال با ایم مورد روبرو نشدم:متفکر:

aria1o
چهارشنبه 20 مهر 1390, 22:14 عصر
سلام
ﺍﯾﻦ ﺩﻭﺳﺘﻤﻮﻥ ﺍﻭﻣﺪﻩ ﯾﻪ ﺗﺎﺑﻊ ﺗﻌﺮﯾﻒ ﮐﺮﺩﻩ ﻭ ﺑﺎ ﮐﺎﻝ ﺻﺪﺍﺵ ﻣﯿﺰﻧﻪ....
ﮐﺎﻣﻞ ﻧﻤﯿﺘﻮﻧﻢ ﺟﻮﺍﺏ ﺑﺪﻡ ﭼﻮﻥ ﺑﺎ ﻣﻮﺑﺎﯾﻞ ﺁﻧلاینم

mr-adler
پنج شنبه 21 مهر 1390, 00:21 صبح
متوجه شدم. این sub رو خودمون ساختیم و در مواقع نیاز فراخوانی میکنیم . مربوط به شی یا رویداد خاصی نیست...

Private Sub Command1_Click()
Call r
End Sub


Private Sub r()
MsgBox "This is second Sub"
End Sub

just4froum
پنج شنبه 21 مهر 1390, 00:35 صبح
ms_sub1 مربوط به کدوم شی و کدوم رویداده؟ تا به حال با ایم مورد روبرو نشدم:متفکر:


از این جا معلومه که یکم توضیح نیازه البته اطلاعاته من هم کمه و ممکنه ناقص بگم دیگه چیزیه که از دستم بر میاد .
خوب شما تو vb میتونید هم از sub استفاده کنید هم از function فرقشونم اینه که sub مقداری رو بر نمی گردونه اما function یه مقدارو بر می گردونه (حالا اینا یعنی چی :متفکر::متفکر::متفکر: الان میگم !!!)

فرض کن می خوای یه ماشین ساده حساب بنویسی که از دوتا تکست اعداد رو میگیره و با هم جمع می کنه. حالا شما میتونی یه function برای این بنویسی بدین صورت :

Private Function jam(adade1 As Long, adade2 As Long) As Long
Dim kol As Long
kol = adade1 + adade2
jam = kol
End Function

خوب حالا توضیح
private : یعنی فقط برای همین form قابل استفاده است نه برای سایر form ها
jam : اسم function است . همانطور شما که یک اسم دارید و وقتی کسی میخواد شمارا صدا کند با اسمتان صدا می کند شما هم موقع صدا کردن function باید همین کارو بکنید(بعدا توضیح میدم)
adade1 و adade2 : این ها مقداری هستند که شما به این function میفرستید.(در حقیقت میشه گفت مواد اولیه است که باید به تابع بدین تا انتظار محصول رو داشته باشید) و long هم که معلومه دیگه نوع این مواد اولیه است.
و اون long که در آخر آمده است یعنی نوع مقداری که تابع یا همون function برگشت میدهد.
آخرش نوشتیم jam = kol یعنی مقدار برگشتی تابع jam برابر باشه با متغیر kol.

حالا چطوری این تابع بنده خدارو صدا بزنیم ؟؟؟

Private Sub Command1_Click()
MsgBox jam(CLng(text1.Text), CLng(text2.Text))
End Sub

خوب text1 و text2 که همون adade1 و adade2 هستند clng هم یعنی مقدار text1 و text2 را به long تبدیل کن.



موفق باشید

mr-adler
پنج شنبه 21 مهر 1390, 21:41 عصر
اینو متوجه شدم که function رو باید خودمون تایپ کنیم :

Private Function a()

End Function
یعنی موارد بالا رو باید مستقیما خودمون تایپ کنیم بر خلاف sub که با کلیک کردن بر روی اشیا متنش ظاهر میشه.
و فرقشون اینه که موردی که ذکر کردید مقادیر خاصی رو بر میگردونه اما sub نه.

مچکرم عالی توضیح دادید:قلب:

just4froum
جمعه 22 مهر 1390, 19:13 عصر
یعنی موارد بالا رو باید مستقیما خودمون تایپ کنیم بر خلاف sub که با کلیک کردن بر روی اشیا متنش ظاهر میشه.


نه دقیقه چون تو دوتا پست بالا گفتی متوجه شدی دیگه کاملترش نکردم !!! همونطور که گفتم ما دوتا sub و function داریم هر دو رو خودت می تونی درست کنی و sub صرفا برای اشیا نیست. همونطور که می بینی من تو پست یازده 3 تا sub درست کردم.




و فرقشون اینه که موردی که ذکر کردید مقادیر خاصی رو بر میگردونه اما sub نه.


دقیقا


موفق باشید

vbhamed
شنبه 23 مهر 1390, 08:36 صبح
سلام

همانطور دوست عزيزمون M.T.P توضيح دادن شما در ابتداي سابروتين مورد نظر يك دستور شرطي رو بررسي كنيد به شكل زير:
If cond Then Exit sub
كه cond يك متغير Global هست كه در يك ماژول به شكل زير تعريف شده
Global cond As Boolean
حالا شما هر وقت خواستي سابروتين اجرا نشه از هر جاي برنامه كه بودي cond رو برابر True قرار بده، اينطوري از هر جايي سابروتين فراخواني بشه ديگه اجرا نميشه و سريع ازش خارج ميشه
براي اينكه سابروتين بتونه دوباره اجرا بشه هم cond رو برابر False قرار بده
البته اگر چندين سابروتين داري بايد از cond1, cond2, .... استفاده كني

arenaw
یک شنبه 24 مهر 1390, 00:27 صبح
مگه به جز تایمر، تایع های دیگه هم میتونن همزمان با هم اجرا شن؟! تا جایی که من میدونم نمیشه پس تا زمانی که یه تابع تموم نشه شما نمیتونی کار دیگه ای انجام بدی!
فقط همون تایمر میمونه که اونم با enabled = false کارت راه میوفته

mr-adler
یک شنبه 24 مهر 1390, 12:48 عصر
خیلی ممنونم دوستان عزیز
مشکلم بر طرف شد....
:قلب: