PDA

View Full Version : مشکل reset کردن value در چند option موجود در یک فریم دارم



rsl_rostami
سه شنبه 13 اردیبهشت 1384, 22:04 عصر
من یه برنامه مینویسم که بعد از ثبت اطلاعات ورودی باید value ٬ option های موجود رو reset کنم. میخوام بجای کد نویسی برای تک تک option ها با استفاده از دستور for این کار رو انجام بدم. البته اینم بگم که نمیخوام از Index استفاده کنم.
لطفا اگه راه حلی دارین بهم بگین. مرسی

rsl_rostami
چهارشنبه 14 اردیبهشت 1384, 12:38 عصر
هل من ناصر ینصرنی؟ :mad:

R_BABAZADEH
چهارشنبه 14 اردیبهشت 1384, 12:42 عصر
یه دستور هست می گردم و برات پیدا می کنم
البته تو سایت هم قبلا مطرح شده بگردی پیدا می کنی

niloufar
چهارشنبه 14 اردیبهشت 1384, 16:49 عصر
سلام
1- کار اشتباهی می کنی که به قول شما از Index و به قول اصلی از Control Array استفاده نمی کنید. همیشه اینکار خیلی کمک بزرگیه (خصوصا
در Option Buttonها که دیگه معمولا بهترین انتخابه، هرچند همیشه نه)
2- به هر حال آنچه که می خواهی اینست که مثلا اگه نام همه آنها را با opt شروع کرده ای بنویسی:


Dim x As Control
For Each x In Me
If LCase(Left(x.Name, 3)) = "opt" Then
x.Value = False
End If
Next

بابک زواری
چهارشنبه 14 اردیبهشت 1384, 16:54 عصر
اون چیزی که میخوای این کد هست


Dim Found, MyObject, MyCollection

For Each MyObject In Form1
If TypeOf MyObject Is OptionButton Then
MyObject.Value = False
End If
Next

rsl_rostami
چهارشنبه 14 اردیبهشت 1384, 18:43 عصر
دوست عزیز niloufar و جناب کدنویس ٬ خیلی ممنون از راهنمایی شما و ممنون. :flower:

R_BABAZADEH
پنج شنبه 15 اردیبهشت 1384, 07:52 صبح
اون چیزی که میخوای این کد هست


Dim Found, MyObject, MyCollection

For Each MyObject In Form1
If TypeOf MyObject Is OptionButton Then
MyObject.Value = False
End If
Next
دقیقا من هم منظورم همین کد بود
در ضمن niloufar عزیز index در مواقعی به درد می خوره که ما یک دسته بندی بیشتر نداشته باشیم بطور مثال در بعضی فرمها ما 100 عدد textbox داریم که هر یک یا هر دسته مربوط به کاری است حال اگر اسم همه این textbox ها یک چیز باشه بعد کار کردن با انها مشگل می شه .

rsl_rostami
پنج شنبه 15 اردیبهشت 1384, 09:04 صبح
اون چیزی که میخوای این کد هست


Dim Found, MyObject, MyCollection

For Each MyObject In Form1
If TypeOf MyObject Is OptionButton Then
MyObject.Value = False
End If
Next
دقیقا من هم منظورم همین کد بود
در ضمن niloufar عزیز index در مواقعی به درد می خوره که ما یک دسته بندی بیشتر نداشته باشیم بطور مثال در بعضی فرمها ما 100 عدد textbox داریم که هر یک یا هر دسته مربوط به کاری است حال اگر اسم همه این textbox ها یک چیز باشه بعد کار کردن با انها مشگل می شه .

جناب BABAZADEH از توجه شما هم متشکرم

بله درسته! من هم در یک فرم چیزی حدود چهل Textbox و شصت و اندی Optionbox و همینطور Checkbox دارم که اگه قرار باشه با index کار کنم و همشون رو همنام در نظر بگیرم دیگه آخر و عاقبتم با کرام‌الکاتبین است.

بابک زواری
پنج شنبه 15 اردیبهشت 1384, 15:35 عصر
برعکس حق با خانم نیلوفر هست وقتی که تعداد آبجکتها زیاد شد باید از اندکس
استفاده کنید.
بحث مفصلی داره که از حوصله اینجا خارجه ، در ضمن روی یک فرم تا تعداد معینی
کنترل میتونید بذارید و اگر از اون حد بیشتر بشه VB قبول نمیکنه که با اندکس کردن
این مشکل حل میشه.

R_BABAZADEH
پنج شنبه 15 اردیبهشت 1384, 22:53 عصر
با ایندکس کردن تمامی آبجکتها که در چند دسته مختلف هستند کا را سخت می کند به طوری که بعد از مدتی دیگر شماره هر دسته فراموش می شود البته این نظر منه و من فقط ابجکتهایی که در هر دسته است رو ایندکس می کنم

بابک زواری
پنج شنبه 15 اردیبهشت 1384, 23:06 عصر
بله کار شما درسته ، من هم همین کارو میکنم
ولی موضوع این هست که کار اندکس کردن انجام بشه و کلا نفی نشه
در خیلی موارد این کار ، کدنویسی رو بسیار راحت تر و کم تر میکنه

حامد مصافی
جمعه 16 اردیبهشت 1384, 14:32 عصر
سلام
اولاً که بایید بررسی کنید تا Parent همه این کنترل ها یکسان باشه ( برای مثال کنترل هایی را که روی Picture1 قرار دارند ریست کنید )


در ضمن همونطوری که جناب کدنویس فرمودن از آرایه کنترل استفاده کنید
در هر لحظه فقط یک کنترل از یک گروه آرایه option ارزش درست داره پس چرا تمام کنترل ها رو بررسی می کنید؟؟؟

- یک متغیر با نام دلخواه ( مثلاً nIndex ) تعریف کنید
- در رویداد کلیک آراره کنترل متغیر را مقدار دهی کنید
- در موقع لازم کنترل شماره nIndex رو ریست کنید

niloufar
شنبه 17 اردیبهشت 1384, 12:22 عصر
سلام
من دو روزی نبودم، تا بیام چقدر پست تو این تاپیک اومده :confy2: ببخشید که مجبورم تک تک پاسخ دهم و لذا یه ذره پستم طولانی میشه ...

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

در ضمن niloufar عزیز index در مواقعی به درد می خوره که ما یک دسته بندی بیشتر نداشته باشیم بطور مثال در بعضی فرمها ما 100 عدد textbox داریم که هر یک یا هر دسته مربوط به کاری است حال اگر اسم همه این textbox ها یک چیز باشه بعد کار کردن با انها مشگل می شه
تو رو خدا اذیتمون نکنید. ایندکس گذاشتن به یه دسته یا n دسته بودن ربطی نداره. شما می تونید هر تعداد را که بخواید یه اسم بدید و آنها را یه آرایه و هر تعداد دیگه از همون کنترل یا از نوع دیگه رو یه اسم دیگه بدید و یه آرایه دیگه درست کنید. اگه هم می گید که اگه اینطوری شد دیگه کد شما به درد نمی خوره هم باید عرض کنم که طبق قوانین استاندارد نامگذاری، بهتره نام هر نوع کنترل را با سه حرف نشان دهنده نوع آن کنترل شروع کنیم (مثل optName یا txtName یا lblName یا cmdName یا ... ) پس این کد هم کار می کنه. ضمن اینکه با این روش شما می تونید حتی فقط یه دسته را Reset کنید و n تا کار مفید دیگه

برعکس حق با خانم نیلوفر هست وقتی که تعداد آبجکتها زیاد شد باید از اندکس
استفاده کنید.
نظر لطفتونه. معمولا در کنترل هایی که کارهای مشابهی دارند، استفاده از ControlArray بهترین راه است. برای اطلاعات بیشتر در مثالهای MSDN برید و همین مثال Opt را ببینید. همچنین ایجاد ماشین حساب هم یه مثال بارز دیگه برای استفاده مفید از ControlArray می باشد.

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

در ضمن همونطوری که جناب کدنویس فرمودن از آرایه کنترل استفاده کنید
پس ما این وسط چیکاره بیدیم :wink:

در هر لحظه فقط یک کنترل از یک گروه آرایه option ارزش درست داره پس چرا تمام کنترل ها رو بررسی می کنید
حق با شماست البته در مواردی که بعلت تعدد یا ... سرعت کار پایین بیاید. وگرنه شاید اضافه کردن Flagهای زیادی هم گیج کننده باشد.

دیگه Quote نداریم
خلاصه مطلب اینکه باید موظب باشیم که از هر طرف بام نیفتیم. نه بگیم همه چیز را قاطی پاطی آرایه کنیم. نه بگیم بی خیال آرایه و همه چیز را نام مجزا دهیم. باید مورد به مورد فکر کرد و تصمیم صحیح را اتخاذ کرد.

R_BABAZADEH
شنبه 17 اردیبهشت 1384, 13:21 عصر
من فکر کنم منظورم رو دوستان بد متوجه شدند
1. من خودم در اقلب موارد از index استفاده می کنم
2. روش مورد نظر که من روی ان تاکید میکردم به خاطر موارد زیر بود
به طور مثال ما یک دفتر تلفن نوشته ایم درون این دفتر تلفن ما 10 فیلد تلفن منزل و 10 فیلد تلفن محل کار داریم
حال ما نمی توانیم نام تمام textboxهارو یکی قرار بدهیم و کاهی ما نیاز داریم در صورت بروز شرایطی تمام textbox ها پاک بشوند و با توجه به هم نام نبودن textbox های منزل و محل کار بهترین کار همان روش حلقه با نوع ابجکت است

امید وارم این دفعه تونسته باشم منظورم رو درست اعلام کنم :embr:

niloufar
شنبه 17 اردیبهشت 1384, 13:47 عصر
من خودم در اغلب موارد از index استفاده می کنم
خدا را شکر

روش مورد نظر که من روی ان تاکید میکردم ...
من روشی را یادم نمیاد اگه منظورتون همون روش آقا بابک بود که شما هم تایید کردید، بنده هم آن را تایید کردم و تنها اشکال آن را هم عرض کردم.

به طور مثال ما یک دفتر تلفن نوشته ایم درون این دفتر تلفن ما 10 فیلد تلفن منزل و 10 فیلد تلفن محل کار داریم
اینکه اگه می خوایم 10 تلفن از هر شخص داشته باشیم، اصلا کار صحیحی نیست که برای هر کدام یک فیلد اختصاص دهیم و در فرم هم برای هر یک، یه TextBox. البته احتمالا شما این را برای مثال گفته اید و من هم گفتم که برای دیگران مشتبه نشود.

حال ما نمی توانیم نام تمام textboxهارو یکی قرار بدهیم
بنده در پست قبلی هم عرض کردم که آرایه کردن یا نکردن بستگی به نوع کار ما دارد. در واقع هر گاه تعدادی کنترل کار مشابهی را باید انجام دهند، برای اتلاف وقت و کد از آرایه کنترلی استفاده می کنیم (دقیقا همان دلیلی که در استفاده از آرایه های غیر کنترلی می دانیم). حال اگر تمام این TextBox ها یک کار قراره بکنند پس همه را آرایه می کنیم و اگر چند کار پس چند آرایه و حتی اگر هر یک، کاری جدا انجام می دهند پس اصلا آرایه نباید بکنیم. به مثال ماشین حساب در پست قبل مراجعه شود.

و گاهی ما نیاز داریم در صورت بروز شرایطی تمام textbox ها پاک بشوند و با توجه به هم نام نبودن textbox های منزل و محل کار بهترین کار همان روش حلقه با نوع ابجکت است
بی خیال، من که هر چی تو پست قبل گفتم، دوباره هم گفتم، اینم روی اونا: قبلا عرض کردم که طبق نامگذاری استاندارد، نام همه این TextBoxها با txt شروع می شود و لذا حتی اگر سیصد TextBox با سیصد نام در فرم وجود داشته باشد هم می توان از کد اول بنده استفاده کرد. ضمن اینکه قبلا هم عرض کردم که اگه واقعا هدف این باشد که روی تمام کنترل های یک نوع خاص کاری بکنیم، استفاده از TypeOf به جای Name معقول تر است و فقط عرض شد که مشکل آن اینست که اگر نخوایم روی برخی، کار انجام بشه، دیگه TypeOf به تنهایی به درد نمی خوره.

PLZ (به قول چت کارای حرفه ای نه به قول خودمان) : یه بار دقیق پست ها را بخوانید و بعد پست جدید بدید. فکر می کنم در این پست من، همه چیز تکراری شد. (غیر از خدا را شکر اول آن :sunglass: )

R_BABAZADEH
شنبه 17 اردیبهشت 1384, 19:46 عصر
اقایون و خانومها من کم اوردم :sunglass:

حامد مصافی
شنبه 17 اردیبهشت 1384, 21:02 عصر
پس ما این وسط چیکاره بیدیم



ببخشید من این تاپیک رو سرسریع خوندم :embr:

در ضمن روشی که فرمودید روش مجارستانی است (که در روش مایکروسافتی با روش شتری ترکیب می شود) و همه به اون پایبند نیستند به جای بررسی کردن سه حرف اول نام کنترل بهتره کنترل های مجزا استفاده کنیم ولی برای دسته ای از کنترل ها Tag واحدی انتخاب کنید و در موقع لزوم این دسته از کنترل ها را ( که ربطی به هم نداند ) ریست کنید