کمک در مورد سی شارپ

فقق

Banned
سلام به همه ی دوستان می خواستم من را در این مشکل کمک کنید و از مدیر بخش می خواهم که من را کمک کند
مشکل من این است که در سی شارپ دات نت من یک فرم ایجاد می کنم و روی آن دو دکمه یا button قرار می دهم و
Enable آنها یا حالت فعال بودن آنها را false می کنم و یک فرم دیگر به اسم Form2.cs را ایجاد می کنم و یک button روی آن قرار می دهم و در داخل رویداد کلیک button آن می خواهم کدی بنویسم که با زدن دکمه در فرم 2 . دکمه های غیر فعال من در فرم 1 را فعال کند . ولی من هرچی در فرم دو می خواهم دکمه های فرم 1 را فعال کنم اصلا اسمی از دکمه های فرم 1 نمی شناسد چه کار کنم تا بشناسد و هم باعث فعال شدن دکمه های فرم یک شود .ممنون می شم کمک کنید
 

the_king

مدیرکل انجمن
سلام به همه ی دوستان می خواستم من را در این مشکل کمک کنید و از مدیر بخش می خواهم که من را کمک کند
مشکل من این است که در سی شارپ دات نت من یک فرم ایجاد می کنم و روی آن دو دکمه یا button قرار می دهم و
Enable آنها یا حالت فعال بودن آنها را false می کنم و یک فرم دیگر به اسم Form2.cs را ایجاد می کنم و یک button روی آن قرار می دهم و در داخل رویداد کلیک button آن می خواهم کدی بنویسم که با زدن دکمه در فرم 2 . دکمه های غیر فعال من در فرم 1 را فعال کند . ولی من هرچی در فرم دو می خواهم دکمه های فرم 1 را فعال کنم اصلا اسمی از دکمه های فرم 1 نمی شناسد چه کار کنم تا بشناسد و هم باعث فعال شدن دکمه های فرم یک شود .ممنون می شم کمک کنید
ابتدا یک توضیح مختصر در مورد کلاس ها و شیء هایی که از رویشان ساخته می شود می دهم.
فرض کنید که من یک کلاس به اسم Class1 دارم که یک متد به اسم Show و یک متغیر به اسم message
داخلش هست که هر دویشان هم public هستند و از بیرون کلاس می توان به آنها دسترسی داشت :
کد:
        public class Class1
        {
            public string message = "test";

            public void Show()
            {
                MessageBox.Show(message);
            }
        }

حالا به نظر شما من می توانم در کد برنامه ام متد Show داخل کلاس را اینطوری فراخوانی کنم؟
کد:
            Class1.Show();

نه، خطا می دهد و این کد بالا اشتباه است، چون Class1 اسم خود کلاس است. من اول باید یک شیء از آن کلاس
مثلا با اسم c1 بسازم و توسط آن شیء c1 متد Show را فراخوانی کنم :
کد:
            Class1 c1 = new Class1();
            c1.Show();

کد بالا را می توانم اینطوری در یک سطر خلاصه کنم، اما چون اسم متغیر c1 را ثبت نمی کند بعدا نمی توانم
به اسم شیء دسترسی داشته باشم :
کد:
            (new Class1()).Show();

موقعی که کد اجرا می گردد، پیغام test را نمایش می دهد، چون در متغیر message مقدار test ذخیره شده.
اگر بخواهم متن این پیغام را تغییر دهم باید ابتدا مقدار متغیر message را عوض کنم :

کد:
            Class1 c1 = new Class1();
            c1.message = "sample";
            c1.Show();

در زبان #C فرم ها و دکمه ها بصورت پیشفرض یک کلاس هستند که شما برای استفاده از نوع آن کلاس ها شیء
می سازید. به عنوان مثال زمانی که برنامه شما با نمایش فرم Form1 شروع می شود این کد در فایل Program.cs
اجرا می گردد :
کد:
            Application.Run(new Form1());

در کد بالا به آن کلمه new Form1 توجه کنید، شیء از کلاس Form1 ایجاد میشه که متاسفانه بصورت پیشفرض
جایی هم اسم شیء ثبت نشده، حالا اگر شما در داخل کد های Form2 بخواهید به یک دکمه در این شیء
اشاره کنید، نام کلاس را می دانید (Form1) اما به شیء ای که از روی آن ساخته شده دسترسی ندارید.

برای اینکه بتوانید در کدی خارج از کلاس Form1 به متغیر ها و اشیاء درون کلاس Form1 دسترسی داشته باشید
اولا باید اسم شیء ای از کلاس Form1 می سازید را در متغیری نگهداری کنید و ثانیا اشیاء و متغیر هایی که
می خواهید به آنها دسترسی داشته باشید از نوع private نباشند.

مرحله اول - شیء ای که از کلاس Form1 می سازید را در متغیری عمومی و استاتیک ثبت کنید
کد Program.cs را باز کنید و ابتدای کلاس Program یک متغیر عمومی و استاتیک از نوع Form1 بسازید :
کد:
[COLOR="Gray"]    static class Program
    {[/COLOR]
        static public Form1 f1;
.
.
.

و سپس کد (()Application.Run(new Form1 داخل متد ()Main را با این دو سطر تعویض کنید :
کد:
            f1 = new Form1();
            Application.Run(f1);

حالا شما می توانید داخل فرم Form2 یا هر کد دیگری به شیء Program.f1 دسترسی داشته باشید.

مرحله دوم - اشیاء، متغیر ها و کنترل هایی که باید به آنها دسترسی داشته باشید را public کنید
بصورت پیشفرض دکمه های درون فرم Form1 از نوع private هستند، باید در پنجره Properties مشخصه
Modifiers شان را به Public تغییر دهید. اینکار را در مورد دکمه هایی که داخل Form1 هستند و باید از
داخل Form2 بهشان دسترسی داشته باشید انجام دهید.

حالا مثلا می توانید با کد زیر دکمه button1 را از درون فرم Form2 فعال کنید :
کد:
Program.f1.button1.Enabled = true;
 

iMacs

Member
به جان خودم شکی توش نیست این دوستمون VB کار کرده ولی خدای توضیحات the_king عالی بود
 

tye

New Member
درباره ی همین موضوع

من با کمک از گفته های شما من یک فرم به اسم فرم 1 ایجاد کردم و دکمه ای روی آن قرار دادم و modife (فکر کنم درست نوشتم) آن را به public قرار دادم و یک فرم جدید به نام فرم 2 ایجاد کردم و در داخل دکمه فرم یک این کد را نوشتم که وقتی کلیک کردم فرم 2 من ظاهر شود
form2 jj=new form2();
jj.show();
خوب وقتی من روی دکمه فرم یک کلیک کردم فرم 2 ظاهر می شود .خوب من یک دکمه روی فرم 2 قرار می دهم و
در رویداد کلیک آن می نویسم Form 1 uu=new form1();
uu.button1.visible=false;
باتون یک که در بالا نوشتم مال فرم یک است که من می خواهم با کلیک کردن روی دکمه فرم دو .دکمه فرم یک را مخفی یا هر چیز دیگر رویش انجام دهم .
ولی من با این اعمال که انجام دادم ولی کد هیچ کاری نمی کند حالا مشکل من کجاست؟
من از روی فرم یک نمونه سازی کردم و از آن طریق به باتن آن دسترسی پیدا کردم و مودیفیل آن را هم به پابلیک تبدیل کردم ولی نشد کمکم کنید ممنون
 

the_king

مدیرکل انجمن
من با کمک از گفته های شما من یک فرم به اسم فرم 1 ایجاد کردم و دکمه ای روی آن قرار دادم و modife (فکر کنم درست نوشتم) آن را به public قرار دادم و یک فرم جدید به نام فرم 2 ایجاد کردم و در داخل دکمه فرم یک این کد را نوشتم که وقتی کلیک کردم فرم 2 من ظاهر شود
form2 jj=new form2();
jj.show();
خوب وقتی من روی دکمه فرم یک کلیک کردم فرم 2 ظاهر می شود .خوب من یک دکمه روی فرم 2 قرار می دهم و
در رویداد کلیک آن می نویسم Form 1 uu=new form1();
uu.button1.visible=false;
باتون یک که در بالا نوشتم مال فرم یک است که من می خواهم با کلیک کردن روی دکمه فرم دو .دکمه فرم یک را مخفی یا هر چیز دیگر رویش انجام دهم .
ولی من با این اعمال که انجام دادم ولی کد هیچ کاری نمی کند حالا مشکل من کجاست؟
من از روی فرم یک نمونه سازی کردم و از آن طریق به باتن آن دسترسی پیدا کردم و مودیفیل آن را هم به پابلیک تبدیل کردم ولی نشد کمکم کنید ممنون
آن uu ای که شما ایجاد کردید یک شیء جدید از کلاس Form1 است که Show اش نکردید، ربطی هم به آن شیء ای
که در حال نمایش است ندارد، آن Form1 ای که در حال نمایش است شیء اش قبلا ایجاد شده و uu نیست.
این دو شیء کاملا مستقل از هم اند. الان شما دو تا Form1 دارید.

اشکال کار شما این بوده که در رخداد کلیک دکمه یک شیء جدید از کلاس Form1 ساخته اید و دکمه داخل این شیء
جدید را مخفی کردید، موقعی که Form2 را مشاهده می کنید یک نمونه از فرم Form1 باز است، باید همان شیء
موجود را مورد استفاده قرار دهید، نه اینکه یک شیء جدید بسازید.

با اجرا کردن کدی که شما نوشتید دو شیء از کلاس Form1 خواهید داشت که مستقل از هم هستند،
یکی شان همانی بوده که ابتدای اجرای برنامه نمایش داده میشه و دومی را در رخداد Click ساخته اید و وضعیت
Visible دکمه داخلش را عوض می کنید و ربطی هم به شیء اولی ندارد.

قرار نبوده که مجددا یک کلاس از Form1 بسازید، همون ابتدای اجرای برنامه یک شیء از کلاس Form1
ساخته اید که قرار بود در متغیر f1 قرار بگیره، باید همان f1 را بکار می بردید، نه uu
مرحله اول ای که قبلا توضیح داده بودم برای همین مورد است، باید آن ویرایش را در کد program.cs انجام دهید.
 

Mr_GHOST82

New Member
سلام خدمت تمام مجید آنلاینی ها. دوستان من تازگی ب یک مشکل برخوردم. ببینین . من دارم یه بازی دارت میسازم تموم قسمتارو ساختم فقط امتیاز مونده. ببینین یسوال
Sports_Dart_Lanao_Size_5f27f24.jpg

الان من این عکسو گذاشتم صفحه ی دارت. خب من میخوام وقتی مکان دارت پرتاب شده روز قسمتای سیاه و سفید یا دایرش یا اون حلقه ای های دو برابر و سه برابر بمونه ، امتیاز =این شه.
مثلا مثل این
(If (dart.location >=... && dart.location<=828
{
;Score =14
}
با شرطو فلان ک اگ از این کوچیک ترو بزرگتر باشه میتونم مربع مستطیلی بسازم ولی دایره اینارو نمیدونم چشکلی. ۱۴سالمه تازه کار با سی شارپ تو ویژوال استادیو رو شروع کردم. اگه میشه ممنون میشم یکم راحت بیان کنید متوجه بشم. ممنون از هرکی کمک کنه.
اگر هم خواستید ایمیلم : [email protected]
 

the_king

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

الان من این عکسو گذاشتم صفحه ی دارت. خب من میخوام وقتی مکان دارت پرتاب شده روز قسمتای سیاه و سفید یا دایرش یا اون حلقه ای های دو برابر و سه برابر بمونه ، امتیاز =این شه.
مثلا مثل این
(If (dart.location >=... && dart.location<=828
{
;Score =14
}
با شرطو فلان ک اگ از این کوچیک ترو بزرگتر باشه میتونم مربع مستطیلی بسازم ولی دایره اینارو نمیدونم چشکلی. ۱۴سالمه تازه کار با سی شارپ تو ویژوال استادیو رو شروع کردم. اگه میشه ممنون میشم یکم راحت بیان کنید متوجه بشم. ممنون از هرکی کمک کنه.
اگر هم خواستید ایمیلم : [email protected]
کار تون رو اینجوری سخت می کنید، عملی هست اما دردسرش زیاده. از معیار های زاویه و فاصله از مرکز استفاده کنید.
کد:
        private readonly int[] _segmentScores = new int[] { 6, 10, 15, 2, 17, 3, 19, 7, 16, 8, 11, 14, 9, 12, 5, 20, 1, 18, 4, 13 };

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            var centerX = 173;
            var centerY = 182;
            var distance = Math.Sqrt(Math.Pow(e.X - centerX, 2) + Math.Pow(e.Y - centerY, 2));
            int score;
            if (distance < 8)
            {
                score = 50;
            }
            else if (distance < 13)
            {
                score = 25;
            }
            else
            {
                var angle = Math.Atan2(e.Y - centerY, e.X - centerX);
                if (e.X * centerX + e.Y * centerY < 0)
                {
                    angle = Math.PI - angle;
                }
                var segment = (int)Math.Round((2 * Math.PI + angle) * 10 / Math.PI) % 20;
                if ((distance > 73) && (distance < 84))
                {
                    score = _segmentScores[segment] * 3;
                }
                else if ((distance > 123) && (distance < 136))
                {
                    score = _segmentScores[segment] * 2;
                }
                else
                {
                    score = _segmentScores[segment];
                }
            }
            listBox1.Items.Add(score);
        }

dart-zip
 

پیوست ها

  • Dart.zip
    189.6 کیلوبایت · بازدیدها: 0

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

بالا