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

SajjadKhati

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


کد:
            string[] strArr = new string[] { "salam", "khobi?" };
            Binding bind = new Binding("this.btnDataBindings.Text", strArr, "strArr[0]");

چجوری باید تغییر کنه تا کار کنه؟
دکمه ی this.btnDataBindings قبلا ساخته شده
بعد اینکه وقتی شی Binding ساخته شد ، من هر تغییری در آرایه ام بدم ، اتوماتیک همون لحظه پروپرتی Text در this.btnDataBindings تغییر میکنه؟ (البته گفتم که کد بالا کار نمیکنه)
 

the_king

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


کد:
            string[] strArr = new string[] { "salam", "khobi?" };
            Binding bind = new Binding("this.btnDataBindings.Text", strArr, "strArr[0]");

چجوری باید تغییر کنه تا کار کنه؟
دکمه ی this.btnDataBindings قبلا ساخته شده
بعد اینکه وقتی شی Binding ساخته شد ، من هر تغییری در آرایه ام بدم ، اتوماتیک همون لحظه پروپرتی Text در this.btnDataBindings تغییر میکنه؟ (البته گفتم که کد بالا کار نمیکنه)
خیلی جور ها ممکنه کار کنه، بستگی داره که بخواهید چه کاری انجام بده.
کد:
            var strArr = new BindingList<string>(new List<string> { "salam", "khobi?" });
            btnDataBindings.DataBindings.Add("Text", strArr, null);
            strArr[0] = "Goodbye";
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی جور ها ممکنه کار کنه، بستگی داره که بخواهید چه کاری انجام بده.
کد:
            var strArr = new BindingList<string>(new List<string> { "salam", "khobi?" });
            btnDataBindings.DataBindings.Add("Text", strArr, null);
            strArr[0] = "Goodbye";

سلام
ممنون استاد علی
سئوالات پست های قبلی چی؟
-----------------
کلاس BindingList ، برای دیتابیندینگ ای که خودمون میسازیم ، بکار میره؟ یعنی وقتی بخوایم خودمون پروپرتی DataBindings در کنترلی را مقداردهی کنیم و نخوایم از شی هایی مثل DataSet استفاده کنیم ، در این صورت از کلاس BindingList استفاده میکنیم؟ یعنی در این حالت ، نمیشه خودمون از کلاس Binding که در بالا کدش را گذاشتم ، شی درست کنیم و به پروپرتی ای نسبت بدیم؟

بعد اینکه مقداردهی

کد:
new List<string> { "salam", "khobi?" }
همون مقداردهی به ایندکسر در کلاس List محسوب میشه؟
بعد اینکه چرا کد رو که بصورت زیر تغییر میدم :

کد:
            var strArr = new BindingList<string>(new string[] { "a"});
            btnDataBindings.DataBindings.Add("Text", strArr, null);
            strArr.Add( "Goodbye");
در خط اولش ، چرا اشکالی نمیگیره که شی آرایه مون ، اینترفیس IList<String> را پیاده سازی نکرد؟ نه خودش و نه اجدادش
فقط IList را پیاده سازی کرد
طبعا باید کمپایلر اشکال میگرفت
البته به خط آخر که میرسه ، ارور زمان اجرا میگیره که بازم دلیل اش رو نمیدونم . موقعی که باید خطا بگیره ، نمیگیره و موقعی که نباید بگیره ، میگیره :)
 

the_king

مدیرکل انجمن
ممنون استاد علی
برای ساخت ستاپ در ویژال استودیو 2017 باید چی کار کرد؟
من از اکستنشن زیر استفاده کردم :
Microsoft Visual Studio 2017 Installer Projects - Visual Studio Marketplace
ولی اصلا کارایی لازم و آپشن های مورد نیاز را نداره (تنظیم دات نت فریم ورک ای که باید نصب شه و تنظیم page ها و ... رو نداره) . چی کار باید کرد؟ موقع نصب ویژال استودیو ، باید گزینه ای را برای این منظور تیک زد تا نصب شه؟
Setup هایی که ویژوال استدیو میساخت فقط InstallShield اش خوب بود که اونم دیگه Limited Edition برای 2017 نداره و باید نسخه کاملش رو جداگانه نصب کنید. یه نرم افزار Setup ساز مستقل که با Visual Studio سازگاره نصب کنید، مثل InstallShield و InnoSetup و ...

سئوال بعدی اینکه چرا در کد زیر که اعضای آرایه را در حلقه ی for جداگانه null میکنم ، بعد از GC.Collect ، چیزی از حافظه ی اشغالی ، پاک نمیشه :

کد:
int b = 300000;
            Button[] a = new Button[b];

            for (int i = 0; i < a.Length; i++)
            {
                a[i] = new Button();
            }

            for (int i = 0; i < a.Length; i++)
            {
                a[i] = null;
            }

            a = null;
            GC.Collect();

ولی در کد زیر که در یک حلقه این کار رو انجام میدم ، درست انجام میشه؟ :


کد:
int b = 300000;
            Button[] a = new Button[b];

            for (int i = 0; i < a.Length; i++)
            {
                a[i] = new Button();
                a[i] = null;
            }
         
            a = null;
            GC.Collect();

دلیل اش چیه؟
فرقی نباید میکرد

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

بعد اینکه چرا توی یک کلاس control (کلاسی که از کنترل خاصی ارث بری کرد مثل فرم 1 و ...) ، کلاس دیگه ای مینویسیم ، انگار کلا قاتی میکنه یا حداقل مشکلاتی پیش میاد؟ مثلا اون مشکل نشون ندادن دیزاینر بعد از تغییر دات نت فریم وورک که قبلا گفته بودم ، احتمالا بخاطر همینه که توی اون کلاس فرم ، کلاس های دیگه ای هم تعریف کرده بودم
مربوط به همون مساله است. Designer ئه Visual Studio ئه که برای نمایش فرم یکسری قواعد سفت و سخت داره. وقتی فرم رو از حالت کلی کلاس استاندارد که بهش آشنایی داره خارج می کنید برای جلوگیری از مشکلات پیش بینی نشده ریسک نمی کنه و اصلا قید ویرایش اش با Wizard فرم ها رو میگیره. دلیلش احتمال اجتناب از ناسازگاری با تغییراتیه که خودش موقع قرار دادن کد در فرم بوجود میاره، چون به هر حال اون کلاس ها رو هم شما ویرایش می کنید و هم Designer Visual Studio کد نویسی می کنه.

بعد اینکه راست کلیک در یک دکمه ، چجوری هه؟
من از رویداد MouseClick در یک دکمه استفاده میکنم و از پروپرتی e.Buttons ولی بازم فقط دکمه ی left را میشناسه و دکمه های right یا middle رو که روی کنترل دکمه انجام میدم ، نمیشناسه
نه. MouseClick برای دکمه تعریف اش مشخصه و روال استاندارد Click سیستم عامل رو طی می کنه. هر کلاسی ممکنه یکسری کلید ها و رخداد ها رو مدیریت کنه. همه شون الزاما مدیریت نشده به شما نمیرسه. می توانید یک کلاس مخصوص بسازید که همچین حالتی رو داشته باشه ولی خود Button استاندارد اینطوری نیست. در حالت ساده اش می توانید از MouseUp استفاده کنید که چک کنید کلید Right باشه. اگه برای نمایش منو ازش استفاده می کنید که خود کنترل ها ContextMenuStrip دارند که بخواهید یک منو برای نمایش بهشون معرفی کنید و نیازی به کد نویسی برای نمایش با راست کلیک ندارند.

کلاس BindingList ، برای دیتابیندینگ ای که خودمون میسازیم ، بکار میره؟ یعنی وقتی بخوایم خودمون پروپرتی DataBindings در کنترلی را مقداردهی کنیم و نخوایم از شی هایی مثل DataSet استفاده کنیم ، در این صورت از کلاس BindingList استفاده میکنیم؟ یعنی در این حالت ، نمیشه خودمون از کلاس Binding که در بالا کدش را گذاشتم ، شی درست کنیم و به پروپرتی ای نسبت بدیم؟

اصل مساله اینه که شما وقتی یک مقداری رو عوض می کنید الزاما به این معنی نیست که الان وقتشه که تغییرات دیده بشه، شاید اون لحظه مصلحت ندونید یا تعریف دیگه ای از تغییر داشته باشید و در عین حال عوض شدن یک مقدار به تنهایی رخدادی نداره که خبر دار بشن که باید مقدار جدیدی رو نمایش بدن. این کلاس ها شامل کد نویسی هایی هستند که وقتی مقداری عوض شد اطلاع بده که مقدارم عوض شد و پروپرتی ها هم متدی دارند که بهشون بگین مقدار عوض شده. شما که خودتون کدی ننوشتید که این روال ها طی بشه. برای همین از پیاده سازی های آماده استفاده می کنید. Bind کردنش اساس کارکردش در همین با خبر شدنه، وگرنه خوب مقدار عادی هم میذاشتید نمایش میداد، ایراد در همون با خبر نشدنه. شما اگه بخواهید از Binding که خیلی حالت کلی ای داره استفاده کنید باید برای متد ها و رویداد هاش کد نویسی کنید. دست تون خیلی باز ئه ولی کد نویسی لازم داره.

BindingList لیست هست ولی محتوا نداره، باید بهش لیستی بدهید که روی اون کار کنه. کاربردش برای لیستی ئه که بخواهید بجایی Bind اش کنید. این ساده ترین حالت ئه به این دلیل که کد نویسی اساسی اش از قبل انجام شده. اما اگه بخواهید رفتار مشخصی داشته باشه مجبور نیستید از BindingList استفاده کنید، یک مرحله سفارشی کردن پیاده سازی IBindingList ئه و اساس پایه اون IRaiseItemChangedEvents ئه که وقتی مقدار عوض شد به استفاده کننده خبر بده و در Property ها INotifyPropertyChanged ئه که بفهمه باید مقداری که نمایش میده رو Refresh کنه.

بعد اینکه مقداردهی
کد:
new List<string> { "salam", "khobi?" }
همون مقداردهی به ایندکسر در کلاس List محسوب میشه؟

نگید Indexer چون رفتار Indexer مستقل از محتوای Collectio ئه، Indexer یک پروپرتی ئه، ممکنه محتوای دیگه ای رو نشون بده. محتویات Collection رو مقدار دهی می کنه، هم در List و هم در آرایه و ... کاربرد داره.

بعد اینکه چرا کد رو که بصورت زیر تغییر میدم :
کد:
            var strArr = new BindingList<string>(new string[] { "a"});
            btnDataBindings.DataBindings.Add("Text", strArr, null);
            strArr.Add( "Goodbye");
در خط اولش ، چرا اشکالی نمیگیره که شی آرایه مون ، اینترفیس IList<String> را پیاده سازی نکرد؟ نه خودش و نه اجدادش

چون پیاده سازی کرده. []new string اون <IList <string رو پیاده سازی کرده و پیاده سازی شدنش رو هم نمی بینید. همانطور که پیاده سازی بقیه انواع داده های generic رو نمی بینید. int i = 4 رو می نویسید بدون اینکه از new استفاده کنید یا جایی مشخص بشه که int از کلاس Syste.Int32 استفاده کنه. میتوانید با is بررسی کنید که کامپایلر اشتباه نکرده :
کد:
            var a = new string[] { "a" };
            MessageBox.Show((a is IList<string>).ToString());

البته به خط آخر که میرسه ، ارور زمان اجرا میگیره که بازم دلیل اش رو نمیدونم . موقعی که باید خطا بگیره ، نمیگیره و موقعی که نباید بگیره ، میگیره :)
دلیل خطا اش اینه که شما می خواهید به یک آرایه string عضو اضافه کنید، در حالی که به آرایه نمیشه عضو اضافه کرد و Add روی آرایه که Read Only ئه کار نمی کنه.
یک نگاهی به پیاده سازی <ICollection<T بندازید میبینید که در عین حال که Add داره یک پروپرتی IsReadOnly هم داره. برای همین منظوره. وقتی شما میایید یک آرایه رو به BindingList تحویل می دهید یک لیست خواهد شد که Read Only ئه، همون ذات آرایه رو خواهد داشت.
 

SajjadKhati

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


نه. MouseClick برای دکمه تعریف اش مشخصه و روال استاندارد Click سیستم عامل رو طی می کنه. هر کلاسی ممکنه یکسری کلید ها و رخداد ها رو مدیریت کنه. همه شون الزاما مدیریت نشده به شما نمیرسه. می توانید یک کلاس مخصوص بسازید که همچین حالتی رو داشته باشه ولی خود Button استاندارد اینطوری نیست. در حالت ساده اش می توانید از MouseUp استفاده کنید که چک کنید کلید Right باشه. اگه برای نمایش منو ازش استفاده می کنید که خود کنترل ها ContextMenuStrip دارند که بخواهید یک منو برای نمایش بهشون معرفی کنید و نیازی به کد نویسی برای نمایش با راست کلیک ندارند.

آها پس با رویداد MouseUp میشه کلیک راست را کد نوشت
بابت بقیه ی توضیحات هم خیلی ممنون :rose:
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سئوال دیگه اینکه من از ContextMenu موقع کلیک کردن یک دکمه میخوام استفاده کنم (البته میدونم استاندارد قضیه اینه که از شی ToolStripItem بهتره استفاده کنم) :

کد:
        private void btnContextMenu1_Click(object sender, EventArgs e)
        {
            this.btnCallInto.ContextMenuStrip = new ContextMenuStrip();
            string[] contextText = new string[] { "salam", "Kobi?", "khodahafez" };
            for (int i = 0; i < contextText.Length; i++)
            {
                this.btnCallInto.ContextMenuStrip.Items.Add(contextText[i], null, new EventHandler(this.localContexMenu));
            }
            this.btnCallInto.ContextMenuStrip.Show();

        }

        private void localContexMenu(object sender, EventArgs e)
        {
            MessageBox.Show(sender.ToString());
        }

ولی فقط منو اش به گوشه ی بالا ، سمت چپ مانیتور میچسبه
نمیدونم با کدوم پروپرتی باید جابجاش کنم و به نقطه ای که دلم میخواد ، منتقل کنم؟
حتی با پروپرتی هایی مثل Top و Bound و Parent هم جابجا نمیشه
 

the_king

مدیرکل انجمن
ممنون استاد علی
منظورتون اینه که در کد اول که در حلقه ی جداگانه خونه های آرایه رو null کردم ، خونه های آرایه ی a را دونه دونه null نمیکنه و واسه ی همینه که رم آزاد نمیشه؟
اگه آره ، چرا؟
دلیل شو خوب متوجه نشدم
من از شما یک کارت ویزیت می گیرم، کارت ویزیت رو پاره کنم ساختمون در اون آدرس خراب میشه؟ اون فقط یک آدرس ئه. آدرس حافظه است. a یک متغیر اشاره گر ئه که به یک حافظه اشاره می کنه که محتواش یک آرایه است. شما با new یک شی آرایه ایجاد کردید که آدرس اش رو در a دارید. حالا آدرس رو null می کنید. دیگه به اون شیء آرایه دسترسی ندارید. همین. کاری به خونه های داخل شی و حافظه اش که نداره. چرا ربطش می دید به حافظه شیء؟
احتمالا به دو علت متوجه نمیشید که یا همچنان null کردن خونه رو ربط میدید به حافظه شیء که قبلا در این مورد صحبت کردیم. اشاره گر یک موجودیت ئه و شیء ای که بهش اشاره می کنه یک موجودیت دیگه. و یا به این دلیل که فکر می کنید خیلی کار خوبیه که هر وقت مقدار متغیری عوض شد GC بره بررسی کنه که این متغیر ئه قبلا به که کدوم شیء اشاره می کرد و بعد بره حافظه بگرده ببینه دیگه چه ارجاع هایی به اون شیء مونده و بعد اگه هیچ ارجاعی نمونده بود حافظه اش رو فورا آزاد کنه و تحویل سیستم عامل بده.

سئوال دیگه اینکه من از ContextMenu موقع کلیک کردن یک دکمه میخوام استفاده کنم (البته میدونم استاندارد قضیه اینه که از شی ToolStripItem بهتره استفاده کنم) :

کد:
        private void btnContextMenu1_Click(object sender, EventArgs e)
        {
            this.btnCallInto.ContextMenuStrip = new ContextMenuStrip();
            string[] contextText = new string[] { "salam", "Kobi?", "khodahafez" };
            for (int i = 0; i < contextText.Length; i++)
            {
                this.btnCallInto.ContextMenuStrip.Items.Add(contextText[i], null, new EventHandler(this.localContexMenu));
            }
            this.btnCallInto.ContextMenuStrip.Show();

        }

        private void localContexMenu(object sender, EventArgs e)
        {
            MessageBox.Show(sender.ToString());
        }

ولی فقط منو اش به گوشه ی بالا ، سمت چپ مانیتور میچسبه
نمیدونم با کدوم پروپرتی باید جابجاش کنم و به نقطه ای که دلم میخواد ، منتقل کنم؟
حتی با پروپرتی هایی مثل Top و Bound و Parent هم جابجا نمیشه
اینو همیشه تو برنامه نویسی ویندوز به یاد داشته باشید، دو جور موقعیت برای کنترل ها داریم. یکی مختصات نسبت به Screen و Desktop ئه که 0,0 اش معمولا گوشه مانیتور ئه (بستگی به مکان Taskbar داره) و یکی مختصات نسبت به اون Parent ئه Control ای هست که دارید آدرس دهی اش می کنید و 0,0 اش گوشه کادر Parent ئه. این دو تا مختصات بهم تبدیل پذیر هستند و بعضی متد ها با مختصات اول کار می کنند و بعضی ها دومی. هر جا دیدید موقعیت اشتباهه بدونید تبدیل رو انجام ندادید یا معیار رو Parent اشتباهی فرض کردید. می توانید خودتون با جمع و تفریق مختصات رو تبدیل کنید یا از متد هایی مثل RectangleToClient و RectangleToScreen و PointToClient و PointToScreen استفاده کنید.
کد:
            this.btnCallInto.ContextMenuStrip.Show(btnCallInto.PointToScreen(new Point(0, btnCallInto.Height)));
کد:
            this.btnCallInto.ContextMenuStrip.Show(Cursor.Position);
 

SU-57

Active Member
سلام

1- آقا سجاد شما گفتی که از کلاس Array نمی شه شی ساخت چون abstract است ولی در حد تعربف ارور نمیده (قسمت 15 - 01:44:00 ) (شما پرانتز گذاشتی)

کد:
            Array a = new Array[3];

با این کد کاری می شه کرد؟

2- abstract یعنی "انتزاعی" یا "مجرد" . کلاس انتزاعی چیه و چه فرقی با کلاس غیر انتزاعی داره. اصلا من معنی خود کلاس رو نفهمیدم چه برسه به انتزاعی یا مجرد بودنش. (البته می دونم گفتی در قسمت های بعد توضیح دادی ولی الان یکمی بدونم بد نیست)

3- کد زیر رو در نظر بگیر

کد:
int a = 10;

شما گفتی که a رو یک جعبه در نظر بگیریم و 10 رو ده عدد سیب. و شما گفتی که هر کدوم از اون سیب ها یک شی است اما جعبه شی نیست ولی در دنیای واقعی جعبه هم یک شی است همون طور که یک سیب یک شی است

4- کد زیر:

کد:
            int[] myArray = new int[4] { 1, 2, 3, 4 };

شما گفتی myArray مثلا نیسان و عدد ها شی داخل جعبه هستن

الف) در اینجا جعبه ها چی هستن

ب) هر کدوم از شی ها داخل یک جعبه جداگانه هستن یا هر 4 تاشون داخل یک جعبه هستن
 

SajjadKhati

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

سلام
ممنون استاد علی
میدونم اشاره گر و شی ، دو موجودیت جدا اند
انگار مشکلم واسه اون تیکه از حرف تونه که بولد کردم
مقدار متغییر نه
بلکه مگه مقدار متغییری null بشه ، اشاره گرش رو از دست نمیده و اشاره گرش رو از دست بده ، بعد از فراخونی GC.Collect ، گربگ کالکتور در سریع ترین زمان ممکن (که دست خودش هست) ، حافظه شو آزاد نمیکنه؟
قبلا درباره ی این مورد هم صحبت کرده بودیم و این مورد تصدیق شده بود
اگه باز هم این جمله غلط هه ، پس چرا کد دومی که توی همون حلقه اعضاش null شد ، بعد از فراخونی GC.Collect ، حافظه اش آزاد شد؟

درباره ی جواب اون سئوال هم ممنون . نمیدونستم باید به اورلودهای متد Show اش دقت کنم . فکر میکردم چیزی که دنبالش بودم ، توی پروپرتی باشه
 

the_king

مدیرکل انجمن
سلام
ممنون استاد علی
میدونم اشاره گر و شی ، دو موجودیت جدا اند
انگار مشکلم واسه اون تیکه از حرف تونه که بولد کردم
مقدار متغییر نه
بلکه مگه مقدار متغییری null بشه ، اشاره گرش رو از دست نمیده و اشاره گرش رو از دست بده ، بعد از فراخونی GC.Collect ، گربگ کالکتور در سریع ترین زمان ممکن (که دست خودش هست) ، حافظه شو آزاد نمیکنه؟

سریعترین زمان ممکن رو نمیدونم از کجا آوردید. هر کی بهتون گفته خودش پاسخگو این تاخیر باشه. خودتون میگید حافظه شو آزاد نمی کنه؟ حافظه کدوم شون؟ حافظه a؟ حافظه آرایه؟ حافظه Button ها؟ شما a رو null می کنید، a که حافظه اش فقط یک اشاره گر ئه و دلیلی نداره با null شدن آزاد بشه چون متغیر با null شدن مقدارش آزاد نمیشه، فضای قابل توجهی هم نیست و در ضمن null شدن مقدارش هم فقط یک تغییر مقدار ئه، تا وقتی متغیر a هست اون حافظه اشاره گر هم هست. اون شیء ای هم که a بهش اشاره می کنه یک آرایه از اشاره گر ها است، با اون ابعادی که شما تعیین کردید مثلا در حد دو مگابایت، که وقتی میتونه آزاد بشه که هیچ ارجاعی بهش نمونه. وقتی a رو null می کنید دیگه ارجاعی به آرایه نمی مونه و کاندیدای آزاد شدنه. ولی اینکه یک حافظه آرایه آزاد بشه نه به معنی null شدن خانه های آرایه است، نه ربطی به حافظه Button ها داره و نه باعث بررسی شدن محتویات خانه های اون آرایه میشه. قبلا هم گفتم اینها رو، میخواهید باور کنید یا نکنید. اولا GC وقتش رو برای بررسی حافظه اشیاء بعد از هر تغییر مقدار متغیری نمی کنه، چون سربار اینکار خیلی بیشتر از فایده اش ئه و ثانیا آزاد شدن بلافاصله هر حافظه بلااستفاده ارزشمند نیست و ثالثا آزاد شدن حافظه شیء به معنی الزاما پس دادن حافظه به سیستم عامل نیست.
 

SajjadKhati

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

ممنون استاد علی
هر چند قبلا هم اون تیکه ی بولد را اشاره کردید ولی من باز دقیق متوجه نشدم
پس کلا فرق اون دو کد چیه که به صرف null کردن تمام اشاره گرهای شی button در تمام خونه ای آرایه اونم در یک حلقه ، با فراخونی GC.Collect ، حافظه آزاد میشه ولی در دو حلقه ی مجزا که این کار انجام میشه ، آزاد نمیشه؟! من هنوز به این جوابم نرسیدم
 

SajjadKhati

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

1- آقا سجاد شما گفتی که از کلاس Array نمی شه شی ساخت چون abstract است ولی در حد تعربف ارور نمیده (قسمت 15 - 01:44:00 ) (شما پرانتز گذاشتی)

کد:
            Array a = new Array[3];

با این کد کاری می شه کرد؟

2- abstract یعنی "انتزاعی" یا "مجرد" . کلاس انتزاعی چیه و چه فرقی با کلاس غیر انتزاعی داره. اصلا من معنی خود کلاس رو نفهمیدم چه برسه به انتزاعی یا مجرد بودنش. (البته می دونم گفتی در قسمت های بعد توضیح دادی ولی الان یکمی بدونم بد نیست)

3- کد زیر رو در نظر بگیر

کد:
int a = 10;

شما گفتی که a رو یک جعبه در نظر بگیریم و 10 رو ده عدد سیب. و شما گفتی که هر کدوم از اون سیب ها یک شی است اما جعبه شی نیست ولی در دنیای واقعی جعبه هم یک شی است همون طور که یک سیب یک شی است

4- کد زیر:

کد:
            int[] myArray = new int[4] { 1, 2, 3, 4 };

شما گفتی myArray مثلا نیسان و عدد ها شی داخل جعبه هستن

الف) در اینجا جعبه ها چی هستن

ب) هر کدوم از شی ها داخل یک جعبه جداگانه هستن یا هر 4 تاشون داخل یک جعبه هستن

سلام آقا رامین
1) منظورم از تعریف ، تعریف نوع داده ای به عنوان Array (سمت چپ مساوی) هست
منظورتون از پرانتز ، قسمت سمت راست مساوی ، در کد زیر هست؟ :
کد:
Array c = new Array();
اگه آره ، اینو گذاشتم تا مخاطب ببینه که نمیشه از کلاس abstract شی ساخت و کمپایلر ارور میده
ولی ساختن شی از کلاس یه چیزی هه (مثل کد خط بالا) که با قرار دادن پرانتز انجام میشه ولی ساختن شی از آرایه ، یه چیز دیگه . در کد شماره ی 1 تون که کلوشه گذاشتید ، یعنی نوشتید :
کد:
Array a = new Array[3];
در واقع ، سمت راست مساوی ، شما شی ای از آرایه ساختید (شی ای از آرایه ای از Array) ، نه شی ای از کلاس Array (واسه ی همین کمپایلر در اینجا ارور نمیده)

بله میشه با این کد ، کاری کرد ولی الان بهتون بگم ، احتمالا گیج کننده میشه چون اولِ آرایه ها هستین . شما وقتی مینویسید :
کد:
int[] a = new int[] { 4, 68, 7 };
int[] a = new int[] { 4, 68, 7 };
اعضای داخل کلوشه (اعضای آرایه در اینجا اعداد) را شی هایی (اعداد) میدید که با سمت راست مساوی که قرمز رنگ هه (نه صرفا سمت چپ مساوی) سازگار باشن یعنی تک تک اعضای اون آرایه (مثلا عضو 0 ام اش که عدد 4 هست و ...) ، شی ای از کلاس int ، یا فرزندان int باشن (البته int در اینجا استراکچر هه و فرزند نمیتونه داشته باشه)
حالا وقتی مینویسید :
کد:
Array c = new Array[3];
Array c = new Array[3];
یعنی اولا که تا 3 عضو براش مشخص بشه و دوما اینکه تک تک اعضای این آرایه ، با Array سازگار باشن . یعنی شی ای از کلاس خود Array یا فرزندانش باشن . از خود کلاس Array که بخاطر abstract بودنش نمیشه شی ساخت پس فقط میشه شی ای از فرزندان کلاس Array ساخت . اینم که گفته بودم که همه ی آرایه ها ، فرزندان کلاس Array هستن . پس در کد بالا ، تک تک اعضاش ، بازم باید شی ای از آرایه ها (هر آرایه ای که طرف دلش خواست) بهش بده :
کد:
Array v = new Array[] { new int[2] , new string[4]  };
البته من در کد بالا ، 2 تا شی از آرایه دادم ، بخاطر اینکه در new Array[] دیگه تعداد اعضاش را مشخص نکردم
و از اونجایی هم که هر آرایه ، میتونه عضوی داشته باشه ، پس اعضای داخلی این آرایه (که خودشون آرایه هست) هم میتونن عضو داشته باشن :
کد:
Array v = new Array[] { new int[] { 2, 56}, new string[] { "salam", "khobi?"} };
اما موقع استفاده و فراخونی این آرایه ، تبدیل های مختلفی نیاز داره . این قضیه را در قسمت های بعدی گفتم .
فعلا شاید متوجه نشید و نیازی هم نیست

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

3) در مَثَل که مناقشه نیست :green:
من مثال زدم . بهتر از این ، توی دنیای واقعی ، بلد نبودم مثال پیدا کنم
اگه درست تر اش ررا بخواین ، اصلا اون مقدار 10 در متغییر a ، برابر 10 تا دونه سیب نیست . برابر یک مقدار واحد هه (مثلا یک دونه سیب)

4)
الف) اعضای اون آرایه ها ، همون جعبه میشن مثلا
کد:
myArray[0]

ب) هر کدوم ، داخل یک جعبه ی جداگانه ولی در کنار هم (مثل بارهای جعبه ای که داخل یک نیسون :green: (پیش استاد علی ، آبروی ما را نبر :green:) یا هر وسیله ی باربری دیگه ای ، کنار هم چیده شدن)
مثلا (در کدی که دادین) ، مقدار 1 داخل جعبه ی myArray[0] هست و مقدار 2 داخل جعبه ی myArray[1] هست و ...
 

the_king

مدیرکل انجمن
ممنون استاد علی
هر چند قبلا هم اون تیکه ی بولد را اشاره کردید ولی من باز دقیق متوجه نشدم
پس کلا فرق اون دو کد چیه که به صرف null کردن تمام اشاره گرهای شی button در تمام خونه ای آرایه اونم در یک حلقه ، با فراخونی GC.Collect ، حافظه آزاد میشه ولی در دو حلقه ی مجزا که این کار انجام میشه ، آزاد نمیشه؟! من هنوز به این جوابم نرسیدم
برای چیزی که کنترل اش دست شما نیست که نمی توانید مقایسه انجام بدید. شما در یک شرایط خاص روی سیستم خودتون هر پروسه ای داشته باشید، در یک لحظه یک مقدار حافظه اشغال می کنه، یک لحظه دیگه یک مقدار دیگه. مدام در حال تغییر ئه. سیستم عامل هم هر لحظه اراده کنه می تونه از یک پروسه حافظه بگیره و بده به یک پروسه دیگه. اونوقت میخواهید روی GC که نه از روال کارش اطلاع دارید و نه کنترل موثری رویش دارید و نه میدونید برای چه منظوری حافظه از پروسه گرفته و در چه زمانی آزاد می کنه کد مقایسه کنید؟ شما که نمی دونید GC چه زمانی تصمیم میگیره حافظه button ها رو آزاد کنه. و نمی دونید هم که اون حافظه کی به سیستم عامل بر می گرده. هیچکدوم از اینها به اراده شما نیست. هیچکدوم. مدیریت حافظه برنامه خودتون و مدیریت حافظه سیستم عامل که با شما نیست که بگید من فلان جا کد نوشتم پس باید حافظه بلااستفاده بر گرده به سیستم عامل.
تازه معیار حافظه آزاد شدن تون چیه؟ تحویل حافظه به سیستم عامل ئه؟ گفتم که همچین اتفاقی الزاما نمیافته. شما وقتی یک شیء ای در برنامه تون حافظه اش آزاد میشه، میشه جزو حافظه های اشغال نشده پروسه تون. نه حافظه آزاد سیستم عامل. سیستم عامل چرا باید حافظه ای که قبلا اون Button ها داخلش ذخیره شده رو فوری پس بگیره؟ یعنی اینقدر حافظه سیستم تون کمه که سیستم عامل لنگ اون حافظه است؟ حافظه مدام داره بین پروسه ها دست به دست میشه، GC هم کار خودش رو می کنه. هیچ راهی برای مقایسه اینجور کد ها نیست، چون اصلا دارید برای منظوری مقایسه انجام میدید که کنترلی رویش ندارید. قبلا هم گفتم GC مستقل از پروسه شما است، جزئی از ماشین مجازی NET. ئه. کدی که شما دارید می نویسید که در پروسه GC نیست که هر جا بهش فرمان بدید عمل کنه، ممکنه اون لحظه که درخواست Collect رو میدید GC در حال کاری باشه که هنوز تموم نشده. اگه کسی بهتون گفته شما روی روال GC کنترل دارید که بتوانید باهاش دو تا کد رو مقایسه کنید بهتون اشتباه گفته. بارها گفتم که روال GC تحت کنترل شما نیست و مستقل ئه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی
پس روال گربگ کالکتور رو نمیدونیم
------------
در کد زیر :


کد:
        private void btnDataBindings_Click(object sender, EventArgs e)
        {
            List<string> listStr = new List<string>();
            listStr.Add("salam");
            listStr.Add("khobi?");
         
            BindingList<string> binding = new BindingList<string>(listStr);
            btnDataBindings.DataBindings.Add("Text", binding, "binding[1]");
        }

اگه بخوایم اولین عضو binding[1] ، به پروپرتی وصل بشه (در کد بالا ، مقدار "khobi?") ، باید چی کار کنیم؟
کد بالا بخاطر آرگومان سوم متد btnDataBindings.DataBindings.Add ، ارور میده . null هم که پاس بدیم ، فقط صفر امین عضو رو بیندینگ میکنه

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

سئوال بعدی اینکه من یک چیزی رو خوب متوجه نشدم موقع اضافه کردن فایل dll
اینکه همه ی کدهای دات نت را که میخوایم اضافه کنیم ، اگه کد غیز بصری بود ، درپروژه راست کلیک میکنیم و Add>Reference را میزنیم و اضافه میکنیم ولی اگه اگه بصری بود (فرزندان کلاس کمپوننت یا کنترل بودن) ، در پنجره ی ToolBox ، کلیک راست و Choose Item را میزنیم و از سربرگ Net FrameWork Component. اضافه اش میکنیم؟
اگه این درسته ، پس تفاوت قسمت COM در پنجره ی Add>Reference با تفاوت سربرگ COM Component در پنجره ی Choose Item (در ToolBox) چیه؟
کمپوننت ها هم فقط توسط پنجره ی ToolBox ، کلیک راست و Choose Item را میزنیم و از سربرگ COM Component ، اضاه شون میکنیم دیگه؟ اگه آره ، چرا نمیشه از قسمت COM در پنجره ی Add>Reference ، اضافه شون کرد؟
کلا تفاوت این دو پنجره ، و اینکه چه نوع dll هایی رو از اون پنجره و چه نوع dll هایی رو از این پنجره باید اضافه کنیم؟
ممنون
 

SajjadKhati

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

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

بعد اینکه توی کدی که پست بالا دادم ، من رنگ پشت زمینه را مشخص میکنم :


کد:
            this.btnContextMenu1.ContextMenuStrip.BackColor = Color.FromArgb(35, 35, 35);
            this.btnContextMenu1.ContextMenuStrip.ForeColor = Color.White;

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

SU-57

Active Member
آقا سجاد من می خوام عدد 15 در کد زیر با MessageBox نشون داده بشه ولی ارور میده

کد:
Array a = new int[3] { 5, 10, 15 };

الان Array کلاسه و به نوعی کلاس پدره و int فرزندشه. خوب این فرزند خودش یک کلاسه یا یک شی. و این فرزند رو int باید بدونیم یا int[] (با براکت)

چطوری می تونیم تمام فرزندها و یا نوادگان کلاس Array رو پیدا کنیم.
 
آخرین ویرایش:

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
آقا سجاد من می خوام عدد 15 در کد زیر با MessageBox نشون داده بشه ولی ارور میده

کد:
Array a = new int[3] { 5, 10, 15 };

الان Array کلاسه و به نوعی کلاس پدره و int فرزندشه. خوب این فرزند خودش یک کلاسه یا یک شی. و این فرزند رو int باید بدونیم یا int[] (با براکت)

چطوری می تونیم تمام فرزندها و یا نوادگان کلاس Array رو پیدا کنیم.

سلام
بله نمیشه . چون نوع داده ای ز نوع Array هست که موقع استفاده و فراخونی ، باید اول تبدیل به نوع شی ( int[] ) بشه
int فرزند Array نیست بلکه آرایه ای از int ها ، فرزند Array به حساب میاد (int[]) . کلا همه ی آرایه ها ، فرزندان Array هستن
توی ی شارپ ، همه چیز شی گراست . هر جا هم new مینویسید ، یعنی دارید ی میسازید . new int[] ، شی ای از آرایه ای از int هاست
راحت ترینش اینه که توی سایت msdn ، نام یک کلاس را بنویسید و سرچ کنید (البته بعدش کلمه ی hierarchy را بنویسید ، بهتره) . و در قسمت Inheritance Hierarchy میتونین رابطه ی پدر و فرزند را ببینین (هر کلاسی بالاتر باشه ، پدر اون کلاسِ زیری هست) . در ویژال استودیو هم در پنجره ی object browser (قسمت 38) میتونین ببینین
 

the_king

مدیرکل انجمن
ممنون استاد علی
پس روال گربگ کالکتور رو نمیدونیم
------------
در کد زیر :


کد:
        private void btnDataBindings_Click(object sender, EventArgs e)
        {
            List<string> listStr = new List<string>();
            listStr.Add("salam");
            listStr.Add("khobi?");
        
            BindingList<string> binding = new BindingList<string>(listStr);
            btnDataBindings.DataBindings.Add("Text", binding, "binding[1]");
        }

اگه بخوایم اولین عضو binding[1] ، به پروپرتی وصل بشه (در کد بالا ، مقدار "khobi?") ، باید چی کار کنیم؟
کد بالا بخاطر آرگومان سوم متد btnDataBindings.DataBindings.Add ، ارور میده . null هم که پاس بدیم ، فقط صفر امین عضو رو بیندینگ میکنه

اول برای همین ازتون پرسیدم که ابتدا مشخص کنید که می خواهید چکار کنید، چون مثال تون مناسب Binding و کاربردش نیست. شما چه اندیس 0 و چه 1 و چه هر مورد دیگه ای رو در Text قرار بدید کاری نکردید جز مقدار دهی مستقیم Text. این مثال کاربردی Binding نیست. Binding قراره منبع کاوش در بین یکسری اطلاعات باشه که یکجا موردی انتخاب بشه و کنترل ها اطلاعاتش رو خودکار نشون بدن، اگه قرار باشه خودتون یه مقداری رو اندیسی ببرید بذارید در یک Text که دیگه Binding لازم نداره. باید مثال تون طوری باشه که بشه کاوشی انجام داد، Button.Text فقط نمایش میده، مناسب نتیجه Binding ئه و در کاوش موثر نیست :
کد:
            var strArr = new BindingList<string>(new List<string> { "salam", "khobi?" });
            listBox1.DataSource = new BindingSource(strArr, null);
            button1.DataBindings.Add("Text", listBox1.DataSource, null, true, DataSourceUpdateMode.OnPropertyChanged);

سئوال بعدی اینکه من یک چیزی رو خوب متوجه نشدم موقع اضافه کردن فایل dll
اینکه همه ی کدهای دات نت را که میخوایم اضافه کنیم ، اگه کد غیز بصری بود ، درپروژه راست کلیک میکنیم و Add>Reference را میزنیم و اضافه میکنیم ولی اگه اگه بصری بود (فرزندان کلاس کمپوننت یا کنترل بودن) ، در پنجره ی ToolBox ، کلیک راست و Choose Item را میزنیم و از سربرگ Net FrameWork Component. اضافه اش میکنیم؟

مثال تون کاملا درسته ولی نه به این خاطر که بصری ئه. به این خاطر که میخواهید در Toolbox باشه و از اونجا مورد ها رو بردارید و روی فرم قرار دهید. یعنی اگه نمیخواهید بصورت ویژوال و با Designer ئه Form کار کنید لزومی نداره که در Toolbox قرارشون بدید. فقط در همون References هم باشه برای کد نویسی قابل استفاده است و کفایت می کنه.

اگه این درسته ، پس تفاوت قسمت COM در پنجره ی Add>Reference با تفاوت سربرگ COM Component در پنجره ی Choose Item (در ToolBox) چیه؟
کتابخانه COM یک معماری داره و کتابخانه NET. یک معماری دیگه. همونطور که کتابخانه NET. میتونه فقط کلاس های غیر بصری یا همراه با بصری باشه، COM ها هم می توانند فقط غیر بصری یا همراه با بصری باشند.
طبیعتا برای قرار دادن کمپوننت ای که قراره روی فرم اضافه بشه باید قرارش بدید در Toolbox. چه COM باشه و چه NET. و کمپوننت ای که فقط شامل کلاس های غیر بصری ئه با Add Reference اضافه میشه و چیزی برای قرار دادن در Toolbox نداره. فقط در مورد COM ها اون فایل مبدل AxInterop حتما باید تولید بشه، چون اون COM Wrapper ارتباط بین COM و NET. رو برقرار می کنه.

کمپوننت ها هم فقط توسط پنجره ی ToolBox ، کلیک راست و Choose Item را میزنیم و از سربرگ COM Component ، اضاه شون میکنیم دیگه؟ اگه آره ، چرا نمیشه از قسمت COM در پنجره ی Add>Reference ، اضافه شون کرد؟
نمیشه؟ مشکلی برای اضافه شدنشون نیست. میتوانید هر کتابخانه COM ای رو اونطوری اضافه کنید. اما وقتی اینکارتون مفید ئه که مواردی داشته باشه که بدون حالت بصری قابل استفاده باشه که بخواهید ازشون استفاده کنید. و ثانیا چیزی که پروژه متصل میشه Wrapper ئه، چون بدون Wrapper قابل استفاده نیست. وگرنه مستقیما فایل COM رو که با NET. کار نمی کنه نمیتوانید به پروژه اضافه کنید. شما وقتی موردی رو به Toolbox اضافه کنید و روی فرمی قرار بدید هم بصورت خودکار به References اضافه میشه (Wrapper اش البته). اون Wrapper ئه که به پروژه متصل میشه، نه خود کتابخانه COM. اینو در Properties اون کتابخانه می توانید در مقادیر Name و Path ببینید.
 

the_king

مدیرکل انجمن
بعد اینکه توی ویژال استودیو راهی هست که متوجه بشیم در زمان اجرا چه رویدادهایی در حال اتفاق هست؟
اون پنجره ی Event در زمان اجرا ، فقط اون رویدادهایی که کد دارن رو میگه دوم اجرا شد
ولی من میخوام بدونم حتی رویدادی که کد نداره و اصلا اون رویداد ساخته نشد برای اون کنترل، با این حال اجرا میشه یا نه؟ چون هر کنترل ، خیلی رویداد متنوعی داره (انواع کنترل ها را حساب کنیم ، بالای 200 رویداد اونم بدون تکراری داره حداقل کنترل های ویژال استودیو) که اینکه دونه دونه ی رویدادها را بدونم چه زمانی اجرا میشن ، برای من که مبتدی ام حداقل سخته

درست متوجه کاری که می خواهید بکنید نشدم، اما رویداد چیزی ئه که جایی براش کدی نوشته شده باشه. رویدادی که هیچ جا کدی نداشته مجالی برای رخ دادن نداره و رخ نمیده، چون به اطلاع هیچ متدی نرسیده. اگه هم منظورتون پیغام های ردوبدل شده با پنجره فرم تون باشه متد WndProc رو در فرم تون override کنید.
بعد اینکه توی کدی که پست بالا دادم ، من رنگ پشت زمینه را مشخص میکنم :
کد:
            this.btnContextMenu1.ContextMenuStrip.BackColor = Color.FromArgb(35, 35, 35);
            this.btnContextMenu1.ContextMenuStrip.ForeColor = Color.White;

رنگ ها درست انجام میشن ولی رنگ پشت زمینه ی اون قسمتی که آیکون قرار میگیره ، هنوز به حالت قبلی خودش (سفید) باقی میمونه
رنگ پشت زمینه ی اون قسمتی که آیکون قرار میگیره را میشه تغییر داد؟ اگه آره ، چجوری؟
اون ContextMenuStrip تم داره. همون که با RenderMode میشه از کارش انداخت. RenderMode اش رو به System تغییر بدید دیگه اون رسم رو انجام نمیده :
کد:
btnContextMenu1.ContextMenuStrip.RenderMode = ToolStripRenderMode.System;

به روش دیگه بی سلیقه ترین حالتش این میشه که در رخداد Paint زمینه رو مجددا رنگ کنید :
کد:
            contextMenuStrip1.Paint += ContextMenuStrip1_Paint;

        private void ContextMenuStrip1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.Clear(Color.Yellow);
        }
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی
یعنی binding به درد همون دیتابیس میخوره دیگه
------------
درباره ی تغییر رنگ هم ، به جای متن ، شی ای از ToolStripMenuItem را به ContextMenuStrip اضافه و پشت زمینه ی همین اشیاءهای ToolStripMenuItem را تغییر رنگ دادم
-----------
یک شی notifyIcon1 ساختم و زمانی که ContextMenuStrip اش رو نشون میدم ، کار میکنه ولی نمیدونم کدوم رویداد از این شی هست که فقط وقتی روی منو اش (شی ContextMenuStrip در notifyIcon1) کلیک کنم ، اون رویداد اجرا شه (رویدادهاش رو که تست کردم ، همه شون وقتی که روی شی notifyIcon1 ، چه کلیک راست یا چپ کنم ، اجرا میشن) . من فقط میخوام وقتی روی متن منویی کلیک شد ، اون رویداد اجرا بشه
همچین رویدادی برای این شی هست؟
 

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

بالا