گفتگو هایی در باب سی شارپ

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
چرا از کلاس Brush نه میشه شی ساخت و نه میشه مستقیم (بدون ایجاد شی) فراخونی اش کرد؟
بدون ایجاد شی متد و چیزی نداره . میخوایم شی ایجاد کنیم هم میگه از کلاس abstract نمیشه شی ساخت . پس برای استفاده از این کلاس باید چی کار کرد؟ :


کد:
private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Brush myBrash = new Brush();
            e.Graphics.DrawLine(new Pen());
        }

آرگومان اول متد سازنده ی Pen (در آرگومان اول متد DrawLine) ، کلاس یا شی ای از Brush میخواد که در خط بالاش هر جوری میخوام از این کلاس استفاده کنم نمیشه
میدونم بجای کلاس Brush از کلاس Color هم میشه استفاده کرد در Pen ولی کلاس Brush چرا مشکل داره و چجوری ازش استفاده میشه؟
 

the_king

مدیرکل انجمن
سلام
چرا از کلاس Brush نه میشه شی ساخت و نه میشه مستقیم (بدون ایجاد شی) فراخونی اش کرد؟
بدون ایجاد شی متد و چیزی نداره . میخوایم شی ایجاد کنیم هم میگه از کلاس abstract نمیشه شی ساخت . پس برای استفاده از این کلاس باید چی کار کرد؟ :


کد:
private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Brush myBrash = new Brush();
            e.Graphics.DrawLine(new Pen());
        }

آرگومان اول متد سازنده ی Pen (در آرگومان اول متد DrawLine) ، کلاس یا شی ای از Brush میخواد که در خط بالاش هر جوری میخوام از این کلاس استفاده کنم نمیشه
میدونم بجای کلاس Brush از کلاس Color هم میشه استفاده کرد در Pen ولی کلاس Brush چرا مشکل داره و چجوری ازش استفاده میشه؟
Brush یک کلاس پایه است، برای این تعریف شده که اغلب متد هایی که با Brush کار می کنند با هر نوع Brush ای قابل استفاده هستند.
چیزی که شما می سازید معمولا SolidBrush و TextureBrush و HatchBrush و ... است.
کد:
            var myBrush = new SolidBrush(Color.Red);
            e.Graphics.DrawLine(new Pen(myBrush), 0, 0, 100, 100);

کد:
            var myBrush = new TextureBrush(SystemIcons.Error.ToBitmap());
            e.Graphics.DrawLine(new Pen(myBrush, SystemIcons.Error.Width), 0, 0, 100, 100);

کد:
            var myBrush = new System.Drawing.Drawing2D.HatchBrush(System.Drawing.Drawing2D.HatchStyle.ZigZag, Color.Blue, BackColor);
            e.Graphics.DrawLine(new Pen(myBrush, 10f), 0, 0, 100, 100);
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون آقا علی
یه سئوال دیگه اینکه چرا وقتی از کلاس Form داخل رویداد Shown فورم ، شی ساخته و نمایش داده میشه ، یکبار فقط اجرا میشه (که درسته) ولی وقتی از کلاس Form1 شی ساخته میشه در این رویداد ، بصورت مداوم شی ساخته و تکرار میشه؟
یعنی این چرا مشکل داره و چندین بار تکرار میشه؟ :


کد:
private void Form1_Shown(object sender, EventArgs e)
        {
            Form1 f = new Form1();
            f.Show();
        }
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
مسئله ی دیگه اینکه از کلاس همه چیز شی ساخته میشه مثلا از کلاس دکمه ها و لیبل ها و ... اما چرا از کنترل فرم ها ، بجای اینکه شی Form1 (از کلاس Form ها) ساخته بشه ، کلاس Form1 ساخته میشه؟؟!!
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
جواب سئوال اول رو فهمیدم
از کلاس Form1 یعنی از تمام رویدادهایی که در اون هست ، یه کپی میگیره و شی Form1 دیگه رو میسازه بنابراین هر بار در رویداد Shown در شی Form1 ، یه فرم Form1 دیگه میسازه


یه سئوالی که پیش میاد اینه که اگه بصورت دستی یه شی از Form تعریف کرده باشیم ، چجوری میشه از این شی فرم ای که ساختیم (نه از کلاس کلی Form) مجددا کپی بگیریم و نمایش بدیم؟
 

the_king

مدیرکل انجمن
ممنون آقا علی
یه سئوال دیگه اینکه چرا وقتی از کلاس Form داخل رویداد Shown فورم ، شی ساخته و نمایش داده میشه ، یکبار فقط اجرا میشه (که درسته) ولی وقتی از کلاس Form1 شی ساخته میشه در این رویداد ، بصورت مداوم شی ساخته و تکرار میشه؟
یعنی این چرا مشکل داره و چندین بار تکرار میشه؟ :


کد:
private void Form1_Shown(object sender, EventArgs e)
        {
            Form1 f = new Form1();
            f.Show();
        }
چون رخداد Shown نتیجه اجرا شدن متد ئه Show است، شما در رخداد ای که بعد از نمایش فرم اتفاق می افته درخواست ایجاد و نمایش یک فرم از همون نوع رو دادید. این فرم ایجاد شده همون فرم قبلی نیست ولی به هر حال خودش موقع نمایش رخداد Shown را فراخوانی خواهد کرد و باز این مساله تکرار خواهد شد.
جواب سئوال اول رو فهمیدم
از کلاس Form1 یعنی از تمام رویدادهایی که در اون هست ، یه کپی میگیره و شی Form1 دیگه رو میسازه بنابراین هر بار در رویداد Shown در شی Form1 ، یه فرم Form1 دیگه میسازه


یه سئوالی که پیش میاد اینه که اگه بصورت دستی یه شی از Form تعریف کرده باشیم ، چجوری میشه از این شی فرم ای که ساختیم (نه از کلاس کلی Form) مجددا کپی بگیریم و نمایش بدیم؟
این کپی گرفتن نیست، صرفا ایجاد کردن شی ئه. کدی که شما در تعریف کلاس Form1 نوشته اید جزئی از ساختار Form1 شده. اون کد Form1_Shown هم جزئی از کلاس شده.
هر پنجره ای handle خودش رو داره که یک شماره منحصر بفرد ئه. برای سیستم عامل ویندوز همچین حالتی تعریف نشده که دو پنجره با handle یکسان نمایش داده بشوند، برای همین کپی گرفتن از یک شیء پنجره قابلیت اجرایی نداره.
متد خاصی به نام Clone برای کپی گرفتن از شیء وجود داره که برخی از کلاس ها به واسطه نیاز شون به این قابلیت اون رو دارند.
اون کلاس ها از ICloneable ارث بری می کنند که یک interface ئه و هر کلاسی که ازش ارث بری کنه یک متد Clone خواهد داشت. این متد طبق تعریفی که در هر کلاس روال اش متفاوت خواهد بود از شیء کپی می گیره.
مثلا System.String و Brush و Font و DataGridViewCell این متد رو دارند. داشتن این متد لازمه اش اینه که برنامه نویس کلاس روال و منطق کپی کردن رو نوشته باشه، وگرنه مثلا Clone کردن یک فرم از دید من ممکنه با دید شما فرق داشته باشه.
اینکه صرفا بعضی کلاس ها این قابلیت Clone رو دارند به این دلیل ئه که براشون اون کپی از شیء کاربرد داره. مثلا Font و Brush اگر به یک Device اختصاص پیدا کنند بصورت مشترک در Device دیگه ای قابل استفاده نیستند. ازشان کپی می گیرند تا به Device دیگر تخصیص پیدا کنند.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
ممنون آقا علی
ما اگه بخوایم یه آرایه ی یک بعدی ای بنویسیم که ندونیم این آرایه ی ما چند عضو داره ، از کلاس ArrayList استفاده میکنیم
حالا اگه بخوایم همین قضیه ، این بار آرایه ی چند بعدی بنویسیم (که ندونیم چقدر عضو داریم) ، از چه کلاسی باید استفاده کنیم؟
 

the_king

مدیرکل انجمن
سلام
ممنون آقا علی
ما اگه بخوایم یه آرایه ی یک بعدی ای بنویسیم که ندونیم این آرایه ی ما چند عضو داره ، از کلاس ArrayList استفاده میکنیم
حالا اگه بخوایم همین قضیه ، این بار آرایه ی چند بعدی بنویسیم (که ندونیم چقدر عضو داریم) ، از چه کلاسی باید استفاده کنیم؟
آرایه با لیست فرق داره، در آرایه تعداد اعضاء متغیر نیست و نمی توانید از میان آرایه عضو حذف کنید یا بهش عضو اضافه کنید.
ArrayList آرایه یک بعدی نیست، یک لیست ئه، تفاوت اش با List در اینه که صرفا از نوع داده کلی object استفاده می کنه و فرضا اختصاصی نوع داده int نیست،
در حالی که در List صریحا مشخص می کنید که برای چه نوع داده ای تعریف شده، فرضا <List <int صرفا عضو های int خواهد داشت.

به کلاس Array مراجعه کنید. مشخصه Rank تعداد ابعاد آرایه و GetLength تعداد اعضاء در بعد فلان را مشخص می کند، مثلا (GetLength(0 تعداد اعضاء بعد 0 (اولین بعد) خواهد بود.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
آرایه با لیست فرق داره، در آرایه تعداد اعضاء متغیر نیست و نمی توانید از میان آرایه عضو حذف کنید یا بهش عضو اضافه کنید.
ArrayList آرایه یک بعدی نیست، یک لیست ئه، تفاوت اش با List در اینه که صرفا از نوع داده کلی object استفاده می کنه و فرضا اختصاصی نوع داده int نیست،
در حالی که در List صریحا مشخص می کنید که برای چه نوع داده ای تعریف شده، فرضا <List <int صرفا عضو های int خواهد داشت.

به کلاس Array مراجعه کنید. مشخصه Rank تعداد ابعاد آرایه و GetLength تعداد اعضاء در بعد فلان را مشخص می کند، مثلا (GetLength(0 تعداد اعضاء بعد 0 (اولین بعد) خواهد بود.

ممنون آقا علی
سئوال من رو خوب متوجه نشدین (یا من خوب جواب تون رو درک نمیکنم) چون همینو میگم که با کلاس آرایه ها ، باید تعداد اعضا رو همون اول مشخص کرد . من نمیخوام تعداد اعضا یا تعداد ابعاد آرایه رو بدست بیارم . میخوام مثلا در آرایه ی 2 بعدی ، تعداد اعضای نامشخص رو به آرایه ام بدم
ببینید مثلا من وقتی مینویسم :


کد:
ArrayList myArrayList = new ArrayList();
        private void button11_Click(object sender, EventArgs e)
        {
            myArrayList.Add(textBox1.Text);
            textBox1.Clear();
            textBox1.Focus();
        }

        private void button12_Click(object sender, EventArgs e)
        {
            foreach (object myObj in myArrayList)
            {
                MessageBox.Show(myObj.ToString());
            }
        }

اینو که با آرایه ها نمیتونم بنویسم چون طول شو ندارم . مجبورم با ArrayList بنویسم
حالا همین رو بصورت آرایه ی 2 بعدی اگه بخوام بنویسم چطوری میشه؟ البته آرایه ی 2 بعدی رو میشه با HashTable ها هم نوشت (که مثلا مقدار اولی که طرف وارد میکنه ، توی قسمت key و مقدار دومی توی value از hashtable ها بره) ولی دیگه آرایه ی 3 بعدی یا بالاتر که اعضاشون مشخص نباشه رو دیگه نمیدونم ؟!
 

the_king

مدیرکل انجمن
ممنون آقا علی
سئوال من رو خوب متوجه نشدین (یا من خوب جواب تون رو درک نمیکنم) چون همینو میگم که با کلاس آرایه ها ، باید تعداد اعضا رو همون اول مشخص کرد . من نمیخوام تعداد اعضا یا تعداد ابعاد آرایه رو بدست بیارم . میخوام مثلا در آرایه ی 2 بعدی ، تعداد اعضای نامشخص رو به آرایه ام بدم
ببینید مثلا من وقتی مینویسم :


کد:
ArrayList myArrayList = new ArrayList();
        private void button11_Click(object sender, EventArgs e)
        {
            myArrayList.Add(textBox1.Text);
            textBox1.Clear();
            textBox1.Focus();
        }

        private void button12_Click(object sender, EventArgs e)
        {
            foreach (object myObj in myArrayList)
            {
                MessageBox.Show(myObj.ToString());
            }
        }

اینو که با آرایه ها نمیتونم بنویسم چون طول شو ندارم . مجبورم با ArrayList بنویسم
حالا همین رو بصورت آرایه ی 2 بعدی اگه بخوام بنویسم چطوری میشه؟ البته آرایه ی 2 بعدی رو میشه با HashTable ها هم نوشت (که مثلا مقدار اولی که طرف وارد میکنه ، توی قسمت key و مقدار دومی توی value از hashtable ها بره) ولی دیگه آرایه ی 3 بعدی یا بالاتر که اعضاشون مشخص نباشه رو دیگه نمیدونم ؟!
ArrayList بدترین نوع لیست ئه، مگر اینکه واقعا قصد تون این باشه که به اعضاء هر نوع داده ای اختصاص بدهید، یعنی object باشند،
اگر فرضا اعضاء صرفا string یا صرفا float باشند، توصیه می کنم از <List <string و <List <float استفاده کنید چون به مراتب بهتر از ArrayList ئه.
از نظر فنی تو آرایه چند بعدی هر بعد به بعد های قبلی وابسته است، وقتی طول بعد اول آرایه تون مشخص نیست نمی توانید برای بعد های دوم به بعد کاری بکنید.
Hashtable یا Dictionary و ... هم که کلا بحث شون جدا است، آرایه دو بعدی به حساب نمیان.
شما یا باید یک کلاس آرایه دو بعدی با پیش بینی افزایش طول بسازید. یعنی آرایه فرضا 1000 در 1000 بسازید که جا برای 1000 تا عضو داشته باشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
ممنون آقا علی
هر چند من به جواب خوب (توی قضیه ی آرایه های 2 بعدی در بالا) نرسیدم :)
بگذریم
توی ویژال استودیو، برای ساخت چندین صفحه ی جداگانه طوری که هر پنجره که طراحی میشه برای خودش جداگانه دکمه ی بستن نداشته باشه و همه شون یه دکمه ی بستن داشته باشن و با نشون دادن یک صفحه ، بقیه ی صفحات نمایش داده نشن (مثل صفحات نصب یه نرم افزار و کلا نرم افزارهای دیگه) ، باید از اشیاء کانتینرها استفاده کرد؟ یعنی ازچندین شی panel باید استفاده کرد و یک panel رو نشون (visiable) کرد و بقیه رو نشون نداد.
درسته؟
 

the_king

مدیرکل انجمن
سلام
ممنون آقا علی
هر چند من به جواب خوب (توی قضیه ی آرایه های 2 بعدی در بالا) نرسیدم :)
بگذریم
توی ویژال استودیو، برای ساخت چندین صفحه ی جداگانه طوری که هر پنجره که طراحی میشه برای خودش جداگانه دکمه ی بستن نداشته باشه و همه شون یه دکمه ی بستن داشته باشن و با نشون دادن یک صفحه ، بقیه ی صفحات نمایش داده نشن (مثل صفحات نصب یه نرم افزار و کلا نرم افزارهای دیگه) ، باید از اشیاء کانتینرها استفاده کرد؟ یعنی ازچندین شی panel باید استفاده کرد و یک panel رو نشون (visiable) کرد و بقیه رو نشون نداد.
درسته؟
به روش های مختلفی میشه پیاده سازی اش کرد، سلیقه ای ئه. شخصا برای هر صفحه یک UserControl مجزا می سازم و از همه شان هم از همون ابتدا موقع فراخوانی فرم شیء نمی سازم،
چون هم سرعت فراخوانی و نمایش فرم میاد پایین و هم حافظه بیشتری مصرف میشه. زمانی که لازمه یک صفحه رو نشون بدید اون شیء ساخته بشه، لازم نیست از قبل ساخته باشید اش.
بیشترین کاربرد این سبک فراخوانی زمانی است که می خواهید فرم تنظیمات برنامه بزرگی رو نشون بدید. اونقدر صفحات و تنظیمات زیاد اند که اگه بخواهید یکجا فراخوانی شون کنید کاربر باید زمان زیادی معطل بشه.
مثال پیوستی رو ببینید :
multipage-zip
 

پیوست ها

  • MultiPage.zip
    81.7 کیلوبایت · بازدیدها: 7

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
به روش های مختلفی میشه پیاده سازی اش کرد، سلیقه ای ئه. شخصا برای هر صفحه یک UserControl مجزا می سازم و از همه شان هم از همون ابتدا موقع فراخوانی فرم شیء نمی سازم،
چون هم سرعت فراخوانی و نمایش فرم میاد پایین و هم حافظه بیشتری مصرف میشه. زمانی که لازمه یک صفحه رو نشون بدید اون شیء ساخته بشه، لازم نیست از قبل ساخته باشید اش.
بیشترین کاربرد این سبک فراخوانی زمانی است که می خواهید فرم تنظیمات برنامه بزرگی رو نشون بدید. اونقدر صفحات و تنظیمات زیاد اند که اگه بخواهید یکجا فراخوانی شون کنید کاربر باید زمان زیادی معطل بشه.
مثال پیوستی رو ببینید :
multipage-zip

ممنون آقا علی
توی کد ، یه تیکه شی ای از نوع User Control ها ساختین ولی مقدارش از Page1 و ... هست (تابع LoadPage منظورمه)
من قضیه ی کلاس (مقدار) Page1 و ... رو در اینجا متوجه نشدم
اصلا کلاسی به عنوان Page1 ها داریم؟ من توی یه پروژه ی دیگه هر چی میگردم نیست پس ها؟ فضای نام اش کجاست؟ کلا درباره ی این کلاس یه کم توضیح بدین و آیا این مقدار (یا کلاس) از کلاس UserControl ها ارث بری میکنه که شما شی page رو که میخواستین تعریف کنین از نوع UserControl ها تعریف کردین ولی مقدار کلاس Page1 و ... رو در سمت راست این شی دادین؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بعد اینکه فزق UserControl با Panel چی هه؟
انگار فرق خاصی نباید با هم داشته باشن!


------------------------------
نمیشه پست هایی که نوشتیم رو ویرایش کنیم؟ قبلا این امکان وجود داشت
 

the_king

مدیرکل انجمن
ممنون آقا علی
توی کد ، یه تیکه شی ای از نوع User Control ها ساختین ولی مقدارش از Page1 و ... هست (تابع LoadPage منظورمه)
من قضیه ی کلاس (مقدار) Page1 و ... رو در اینجا متوجه نشدم
اصلا کلاسی به عنوان Page1 ها داریم؟ من توی یه پروژه ی دیگه هر چی میگردم نیست پس ها؟ فضای نام اش کجاست؟ کلا درباره ی این کلاس یه کم توضیح بدین و آیا این مقدار (یا کلاس) از کلاس UserControl ها ارث بری میکنه که شما شی page رو که میخواستین تعریف کنین از نوع UserControl ها تعریف کردین ولی مقدار کلاس Page1 و ... رو در سمت راست این شی دادین؟
Page1 و Page2 و ... فقط اسم کلاس اند، همه شون نوعی UserControl اند، UserControl جدید بسازید و مثلا اسم کلاس اش رو Page123 بذارید.
وقتی کلاس Page1 یک نوع UserControl باشه از UserControl ارث بری کرده و طبیعتا اشیاء اش در هر متغیری از نوع UserControl قابل قبوله.
همونطور که اشیاء Form2 و Form4 رو می توانید در هر متغیری از نوع Form قرار بدهید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی
میگم null کردن یه آرایه یا یک ArrayList در سی شارپ چجوری هه؟
الان مثلا یه ArrayList اگه هیچ چی توش نرفت (یه تابعی که ArrayList رو برمیگردونه ، هیچ مقداری رو توش نزاشت) ، در این صورت میخوام null رو برگردونه و اون شی و متغییری که این ArrayListاز تابع رو هم برمیگردونه رو میخوام بگم اگه null برنگردوند کارشو ادامه بده . باید چی بنویسم؟
من الان بجای قضیه ی null فقط میتونم بگم که چک کن و ببین اگه تعداد اعضای ArrayList صفر نبود ، کار رو ادامه بده
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
درباره ی جواب آرایه های چند بعدی ای که تعداد عضوشونو نمیدونیم ، به نظرم بهتره از آرایه ای از ArrayList ها استفاده بشه . درسته؟
خود ArrayList که به عنوان آرایه عمل میکنه اما اگه چند بعدی خواستیم ، آرایه ای از ArrayList ها درست کنیم فکر کنم به جواب مون برسیم (یا حتی آرایه ی چند بعدی از ArrayList ها درست کنیم)
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بجز حالت دستی ، یعنی فقط با استفاده از توابع داخل کلاس های آرایه ها و لیست ها و ... ، نمیشه یه آرایه رو توی یه آرایه ی دیگه کپی کرد؟ یا یه لیست و ... رو توی آرایه؟
مثلا من الان اگه بخوام یه HashTable رو توی آرایه ای از int ها کپی کنم باید چی کار کنم؟
من اینو مینویسم ولی میگه نمیتونه این دو رو به هم تبدیل کنه :


کد:
Hashtable abc = new Hashtable();
            abc[0] = 0;
            abc[1] = 100;
            abc[2] = 200;
            abc[3] = 300;
            int[] aTemp = new int[10];
            abc.CopyTo(aTemp, 0);
            foreach (var item in aTemp)
            {
                MessageBox.Show(item.ToString());
            }

فقط روش دستی وجود داره که دونه دونه اعضای Hashtable رو بخونیم و بریزیم توی دونه دونه اعضای آرایه ها؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بعد اینکه با foreach بخوان یه sortedlist رو طی کنیم و اعضاشو ببینیم چی باید بنویسیم؟
با for چطور؟
2000 تا سئوال شد
:)
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
فهمیدم
برای کپی کردن ، باید از پروپرتی Value یا Keys از HashTable کمک بگیریم یعنی : Hashtable.Value.CopyTo
یا بجای Value از Keys هم میشه استفاده کرد (برای کپی کلیدها)
نه اینکه مستقیم از متد CopyTo از HashTable ها کمک بگیریم

-----------------------

درباره ی کپی کردن هم انگار بهتر روش برای trace کردن HashTable ها ، حلقه ی foreach هه (نه حلقه ی for)
فقط توی مثال هایی که پیدا کردم ، نمیدونم چرا شی item رو از نوع DictionaryEntry میگیرن؟ یعنی کسی که اینو نمیدونه از کجا باید تشخیص بده؟ همیشه کلاسی که برگردونده میشد توسط اعضای آرایه ، برای شی item در نظر گرفته میشد یعنی اینجا اگه طبق روش مرسوم پیش میرفت ، باید کلاس object ها میبود!! :


کد:
int[] myArr=new int[10];
            SortedList abc = new SortedList();
            abc[5] = 456;
            abc[0] = 97;
            abc[3] = 521;
            abc[8] = -28;
            abc[6] = 689;
            abc[2] = 101;
            abc[9] = -10;
            abc[1] = 0;
foreach (DictionaryEntry item in abc)
            {
                MessageBox.Show("key : " + item.Key + "\nvalue : " + item.Value);
            }
 

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

بالا