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

شروع موضوع توسط saalek110 ‏27 دسامبر 2006 در انجمن برنامه‌نویسی C و هم خانواده‌هایش

  1. SajjadKhati

    SajjadKhati کاربر فعال <A href="http://forum.majidonline.com/f

    ارسال‌ها:
    754
    تشکر شده:
    223
    امتیاز دستاورد:
    43
    ممنون آقا علی
    راستی تازه دقت کردم . چرا از or استفاده کردین؟ مگه نباید and بزارین توی (Keys.E | Keys.Control)
    ؟؟
    در این صورت مگه یکی از شرط ها برقرار باشه ، اجرا نمیکنه؟ یعنی چرا در این صورت فقط دکمه ی کنترل یا دکمه ی E زده میشه ، جداگانه برای هر کدوم کد اجرا نمیشه؟ فرضا دکمه ی E تنها رو بزنیم (بدون زدن دکمه کنترل) ، خوب طرف اول true میشه و طرف دوم false و or هم در این شرایط true جوابش میشه یعنی باید کد رو اجرا کنه که!!
     
    نوشته شده توسط SajjadKhati در ‏9 آوریل 2016
  2. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    10,337
    تشکر شده:
    10,280
    امتیاز دستاورد:
    113
    کدوم شرط؟ در (Keys.E | Keys.Control) هیچ شرطی وجود نداره. Keys.E یک مقدار ئه، و Keys.Control هم یک مقدار دیگه و حاصل | شون هم یک مقدار دیگه. به پارانتز ها توجه کنید، مقدار جزئی از محتوای داخل پارانتز به بیرون نمی پره،
    شما مقدار کل داخل پارانتز رو به == تحویل می دهید. مثلا (x == (a | b یکبار x رو با a و یکبار x رو با b مقایسه نمی کنه، اینطوری نیست، مقدار x رو با (a | b) مقایسه می کنه. حالا چه | باینری باشه و چه منطقی.
    یادتون نره که در عملگر های باینری صحبت از محاسبات بیتی ئه، مثل || و && عملگر شرطی نیستند و کاری هم با true و false بودن ندارند.

    شما در مورد عملگر های باینری رو مطالعه کنید، می بینید که عملگر & برای ترکیب کردن دو مقدار اصلا مناسب نیست. امتحان کنید :
    کد (Text):

                Keys a = (Keys.E | Keys.Control);
                Keys b = (Keys.E & Keys.Control);
                MessageBox.Show(string.Format("a = {0}\nb = {1}", a, b));
     
     
    نوشته شده توسط the_king در ‏9 آوریل 2016
    SajjadKhati از این پست تشکر کرده است.
  3. SajjadKhati

    SajjadKhati کاربر فعال <A href="http://forum.majidonline.com/f

    ارسال‌ها:
    754
    تشکر شده:
    223
    امتیاز دستاورد:
    43
    ممنون آقا علی
    آقا الان هر جا علامت | یک دونه ای اومد بهش میگن عملگر بیتی یا هر وقت عملگری بین اعداد اومدن بهشون میگن بیتی؟ آخه نام گذاری اگه بر اساس یک علامت | یا دو علامت || باشه یعنی اگه هر جا | اومد بگن بیتی یا هر جا || اومد بگن منطقی که ربطی نداره چون همه جا کار | اینه که همه ی شرط ها رو چک کنه و کار || اینه که به محض اولین شرط نقص کننده ، از اجرا صرف نظر کنه
    سئوال بعد اینکه اگه خاصیت location برای محور x ها یا y ها رو بخوایم جابا کنیم ، باید چجوری کد بنویسیم و چرا کد زیر غلط هه و باید چجوری نوشته شه؟ :

    کد (Text):

    button12.Location.X = 150;
     
    سوم اینکه من به جواب اون قضیه ی کد دادن به رویداد شی ای که موقع اجرای پروژه ایجاد میکنیم ، رسیدم (البته خیلی ممنون از روش تون) و اونم این جوری بود و حالا چون دلیگیت ها و این جور چیزا رو نرسیدم ، بعدا باید ساختارشو ببینم چیه دقیق :

    کد (Text):

            private void button12_Click(object sender, EventArgs e)
            {
                Button CreatedObj = new Button();
                Controls.Add(CreatedObj);
                CreatedObj.Click += CreatedObj_Click;


            }


            private void CreatedObj_Click(object sender, EventArgs e)
            {
                MessageBox.Show("New Code For Created Object");
            }
     
    بعد از نوشتن علامت = در خط پنجم (آخرین خط رویداد button12_Click) ، دو بار دکمه tab رو بزنیم ، رویداد مورد نظر رو خودش میسازه که توش میتونیم کدهامونو بنویسیم (راحت تر از AMS بود کد جدید دادن توی سی شارپ :))
    البته شما هم همین کد رو گفتین ولی قسمت آخر که رویداد جدید با زدن tab ایجاد میشد رو فقط اضافه شد که از کدی که قبلا دادین خیلی ممنونم
    اما با این حال ، بازم عظیم ترین مشکل من توی این قسمت میمونه اونم اینکه اگه تعداد شی ای که میخوایم بسازیم (مثلا با اجرای رویداد کلیک button12 در کد بالا ، اشیاء ای که ساخته میشه)
    زیاد باشه و یا اگه توی حلقه ای بخوایم مثلا به تعداد 100 تا یا 1000 تا شی بسازیم ، اون وقت دیگه محاله که برای هر کدوم با زدن دوبار کلید tab ، کدها رو خودمون ست کنیم . اون موقع باید چی کار کرد؟!

    ---------

    آقا علی والا من شرمنده ام که این قدر زیاد جواب میدین . باعث خستگی تون میشه . کلا کلیات رو مثلا برای هر سئوالی توی یکی دو خط بگین و بجای بعضی از قسمت ها منبع بگین برام کافی هه و هم شما این قدر خسته نمیشین برای نوشتن
    :rose:
     
    آخرین ویرایش: ‏9 آوریل 2016
    نوشته شده توسط SajjadKhati در ‏9 آوریل 2016
  4. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    10,337
    تشکر شده:
    10,280
    امتیاز دستاورد:
    113
    بله، هر وقت | یا & رو بین اعداد صحیح دیدید مطمئن باشید که عملگر بیتی ئه و هر جا بین مقادیر بولی دیدید مطمئن باشید که عملگر منطقی ئه، عملگر های | و & شرطی نیستند، || و && شرطی اند.
    و مجدد تاکید می کنم که | نماد دو عملگر کاملا متفاوت ئه، یکی شون عملگر بیتی یا باینری OR ئه و یکی شون عملگر منطقی OR ئه. هر جا در کد با | روبرو شدید با توجه به نوع مفادیری که در عملوند هایش می بینید
    به سادگی می توانید تشخیص بدهید که عملگر بیتی است یا عملگر منطقی. در مورد & هم همینطور.

    اینکه نمی توانید Location.X رو تغییر دهید مقصر خود button12 یا X یا Location نیست. دلیلش این است Point که Location از نوع آن است یک ساختار است، struct ئه، نه کلاس.
    یک تفاوت اساسی میان struct و class این است که کلاس ها reference type اند و struct ها value type اند. به عبارت ساده یعنی اگر مقدار یک شیء کلاس را از یک متغیر در متغیر دیگری کپی کنید
    همان شیء را در متغیر مقصد خواهید داشت، ولی اگر شیء ساختار را کپی کنید یک نسخه جدید ولی با مقادیر مشابه قبلی ساخته می شود.
    وقتی مقدار Location را از button12 می خوانید به شما یک کپی از آن شی Point تحویل داده می شود نه خودش. کامپایلر برای این خطا می گیرد که شما متوجه این نکته باشید که شما دارید X یک نسخه کپی را عوض می کنید
    که جایی هم ثبت نمی شود و و ربطی به Location ندارد.
    یا Left را عوض کنید که همان مقدار X را تغییر می دهد و یا یک Point به Location تحویل بدهید :
    کد (Text):

                button1.Left = 150;
     
    کد (Text):

                button1.Location = new Point(150, button1.Top);
     
    کد (Text):

                button1.Location = new Point(150, button1.Location.Y);
     
    اگر خواستید یک کنترل را روی فرم قرار دهید و بعدا با نام بهش دسترسی داشته باشید برایش مشخصه Name تعیین کنید :
    کد (Text):

                Button b = new Button();
                b.Name = "b1000";
                Controls.Add(b);
     
    کد (Text):

                Controls["b1000"].Text = "Exit";
     
    و فراموش نکنید که فرم و هر کنترل دیگری که خودش کنترل های دیگری داخلش قرار می گیرد مثل GroupBox و Panel ها با مشخصه Controls به فرزند ها دسترسی دارند و Controls فقط مجموعه کنترل های فرزند است، نه نوه و نتیجه.
    پس الزاما اون Controls فرم شامل همه کنترل هایی که روی فرم می بینید نیست یعنی اگر کنترلی رو فرضا در داخل GroupBox قرار دادید دیگه در Controls فرم دنبالش نگردید.
     
    نوشته شده توسط the_king در ‏9 آوریل 2016
    SajjadKhati از این پست تشکر کرده است.
  5. SajjadKhati

    SajjadKhati کاربر فعال <A href="http://forum.majidonline.com/f

    ارسال‌ها:
    754
    تشکر شده:
    223
    امتیاز دستاورد:
    43
    ممنون آقا علی
    این تیکه رو ندیدین :):

    اما با این حال ، بازم عظیم ترین مشکل من توی این قسمت میمونه اونم اینکه اگه تعداد شی ای که میخوایم بسازیم (مثلا با اجرای رویداد کلیک button12 در کد بالا ، اشیاء ای که ساخته میشه) زیاد باشه و یا اگه توی حلقه ای بخوایم مثلا به تعداد 100 تا یا 1000 تا شی بسازیم ، اون وقت دیگه محاله که برای هر کدوم با زدن دوبار کلید tab ، کدها رو خودمون ست کنیم . اون موقع باید چی کار کرد؟!

    ---------

    آقا علی والا من شرمنده ام که این قدر زیاد جواب میدین . باعث خستگی تون میشه . کلا کلیات رو مثلا برای هر سئوالی توی یکی دو خط بگین و بجای بعضی از قسمت ها منبع بگین برام کافی هه و هم شما این قدر خسته نمیشین برای نوشتن :rose:
     
    نوشته شده توسط SajjadKhati در ‏9 آوریل 2016
  6. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    10,337
    تشکر شده:
    10,280
    امتیاز دستاورد:
    113
    اول بررسی کنید و ببینید برای چه منطوری باید توی یک فرم این تعداد زیاد کنترل رو هنگام اجرا بسازید و ثانیا تعداد روتین های مستقل چند تا است. چه چیزی در هنگام طراحی فرم مبهمه که در زمان طراحی فرم نمی توانید
    کنترل ها رو رویش بچینید. این نکته در نظر گرفته شده که چینش کنترل ها در زمان اجرا نمی تونه به هوشمندی و ظرافت زمان طراحی باشه؟
    قاعدتا وقتی داخل حلقه کنترل می سازید داخل همان حلقه هم می توانید متد به رخداد متصل کنید، هر کار تکراری بیرون حلقه می تواند داخل حلقه قرار داشته باشد.
    اما به هر حال فرمی که این تعداد کنترل روی اون باشه طراحی اش چندان اصولی نیست و کاربری اش دشوار ئه.
    اینجور طراحی ها معمولا یک تصویر کامل اند، برای هر شی ای یک کنترل روی فرم قرار نمی دهند :

    [​IMG]

    شما کنترل DataGridView رو ببینید، مثلا برایتان جدولی میسازه با هزاران خانه که بتوانید داخلشان متن تایپ کنید، اما برای هر خانه یک TextBox نمی سازه، صرفا یک TextBox رو اونجایی قرار میده که در اون لحظه
    می خواهید داخلش تایپ کنید. این کار رو برای این انجام میده که ساختن صد ها کنترل هم زمان لازم داره و هم حافظه مصرف می کنه و هم رسم شون چالش ایجاد می کنه.
     
    نوشته شده توسط the_king در ‏10 آوریل 2016
    SajjadKhati از این پست تشکر کرده است.
  7. SajjadKhati

    SajjadKhati کاربر فعال <A href="http://forum.majidonline.com/f

    ارسال‌ها:
    754
    تشکر شده:
    223
    امتیاز دستاورد:
    43
    ممنون آقا علی
    آقا علی اگه وقت کردین به این اتوران نگاه کنین :

    http://forum.majidonline.com/thread...رایش-اینترنت?p=1380512&viewfull=1#post1380512

    مثلا کاربر توی هر صفحه میتونه چند شی دکمه ایجاد کنه که هر شی دکمه ای که ایجاد میشه باید یه کدی بهش اضافه بشه . و کلا 30 صفحه از اینا داره که کلا میشه 300 تا نرم افزار بهش اضافه کرد . همچین چیزی رو با کد بالا توی #C بخوام درست کنم تقریبا میشه گفت نشدنی هست چون اولا 300 بار که نمیشه مثل کد بالا ، توی هر شی دکمه ، کد نوشت (حالا اینکه اتوران بالا از لحاظ بهینه سازی بسیار ضعیفه و اگه بجای صفحه بندی و دکمه سازی ، از شی درخت استفاده میشد و کاربر میتونست تو شی درخت ، نرم افزار رو اضافه کنه ، اصلا با کد بالا امکان پذیر نیست چون با این روش کاربر واقعا بصورت نامعلومی میتونه نرم افزار اضافه کنه) و دوما گاها حلقه for نیاز هست چون وقتی به صفحه ای میرسه ، نرم افزارهایی که توی دیتابیس بود ، باید موقع ورود به یک صفحه ای ، اضافه بشن و گاها هم لازم نیست حلقه for و اون وقتی هه که کاربر خودش بخواد نرم افزاری اضافه کنه
    اگه یه نگاه بهش کنین و چند تا نرم افزار بهش اضافه کنین و بعد اتوران رو ببندید و دوباره وارد همون صفحه ای که نرم افزار رو اضافه کردید بشید ، منظورم رو از مشکل کد در پست بالا و قضیه ی حلقه ی for متوجه میشین (و اگه ساختار اتوران بالا و صفحات متعددی که داره رو بجاش در یک صفحه و در یک شی درخت یا Tree تصور کنید ، باز بهتر مشکل کد باال رو متوجه میشین)


    شما یه مثال میزنید بیشتر متوجه شم؟ مثلا یه آرایه داریم که به تعداد اعضای اون آرایه میخوایم کد مثال بالا رو بسازیم یعنی به تعداد اعضای آرایه ، میخوایم شی ایجاد و داخل هر شی کد بریزیم (دقت کنید که چون صفحات و دسته بندی ها متفاوت هه ، آرایه ها هم در هر صفحه از اتوران متفاوت هه پس تعداد اعضای آرایه هر بار متفاوت میشه که نمبدونیم چقدره) :

    کد (Text):

    int[] MyArray = {3,5,30,95,41};
                for (int i = 0; i < MyArray.Length; i++)
                {
                    Button CreatedObj = new Button();
                    Controls.Add(CreatedObj);
                    CreatedObj.Click +=
                }
     
    تازه خود کد بالا هم مشکل داره و همش هر بار شی ای با یک نام میسازه . میشه با همون پروپرتی Name نام هر شی ای که ساخته میشه هر بار رو بوسیله شمارنده i تغییر داد که نام ها شبیه هم نشن؟
    حالا از لحاظ جابجایی location اشیاء هم فعلا فرض کنید که حله .
    الان من در ادامه ی کد بالا باید چی بنویسم در حالی که تعداد اعضای آرایه رو نمیدونم و آرایه های مختلفی وجود دارند که هر کدوم تعداد اعضاشون متفاوت هه

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

    بعد در کد پست 84 که برای قضیه Location دادید و گفتید از نوع استراکچر هست ، برای درک کامل باید به مبحث استراکچرها برسم دیگه؟ درسته؟
     
    آخرین ویرایش: ‏10 آوریل 2016
    نوشته شده توسط SajjadKhati در ‏10 آوریل 2016
  8. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    10,337
    تشکر شده:
    10,280
    امتیاز دستاورد:
    113
    توصیه می کنم تا زمانی که به زبان و Framework اش مسلط نشدید صرفا مثال های کوچک و ساده رو طراحی کنید.
    مثل این میشه که کسی که به دستور زبان مسلط نیست شروع به تالیف کتاب چند جلدی کنه.
    برای همچین مواردی اول یک لیست از عملیاتی که باید امکان پذیر باشه می سازند، مثلا عملیاتی که دکمه بتونه انجام بده :
    کد (Text):

            public enum Actions
            {
                None, Exit, MessageBox, OpenFile, BrowseFolder, PlaySound, StopSound, PlayMusic, StopMusic
            }
     
    و برای هر دکمه قابلیت تعریف کردن یک عملیات و پارامتری برای اون عملیات اضافه می کنند :
    کد (Text):

            class MyButton : System.Windows.Forms.Button
            {
                public Actions Action
                {
                    get;
                    set;
                }

                public string ActionParameter
                {
                    get;
                    set;
                }
            }
     
    هر دکمه ای یکی از این عملیات رو انجام میده، با توجه به عملیاتی که برایش تعیین شده میشه به سادگی در یک switch فعالیت ها رو کد نویسی کرد :
    کد (Text):

            private void MyButton_Click(object sender, EventArgs e)
            {
                var b = sender as MyButton;
                switch (b.Action)
                {
                    case Actions.Exit:
                        Application.Exit();
                        break;
                    case Actions.MessageBox:
                        MessageBox.Show(b.ActionParameter);
                        break;
                    case Actions.OpenFile:
                        var info = new System.Diagnostics.ProcessStartInfo(b.ActionParameter);
                        info.UseShellExecute = true;
                        System.Diagnostics.Process.Start(info);
                        break;
    [COLOR="#A9A9A9"]                .
                    .
                    .
    [/COLOR]            }
            }
     
     
    نوشته شده توسط the_king در ‏10 آوریل 2016
    SajjadKhati از این پست تشکر کرده است.
  9. SajjadKhati

    SajjadKhati کاربر فعال <A href="http://forum.majidonline.com/f

    ارسال‌ها:
    754
    تشکر شده:
    223
    امتیاز دستاورد:
    43
    ممنون آقا علی
    آقا قضیه ی علامت ~ که فکر کنم بهش بگن نات چجوری محاسبه میشه؟
    یعنی مثلا عدد 10 در مبنای دهدهی که میشه همون 1010 در مبنای باینری ، وقتی مینویسیم 10~ چجوری میشه که عدد 11- رو برمیگردونه؟
    مگه نات عدد ها را برعکس نمیکنه؟ یعنی عدد 1010 را تبدیل به 0101 نمیکنه؟ خوب این که باید بشه عدد 5 . اگه بیت اولش هم علامت رو مشخص کنه ، بازم عدد 11- نباید بشه
    چجوری هه؟
     
    نوشته شده توسط SajjadKhati در ‏13 آوریل 2016
  10. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    10,337
    تشکر شده:
    10,280
    امتیاز دستاورد:
    113
    عدد 10 که فقط چهار تا بیت که نیست، مثلا اگه int باشه که یک مقدار 32 بیتی ئه باینری اش 00000000000000000000000000001010 میشه، Not اش کنید 11111111111111111111111111110101 بدست میاد.
     
    نوشته شده توسط the_king در ‏13 آوریل 2016
    SajjadKhati از این پست تشکر کرده است.
  11. SajjadKhati

    SajjadKhati کاربر فعال <A href="http://forum.majidonline.com/f

    ارسال‌ها:
    754
    تشکر شده:
    223
    امتیاز دستاورد:
    43
    آها ممنون
    آره int هه
    ولی این 11111111111111111111111111110101 هم که عدد 11- نمیشه و خیلی باید بزرگتر از این حرفا باشه !!
     
    نوشته شده توسط SajjadKhati در ‏13 آوریل 2016
  12. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    10,337
    تشکر شده:
    10,280
    امتیاز دستاورد:
    113
    قبلا هم عرض کردم در مورد مباحث محاسبات دودویی / باینری مطالعه کنید. اعداد باینری و تبدیل عدد منفی به مثبت و مثبت
    به منفی جزو آموزش های اولیه مبانی کامپیوتر و برنامه نویسی است. ربطی به زبان خاصی نداره.
     
    نوشته شده توسط the_king در ‏13 آوریل 2016
    SajjadKhati از این پست تشکر کرده است.
  13. SajjadKhati

    SajjadKhati کاربر فعال <A href="http://forum.majidonline.com/f

    ارسال‌ها:
    754
    تشکر شده:
    223
    امتیاز دستاورد:
    43
    ممنون
    فهمیدم

    اولین بیت میشه منفی اون عدد ولی من فکر میکردم بجای یک فقط باید علامت منفی را گذاشت و فکر نمیکردم که خود اون عدد منفی رو باید حساب کرد
     
    نوشته شده توسط SajjadKhati در ‏14 آوریل 2016
  14. SajjadKhati

    SajjadKhati کاربر فعال <A href="http://forum.majidonline.com/f

    ارسال‌ها:
    754
    تشکر شده:
    223
    امتیاز دستاورد:
    43
    سلام
    آقا این کد چرا خطا داره؟ :

    کد (Text):

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.IO;


    namespace TestFileDelConsol
    {
        class Program
        {
            static void Main(string[] args)
            {
                string DelPath = Console.ReadLine();
                Program MyApp = new Program();
                MyApp.DelFile(DelPath);
                Console.ReadKey();
            }


            void DelFile(string DelPath)
            {
                Directory.Delete(DelPath);
            }
        }
    }
     

    توی پروژه ی کنسولی ، میخوام یه فایل رو از ورودی از کاربر بگیره و اونو حذف کنه
    خطا میده که مسیر فایل وارد شده اشتباه هست
    فایل تمرینی من توی مسیر G:\a.txt هست که علاوه بر این جور نوشتن ، بصورت دو تا بک اسلش یعنی G:\\a.txt هم نوشتم که هر دو بار خطا داد . مگه باید نام و مسیر فایل رو چجوری وارد کنم؟
    بعد اینکه متد DelFile رو که در همون کلاس نوشته شد رو نمیتونم توی تابع Main بصورت مستقیم (بدون ایجاد شی) فراخونی کنم؟ من یادمه که قبلا توی یک کلاس اگه متدهای مختلفی مینوشتم ، بصورت مستقیم میشد فراخونی شون کنم!
    -------------------
    بعد اینکه این شدنی هست که پروژه و توابع مورد نظر در سی شارپ رو بجای اینکه بصورت dll دربیارم و توی لوا فراخونی کنم ، بصورت کنسولی دربیارم و فراخونی کنم دیگه؟ این طوری اون برنامه ای که در سی شارپ نوشته شد ، کلا کارش رو جداگانه انجام میده دیگه؟
     
    آخرین ویرایش: ‏1 می 2016
    نوشته شده توسط SajjadKhati در ‏1 می 2016
  15. SajjadKhati

    SajjadKhati کاربر فعال <A href="http://forum.majidonline.com/f

    ارسال‌ها:
    754
    تشکر شده:
    223
    امتیاز دستاورد:
    43
    آقا علی جواب میدین که چرا کد بالا کار نمیکنه؟
     
    نوشته شده توسط SajjadKhati در ‏2 می 2016
  16. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    10,337
    تشکر شده:
    10,280
    امتیاز دستاورد:
    113
    اگه شما پوشه ای به نام a.txt داشته باشید Directory.Delete براتون پاک اش می کنه. خیلی طبیعی است که Directory.Delete با File.Delete فرق داشته باشه.
    DelFile ای که ساخته اید کاری با متغیر های سراسری کلاس نداره، تنها پارامتر ورودی اش است که روی کارکردش تاثیر داره، شما دارید در یک Main ئه static کد اجرا می کنید، تابع static که مستقل از شیء اجرا میشه.
    اگه تابع تون رو هم static تعریف اش کنید دیگه لازم نمیشه برای پاک کردن یک فایل از کلاس Program شیء جدیدی بسازید.
    کد (Text):

            static void Main(string[] args)
            {
                string delPath = Console.ReadLine();
                DelFile(delPath);
                Console.ReadKey();
            }

            static void DelFile(string delPath)
            {
               File.Delete(delPath);
            }
     
    معمولا نه، چون ارتباط با برنامه کنسولی شباهتی با Call کردن توابع یک DLL نداره. دقت کنید که توابع مورد نظر چیزی نیست که بشه برایش نظر داد.
     
    نوشته شده توسط the_king در ‏2 می 2016
    SajjadKhati از این پست تشکر کرده است.
  17. SajjadKhati

    SajjadKhati کاربر فعال <A href="http://forum.majidonline.com/f

    ارسال‌ها:
    754
    تشکر شده:
    223
    امتیاز دستاورد:
    43
    سلام
    ممنون آقا علی
    آو . من تازه متوجه شدم که اگه از یه متد static اگه بخوایم یه متد دیگه حتی متد داخل خود همون کلاس را فراخونی کنیم ، باید ازش شی درست کنیم . حتی با کلمه ی کلیدی this هم در همون کلاس دسترسی نداریم به اون متدی که میخوایم فراخونی کنیم . چرا نمیدونم!!
    ظاهرا static بودن باعث میشه خود همون کلاس وقتی از جای دیگه میخواد فراخونی بشه ، بصورت مستقیم (بدون ایجاد شی) فراخونی بشه ولی اگه از توی خود همون متذ static بخوایم متد دیگه ای رو فراخونی کنیم ، باید شی ایجاد کنیم براش (در صورت static نبودن متد مورد نظر و مورد فراخونی) ولی اگه از داخل متد غیر static ای ، متد دیگه ای رو از داخل همون کلاس فراخونی کنیم ، بدون نیاز به ایجاد شی هم میتونیم این کار رو کنیم !!
    حالا این قضیه بماند . سئوال من این نیست

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

    سئوال من اینه که اولا کلاس control ، کلاسی هست که همه ی کلاس های کنترل های دیگه مثل کلاس Button ها و ... داخلش هستند دیگه . درسته؟
    بعد اینکه هر کنترل ، پروپرتی ای داره بنام controls که کالکشن رو برمیگردونه که اشیاء داخل کانتینر ما داخل اون کالکشن هستند . درسته؟ مثلا برای اینکه بدونیم داخل کانتینر شی form یا شی tab و ... ما چه اشیایی وجود دارند ، اول نام اون شی کانتینر مورد نظر را مینیسیم و بعد پروپرتی controls اش رو مینویسیم که این پروپرتی ، یه کالکشن که حاوی تمام کنترل های داخل اون شی کانتینر ما هست را برمیگردونه . درسته؟ که حالا چون از نوع کالکشن هست ، با حلقه ی for یا foreach میتونیم به اعضاش (اشیاء داخل کنترل کانتینر مون) دسترسی پیدا کنیم که حالا خود هر شی (هر شی داخل کانتینر) ، مشخص هست که پروپرتی و متد و کلا اعضای مورد نظر خودش رو داره (مثل text و name و ...)

    من زیاد با پروپرتی ها آشنا نیستم ولی انگار باز خود همین پروپرتی controls مون باز حاوی چند اعضای دیگه مثل add و count و ... هست (که بعضی هاشون رو مثل همین addو count رو میدونم چی کار میکنن) اما مگه پروپرتی ها هم اعضای داخلی دارند؟ یعنی ممکن هست داخل یک پروپرتی ، متد تعریف کرد (حالا بازم نمیدونم چون کامل با پروپرتی ها آشنا نیستم و هنوز نرسیدم) اما نمیشه به متد تعریف شده داخل یک پروپرتی ، دسترسی داشت . میشه؟
    این اجزای داخلی در داخلی در داخلی یه کم منو گیج کرد .

    بعد اینکه پروپرتی controls مگه فقط برای کنترل های کانتینر کاربرد نداره؟ پس چرا در همه ی کنترل ها مثل کنترل های Button و ... در دسترس هست؟ یعنی وقتی میگیم Button1.Controls ، عملا برای ما کاربردی نداره دیگه؟ چون شی
    Button1 ما از نوع کنترل کانتینر نیست و اشیاء دیگه ای داخلش قرار نمیگیره دیگه؟!

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

    بعد اینکه مگه همه ی اشیاء مثل Button و ... که خودشون کلاس هستند ، از اعضای کلاس Control ارث نمیبرن؟ ولی چرا این کلاس Control با بقیه ی کلاس هاس اشیاء جدا از هم هستند؟ یعنی مایکروسافت چرا کلاس بقیه ی اشیاء را در داخل کلاس Control نذاشت؟
     
    آخرین ویرایش: ‏5 می 2016
    نوشته شده توسط SajjadKhati در ‏5 می 2016
  18. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    10,337
    تشکر شده:
    10,280
    امتیاز دستاورد:
    113

    به عبارت دقیق تر تمامی کلاس های کنترل بصورت بی واسطه یا با واسطه از کلاس Control ارث برای کرده اند و همه شون وارث ویژگی های این کلاس اند. این کلاس پدر تمامی کلاس های کنترل ای است.

    بله، ولی صرفا فرزندان، کاری به نوه و نتیجه نداره.

    ربطی به Property بودن و نبودن نداره، اون نوع داده ای که به مشخصه داده میشه ممکنه کلاس یا ساختار باشه که طبیعتا اعضاء داخلی و متد داره. لازم نیست که Property باشه، اگر متغیر هم بود و نوع داده اش کلاس یا ساختار بود همین اتفاق می افتاد.
    کد (Text):

        class MyClass
        {
            public MyClass Member
            {
                get
                {
                    return this;
                }
            }
        }
     
    کد (Text):

                MyClass c = new MyClass();
                string name = c.Member.Member.Member.Member.Member.Member.ToString();
                MessageBox.Show(name);
     
    همه کنترل ها می توانند عضو داشته باشند، ولی فقط بعضی از کنترل ها اجازه دارند که در هنگام طراحی فرم بصورت ویژوال فرزند قبول کنند و استایل ControlStyles.ContainerControl دارند).
    این ربطی به Controls نداره، اون همچنان با کد نویسی کار می کنه. امتحان کنید :
    کد (Text):

                button2.Parent = button1;
                button2.Location = new Point(10, 10);
     
    کد (Text):

                button1.Controls.Add(button2);
                button2.Location = new Point(10, 10);
     
    هر کلاس ای برای یک منظور تعریف شده و تمامی فرزندانش با اون تعریف و کاربرد مطابقت دارند. مثلا هر شیء ای که از خانواده Control باشه می تونه روی فرم قرار بگیره. چه کلاسش رو شما ساخته باشید
    و چه طراحان مایکروسافت. اما این به این معنا نیست که فرزندان رو داخل کلاس والد تعریف کنند. به این نکته توجه کنید که وراثت سلسله مراتبی است و به یک درجه وراثت ختم نمیشه.
    اگر بخواهید به یک کلاس داخل یک کلاس دیگر دسترسی داشته باشید ناچارید اسم کلاس والد رو هم بنویسید، اسم کلاس چیزی نیست که با using خلاصه بشه.
    طبیعتا اگر شما بخواهید یک کلاس از خانواده Panel بسازید، از Panel ای ارث بری می کنید که خودش فرزند ScrollableControl ئه که شامل کنترل هایی است که می تواند اسکرول افقی یا عمودی داشته باشند و
    ScrollableControl خودش فرزند Control ئه. به نظرتون بهتره که از System.Windows.Forms.Panel ارث بری کنید یا System.Windows.Forms.Control.ScrollableControl.Panel ؟
    از طرف دیگه عملکرد Control وابسته به Button یا Panel نیست که لازم باشه حتما تعریف Button رو داخل Control بنویسند.
     
    نوشته شده توسط the_king در ‏6 می 2016
    SajjadKhati از این پست تشکر کرده است.
  19. SajjadKhati

    SajjadKhati کاربر فعال <A href="http://forum.majidonline.com/f

    ارسال‌ها:
    754
    تشکر شده:
    223
    امتیاز دستاورد:
    43
    ممنون آقا علی
    من زیاد متوجه این کد نشدم
    اولین c.Member یعنی پروپرتی Member که خودش کلاس MyClass رو برمیگردونه . دومین Member به بعدش یعنی باز هم همین کلاس رو برگردونه
    اصلا کلا یعنی چی؟ یه چیزی کلاس رو برگردونه یعنی دقیقا چی رو برمیگردونه؟
    -----------------------
    ببینید من کلا تازه متوجه شدم یه کم که توی سی شارپ باید نقطه به نقطه ترجمه کرد تا گیج نشد مثلا فرق کنید یه متدی بنام MyMeth در کلاس MyClass که هر دو public static هستند ، یه عدد رو برمیگردونه بنابراین وقتی مینویسیم :

    کد (Text):

    MyClass.MyMeth().ToString().Length;
     
    یعنی اول نقطه ی اولی یعنی MyClass.MyMeth() رو ترجمه کنیم که عدد رو برمیگردونه . از اونجا که هر چیزی شی هست در سی شارپ و همه ی اشیاء متد اکستنشن تبدیل رشته رو دارن ، MyClass.MyMeth().ToString() یعنی اون عدد رو به رشته تبدیل کن و از اونجا که این کد یه رشته رو برمیگردونه و رشته هم یه کلاس (شی) هست و هر کلاس یا شی ای ممکنه اعضای مختلف داشته باشن ، کلاس رشته ی ما هم اعضای مختلف داره پس با MyClass.MyMeth().ToString().Length; به پروپرتی Length از کلاس رشته دسترسی داریم که طول رشته ی داده شده (در نقطه ی قبلی) رو برمیگردونه
     
    نوشته شده توسط SajjadKhati در ‏7 می 2016
  20. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    10,337
    تشکر شده:
    10,280
    امتیاز دستاورد:
    113
    اون چیزی که بر می گردونه نوع داده اش کلاس ئه و مقداری که بر می گردونه تو کد Property مشخص میشه، در کد نوشته ام return this، یعنی مشخصه Member خود شیء c رو بر می گردونه.
    مثالی که زدم صرفا برای مشخص کردن همون موضوعی بود که بهش اشاره کردید، این بهم پیوستگی اشیاء در زبان های شی گرایی کد نویسی رو ساده می کنه، دیگه لازم نمیشه که پس از بدست آوردن هر خروجی میانی مجبور
    به ساختن یک متغیر برای ذخیره کردنش بشویم.
     
    نوشته شده توسط the_king در ‏8 می 2016
    SajjadKhati از این پست تشکر کرده است.

به اشتراک بگذارید