کامپیوتریا و ریاضیای ۹۲

somewhere you can have fun
کامپیوتریا و ریاضیای ۹۲
آخرین مطالب
محبوب ترین مطالب
مطالب پربحث‌تر
آخرین نظرات
نویسندگان

حرکت کنترل ها

شنبه, ۱۷ اسفند ۱۳۹۲، ۰۴:۲۴ ب.ظ
تو این پست میخوام درباره حرکت کنترل ها تو Windows Form app حرف بزنیم.

ابتدا سعی کردم این دستور رو انجام بدم

;button2.Location.X = 11

و فکر میکردم مختصات طولی button2 تغییر میکنه، ولی خب این راه جواب نداد و error داشت ک مربوط میشد به اینکه چیزی ک دارم تغییر میدم متغیر نیست و یجورایی read-only هست...

کمی ک گشتم این دستور رو پیدا کردم:

;button2.Left = 11

که button2 رو به اندازه 11 پیکسل از سمت چپ فرم فاصله میده.ولی اینم به درد نمیخورد چون فقط از یک طرف بود.

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

button2.Location = new Point ( 12,100 ); //button2 or anything

این عمل مکان جدیدی رو برای button2 تعریف میکنه و اعداد توی پرانتز از چپ به راست اولی X و دومی Y هستن.

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

موافقین ۰ مخالفین ۰ ۹۲/۱۲/۱۷
آرش قیطاسوند

نظرات  (۱۶)

;button2.Left = 11 این دستور باتن رو 11 پیکسل به چپ نمی بره این دستور باتن رو از سمت چپ فرم به اندازه 11 پیکسل فاصله می ده!!

پاسخ:
پاسخ:
بله باتشکر درستش کردم.
Location خیلی به کار نمیاد چون یه بار استفاده میشه، من خودم از timer دارم استفاده می کنم، یه کم کد نویسیش پیچیدست ولی اونم یه روشیه دیگه...فکر کنم بهتر از تغییر Location باشه.
یه سوال، تمرین Car که داریم باید با آرایه نوشته بشه؟ و باید 3 تا textbox داشته باشیم یا 15 تا؟؟

پاسخ:
پاسخ: خب سعی کنید کدش رو برامون بذارید استفاه کنیم...
اما فکر میکنم location کلی رو نشه با تایمر تغییر داد...من خودم دارم سعی میکنم از sleep برای بیشتر کردن تعداد تغییرات استفاده کنم.
درباره اون تمرین فعلا هرکدوم تو ی string باشن در واقع با سه تا textBox قضیه حل میشه.
سلام

پست خوبی بود و خیلی خوبه که قسمتی از وبلاگ رو به مباحث کد نویسی اختصاص بدین.
این مشکل تغییر مکان button اولین چیزیه که همه باهاش مواجه میشن :دی
حالا که بحثشو باز کردین یکم میخوام ببرمتون سمت اینکه چرا اینجوریه. البته شاید یکم زود باشه چون هنوز تازه سی شارپ شروع کردین.
اول یه سوال می پرسم.
طبق گفته های آقای قیطاسوند، نمیشه نوشت button1.Location.X = 11
حالا اگه اینکارو انجام بدیم میشه
Point p = button1.Location;
p.X = 11;
اما وقتی این کارو انجام بدین، مکان button1 تغییر نمیکنه. چرا؟

پاسخ:
پاسخ: سلام استاد، منت گذاشتین!

فکر کنم تغییر نکردنش بخاطر این باشه ک ما داریم ب خصیصه X موجود تو کلاس point اشاره میکنیم و سعی در تغییرش داریم در حالی ک شرط موجود در set این اجازه رو نمیده ( چون read-only هستش ) ولی اگ ما بخوایم این p.X رو توی ی int مثلا x ذخیره کنیم و بخوایم x رو نشون بده خطایی نمیگیره و x درست نشون داده میشه یعنی مختصات طولی button1 ...
دارم روش کار میکنم، سر درآوردن از مطالبی که رو اینترنت راجع به timer ها پیدا میشه سخته، آخه خیلی چیزا رو هنوز نخوندیم و برخورد نکردیم باهاشون. ولی فعلا در مرحله ای که هستم، دارم با button1.Left = 10 مثلا کار میکنم که مدام تکرار بشه. البته الان دارم رو اون یکی تمرین car کار (!) میکنم، این تمرین رو گذاشتم واسه بعد...

پاسخ:
پاسخ:
کاری که دارین انجام میدین باعث میشه تایمر button1 رو ب آرومی ب راست و چپ ببره حالا این رو امتحان کنید:


for (int i=0; i <= 100; i++) //for doing again and again
{
button2.Location = new Point(12, 100); // first
System.Threading.Thread.Sleep(500); // delay for 0.5 second
button2.Location = new Point(12, 50); //second
System.Threading.Thread.Sleep(500); // timing
button2.Location = new Point(30, 30); // third
System.Threading.Thread.Sleep(500); // timing
button2.Location = new Point(120, 30); // forth
System.Threading.Thread.Sleep(500); //timing
button2.Location = new Point(180, 100); // fifth
System.Threading.Thread.Sleep(500); // timing
button2.Location = new Point(50, 150); // sixth
System.Threading.Thread.Sleep(500); // timing
}
اینارو تو قسمت کدهای button1 بذارید...
خواهش می کنم
کامل متوجه جوابت نشدم اما با read-only کاری نداره. اگه میخوای مطمئن بشی، میتونی یه کلاس دلخواه درست کنی و برای کلاست property تعریف کنی که جنسش point باشه و read-only هم نذاری. بعد وقتی بیای از بیرون X رو عوض کنی با خطای مشابه مواجه میشی.
دلیل اصلی چیز دیگه ایه. یه راهنمایی میکنم: search کنید و ببینید Point ذاتش چیه.

پاسخ:
پاسخ: منظور من هم این بود ک property موجود ک همون X هست بهمون اجازه نمیده.
پس چرا وقتی منتقلش میکنیم به یه Point میتونیم تغییر بدیم؟

پاسخ:
پاسخ:
point یک کلاسه و X و Y خصیصه های این کلاس ( properties ) هستن...
اما نمیدونم چطوریه ک وقتی ی شی ازش ساختیم تونستیم تغییرش بدیم... ک البته تغییرش هم ندادیم،فقط ازمون error نگرفت.
آخه مشکل اینجاست ک هردو هم ب صورت auto-implemented هستن!
چرا تغییر ندادیم؟! اینو امتحان کن:

Point p = new Point(10, 10);
MessageBox.Show(p.X.ToString());
p.X = 30;
MessageBox.Show(p.X.ToString());

این کد نشون میده که تغییر کرده.
نکته اصلی اینه که Point کلاس نیست. پس چیه؟

پاسخ:
پاسخ:
structure هستش، اما فرقشون رو متوجه نمیشم.
درسته، Point یک Structure هست. فرق اصلیشون با کلاس ها اینه که به جای ارجاع از value استفاده می کنن. خب حالا این چه تاثیری داره؟

پاسخ:
پاسخ:
خب ارجاع درواقع ی چیزو دستکاری میکنه و کپی ازش نداره، ولی مقدار ( value ) تغییرات رو روی ی کپی اعمال میکنه ک رو نسخه اصلی تاثیری نداره.
این میشه دلیل اینکه X رو تغییر دادیم ولی جای button عوض نشد. اما دلیل error چی میتونه باشه؟

پاسخ:
پاسخ:
شاید اینکه ما برای struct چیزی ب اسم default constructor نداریم.
شایدم اینکه تو struct همه field ها یا static هستن یا const .
نه دلیلش این نیست. یه راهنمایی دیگه:
وقتی یه property جنسش struct باشه، مقدار برمیگردونه و با مقدار کار میکنه.

پاسخ:
پاسخ: نمیدونم.
وقتی Property جنسش کلاسه، مثل یه ارجاع به یه خونه از حافظه میمونه که میتونی با استفاده از اون هر تغییری اعمال کنی. اما وقتی جنسش میشه struct دقیقا یه مقدارو بر میگردونه و جایی از حافظه رو نشون نمیده. حالا اگه بخوای روی اون مقدار تغییر اعمال کنی اصلا جایی واسش وجود نداره که ثبت بشه. واسه همین میگه که variable نیست.

پاسخ:
پاسخ:
یعنی درواقع ما هربار ک میخوایم تغییرش بدیم یا بخونیمش باید بسازیمش!
بله، ینی باید از بنیاد مقدار جدیدی در حافظه ایجاد کنید و نسبت بدید.

پاسخ:
پاسخ:
حالا متوجه شدم!
خیلی ممنون استاد خیلی وقتتون رو گرفتم خودم ک خواب ندارم شما رو هم بی خواب کردم!
شرمنده!
خواهش میکنم.
راستی تو وبلاگم یه سری پست با عنوان "سیشارپ - باید دانست" هست. پیشنهاد میکنم اونارو بخونید.

http://cscience.blog.ir/category/%D8%B3%DB%8C%D8%B4%D8%A7%D8%B1%D9%BE/

پاسخ:
پاسخ:
بله استاد سر زده ایم! :)
سلام استاد، ممنون که به وبلاگ ما هم سر میزنید. اطلاعاتتون مفید بود، تشکر.
انشالله اگر سرمون خلوت شد (!) و وقت کردیم، اطلاعات روی وبلاگ شما - که معلومه خیلی مفیده - رو هم به طور مفصلتری مطالعه می کنیم.
در ضمن منم موافق پست های مربوط به برنامه نویسی روی وبلاگ هستم... بیشترش کنیم.
سلام، خواهش میکنم.
امیدوارم مفید باشن. البته طرح "سیشارپ - باید دانست" خیلی بیشتر از اینایی هست که الان روی وبلاگ گذاشتم فقط مشکلم اینه که وقت ندارم از این پستا بذارم. یکم سرم خلوت بشه دوباره شروع میکنم.

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی