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

the_king

مدیرکل انجمن
خیلی ممنون استاد .
کد :

کد:
this.SetStyle(ControlStyles.UserPaint, true);

را درمتد سازنده نوشتم . بعد توی OnPaint ، چه base.OnPaint(pevent) را فراخونی کردم یا نه و همچنین در متد OnPaintBackground ، چه base.OnPaintBackground(pevent) را فراخونی کردم یا نه ، رسم اش مثل حالت قبلی بود .
یعنی اگه مثلا در OnPaint ، اون base.OnPaint(pevent) اش را فراخونی میکردم ، خوب علاوه بر شکل قبلی خودش ، شکل هایی که من براش رسم میکردم را رسم میکرد اما وقتی این کد را پاک میکردم ، باز هم این مشکل را داشت که پشت زمینه اش اولا سیاه میشد و دوما با مینیمایز و برگردوندن فرم ، رسم های کنترل های دیگه روی اون فرم انجام میشد .
پس زمینه اش سیاه میشه چون در ابتدای نمایش پنجره ها که زمینه پنجره ها پاک میشه و رسم اولیه انجام میگیره این کنترل اینکار رو نکرده و حافظه اون بخش چیزی جز بایت های صفر نیست که مشکی ئه.
وقتی هم به دلیلی Invalidate صورت گرفته، مثلا سایر پنجره ها در اون ناحیه کنترل رسمی انجام دادن و درخواست رسم مجدد پنجره کنترل داده شده، باز این کنترل کاری نکرده، چیزی رسم نکرده و باقیمانده رسم های قبلی زیرش بجا مونده. منطقی و عادیه.
راستی استاد ، در کنترل های wpf چرا متد OnPaint نداره؟ معادل متد OnPaint در کنترل های wpf ، چیه؟
چون بی معنی ئه، OnPaint میگه که الان و در این نخ داریم ظاهر کنترل رو رسم می کنیم، میخوای در رسم چه کاری انجام بشه.
در WPF یک نخ مستقلی میخواد رسم کنترلی رو انجام بده، بیاد به یک نخ دیگه که درگیر این قضیه نیست اطلاع بده که راستی میدونی دارم با DirectX رسم می کنم؟ به اون نخ چه مربوطه؟ که چیکار کنه؟
اون نخ که دخالتی در روال رندر DirectX نداره.
 

SajjadKhati

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

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

چون بی معنی ئه، OnPaint میگه که الان و در این نخ داریم ظاهر کنترل رو رسم می کنیم، میخوای در رسم چه کاری انجام بشه.
در WPF یک نخ مستقلی میخواد رسم کنترلی رو انجام بده، بیاد به یک نخ دیگه که درگیر این قضیه نیست اطلاع بده که راستی میدونی دارم با DirectX رسم می کنم؟ به اون نخ چه مربوطه؟ که چیکار کنه؟
اون نخ که دخالتی در روال رندر DirectX نداره.

خیلی ممنون
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
استاد ، اگه ناراحت نمیشید ، من هنوز دقیقا متوجه نشدم باید چی کار کنم تا به این هدفم برسم . یعنی زمانی که از کنترل Button یا TextBox (و هر کنترل دیگه ای) ارث بری میکنم ، تمام رسم های پیش فرض ای که برای اون کنترل رسم میشه را نادیده بگیرم و رسم دلخواه خودم را جایگزینش کنم؟
من سردر نمیارم که هدف تون چیه. این هدف یعنی چی؟ شما یک کنترل دارید که یک رسم پیشفرضی داره که میتونه انجام بشه و یا نشه. یا جلوی اون رسم پیشفرض رو میگیرید که رسمش رو انجام نده یا جلوشو نمی گیرید که رسمش رو انجام بده. اما اگر رسمی انجام نده خودتون نمی خواهید حداقل زمینه اش رو با یک رنگ یکدست پر کنید؟ شما هم میخواهید جلوی رسمش رو بگیرید و هم خودتون چیزی داخلش رسم نکنید و هم نمایش مطلوبی داشته باشه؟ چه نمایشی؟ چیزی رسم نکرده اید که نمایش داشته باشه.
 

SajjadKhati

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

آها ممنون استاد .
تازه متوجه شدم . (باید پشت زمینه برای اون ، یه رنگی ست کنم) .
برای Button ، این کار جواب میده ولی برای کنترل های پیچیده تر مثل TextBox ، انگار درست جواب نمیده .

قصدم اینه که در آموزش wpf ، مقایسه ای کنم از تغییر اَشکال کنترل ها در winform و wpf
 

the_king

مدیرکل انجمن
آها ممنون استاد .
تازه متوجه شدم . (باید پشت زمینه برای اون ، یه رنگی ست کنم) .
برای Button ، این کار جواب میده ولی برای کنترل های پیچیده تر مثل TextBox ، انگار درست جواب نمیده .

قصدم اینه که در آموزش wpf ، مقایسه ای کنم از تغییر اَشکال کنترل ها در winform و wpf
بله، در مورد TextBox قبلا صحبت کرده بودیم، TextBox از اون کنترل هایی است که روتین رسم اش کلا توسط خود کلاس پنجره اش و بوسیله سیستم عامل اداره میشه.
نه در NET. و نه در سایر پلتفرم هایی که TextBox استاندارد ویندوز رو بکار می برند، رسم کنترلش اختصاصا توسط سیستم عامل مدیریت شده.
صرفا TextBox های اختصاصی بعضی پلتفرم ها مثل WPF و Flash و ... هستند که چون از کلاس TextBox استاندارد ویندوز استفاده نمی کنند، رسم شون انعطاف پذیر ئه.
حتی اگه NET. میخواست بهتون اجازه تغییر رسم در کنترل TextBox رو بده نمیتونست و امکانات مناسبی نداشت چون خود پنجره TextBox در ویندوز برای اینکار آمادگی نداره، واسط کاربری ویندوز بهش این امکان رو نمیده.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بله، در مورد TextBox قبلا صحبت کرده بودیم، TextBox از اون کنترل هایی است که روتین رسم اش کلا توسط خود کلاس پنجره اش و بوسیله سیستم عامل اداره میشه.
نه در NET. و نه در سایر پلتفرم هایی که TextBox استاندارد ویندوز رو بکار می برند، رسم کنترلش اختصاصا توسط سیستم عامل مدیریت شده.
صرفا TextBox های اختصاصی بعضی پلتفرم ها مثل WPF و Flash و ... هستند که چون از کلاس TextBox استاندارد ویندوز استفاده نمی کنند، رسم شون انعطاف پذیر ئه.
حتی اگه NET. میخواست بهتون اجازه تغییر رسم در کنترل TextBox رو بده نمیتونست و امکانات مناسبی نداشت چون خود پنجره TextBox در ویندوز برای اینکار آمادگی نداره، واسط کاربری ویندوز بهش این امکان رو نمیده.

خیلی ممنون استاد .
خوب این جوری استاد ، کنترل های مهم مثل textbox و combobox رو نمیشه شخصی سازی کرد .
بعد اینکه توی شخصی سازی مخصوصا کنترل های پیشرفته و کنترل های دارای آیتم ، wpf ، خیلی انعطاف بیشتری داره (از انعطاف در رسم پشت زمینه ی آیتم ها گرفته تا انعطاف در رسم فوکوس آیتم ها و انعطاف در رسم بقیه ی موارد) .
اون موقع درباره ی تفاوت رسم و شخصی سازی کنترل ها در wpf و winform صحبت میکردیم .
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
خوب این جوری استاد ، کنترل های مهم مثل textbox و combobox رو نمیشه شخصی سازی کرد .
نظر هر کسی میتونه متفاوت باشه، شما ممکنه بگید نمیشه، کسی دیگری بگه میشه. کلا بستگی به این داره که شخصی سازی مورد نظر چی باشه یا محدودیت ها رو با چه راهکار هایی دور بزنید.

بعد اینکه توی شخصی سازی مخصوصا کنترل های پیشرفته و کنترل های دارای آیتم ، wpf ، خیلی انعطاف بیشتری داره (از انعطاف در رسم پشت زمینه ی آیتم ها گرفته تا انعطاف در رسم فوکوس آیتم ها و انعطاف در رسم بقیه ی موارد)
اون موقع درباره ی تفاوت رسم و شخصی سازی کنترل ها در wpf و winform صحبت میکردیم .
انعطاف پذیری بیشتری نداره، یک کارهایی در WPF انجامش راحت تر ئه و برعکس یک کارهایی انجامش در Windows Forms راحت تر ئه.
از طرف دیگه زبان برنامه نویسی شون یکی ئه، مثلا در ProControls ام صرفا با یک دستور برای داده هام بصورت خودکار جدول در SQL Server میسازه، چه برسه به درج رکورد. این شخصی سازی کنترل ئه که این قابلیت رو بهش داده. اما مزیت و انعطاف پذیری برای Windows Forms ئه؟ نه. اصلا ربطی به این نداشته که Windows Forms بوده. همینکار رو اگه بخواهم در WPF هم انجام بدم کدش مشابه همون میشه، شما شخصی سازی کنترل رو فقط در بزک دوزک ظاهریش می بینید، شخصی سازی کنترل خیلی گسترده از این حرف ها است.
مثلا وقتی کنترل ها با هم هماهنگ باشند، طوری طراحی شون می کنید که مثل نمونه های من وقتی کلید Left فشار داده شد، بتونه بصورت خودکار و هوشمندانه Focus رو به کنترل سمت چپی انتقال بده، بدون اینکه کاربر نیازی به کد نویسی داشته باشه. یا وقتی غیر فعال شدند رنگ شون خاکستری نشه، همون رنگ خودشون کمرنگ بشه.
اینجور موارد اصلا ربطی به این ندارند که WPF ئه یا Windows Forms. لازم نیست که حتما در شخصی سازی شکل چشمکزن TextBox عوض بشه، همینکه کادر دورش و ظاهر Focus گرفتنش تغییر کنه هم خیلی موثر ئه.
این ویدئویی که پیوست کردم ظاهر چند تا کنترل اختصاصی Windows Forms ئه.
 

پیوست ها

  • 2020-08-21_23-22-03.rar
    1.2 مگایابت · بازدیدها: 4

SajjadKhati

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


انعطاف پذیری بیشتری نداره، یک کارهایی در WPF انجامش راحت تر ئه و برعکس یک کارهایی انجامش در Windows Forms راحت تر ئه.
از طرف دیگه زبان برنامه نویسی شون یکی ئه، مثلا در ProControls ام صرفا با یک دستور برای داده هام بصورت خودکار جدول در SQL Server میسازه، چه برسه به درج رکورد. این شخصی سازی کنترل ئه که این قابلیت رو بهش داده. اما مزیت و انعطاف پذیری برای Windows Forms ئه؟ نه. اصلا ربطی به این نداشته که Windows Forms بوده. همینکار رو اگه بخواهم در WPF هم انجام بدم کدش مشابه همون میشه، شما شخصی سازی کنترل رو فقط در بزک دوزک ظاهریش می بینید، شخصی سازی کنترل خیلی گسترده از این حرف ها است.
مثلا وقتی کنترل ها با هم هماهنگ باشند، طوری طراحی شون می کنید که مثل نمونه های من وقتی کلید Left فشار داده شد، بتونه بصورت خودکار و هوشمندانه Focus رو به کنترل سمت چپی انتقال بده، بدون اینکه کاربر نیازی به کد نویسی داشته باشه. یا وقتی غیر فعال شدند رنگ شون خاکستری نشه، همون رنگ خودشون کمرنگ بشه.
اینجور موارد اصلا ربطی به این ندارند که WPF ئه یا Windows Forms. لازم نیست که حتما در شخصی سازی شکل چشمکزن TextBox عوض بشه، همینکه کادر دورش و ظاهر Focus گرفتنش تغییر کنه هم خیلی موثر ئه.
این ویدئویی که پیوست کردم ظاهر چند تا کنترل اختصاصی Windows Forms ئه.

جالب بود استاد کنترل هایی که با winform درست کردید .
استاد ، میتونم درخواست کنم که کد 2 تا از این کنترل ها را به من بدین (مثلا combobox و listbox)؟ البته شما روش زحمت کشیدین و هر جور مایلید که بدین یا نه .
قصدم اینه که در این آموزش (در اون مقایساتی که بین winform و wpf انجام دادم) ، کنترل هایی را در هر دوی wpf و winform ، تغییر شکل بدم و کدها با هم مقایسه شن . یعنی مثلا یه combobox در wpf را تغییر شکل بدم (که کار چندان مشکلی نیست) و همون تغییر شکلِ combobox را در winform پیاده سازی کنم (اما تغییر شکل های کنترل های winform برام سخته مخصوصا اینکه در حد تغییراتی که در کنترل های wpf میدم را بخوام پیاده سازی کنم) .
 

the_king

مدیرکل انجمن
جالب بود استاد کنترل هایی که با winform درست کردید .
استاد ، میتونم درخواست کنم که کد 2 تا از این کنترل ها را به من بدین (مثلا combobox و listbox)؟ البته شما روش زحمت کشیدین و هر جور مایلید که بدین یا نه .
نه. البته تفکیک کردن کنترل هایی با این شرایط کار راحتی نیست، یکی دو کلاس کوچیک نیست، یک کنترل ProComboBox به تنهایی به حدود بیست کلاس وابسته است که بخش عمده اش بین همه کنترل های مجموعه مشترک ئه.
البته شما تمرکز تون روی موردی است که اصلا هدف من نبوده، من برای تغییرات ظاهری کنترل طراحی نکردم، چندان اهمیتی نداشته، در نرم افزار های اداری و سازمانی ازش استفاده می کنم، جاهایی نیست که خیلی به ظاهر اهمیت بدن، کارکرد مهمه. من برای توسعه سریع برنامه وحداقل نیاز به کد نویسی ساختمشون، بیشترین توجه روی راحتی برنامه نویس و ارتباط هماهنگ با پایگاه داده بوده، نه اینکه فلان کنترل گوشه اش گرد بشه یا رنگ چیزی عوض بشه.
قصدم اینه که در این آموزش (در اون مقایساتی که بین winform و wpf انجام دادم) ، کنترل هایی را در هر دوی wpf و winform ، تغییر شکل بدم و کدها با هم مقایسه شن . یعنی مثلا یه combobox در wpf را تغییر شکل بدم (که کار چندان مشکلی نیست) و همون تغییر شکلِ combobox را در winform پیاده سازی کنم (اما تغییر شکل های کنترل های winform برام سخته مخصوصا اینکه در حد تغییراتی که در کنترل های wpf میدم را بخوام پیاده سازی کنم) .
یک نکته رو هم در نظر بگیرید که برنامه نویس باید چه معیار هایی برای انتخاب پلتفرم داشته باشه. شما WPF و Windows Forms رو بر اساس روش هایی که میشناسید مقایسه می کنید تا نتیجه بگیرید که تغییر ظاهر کنترل در ایندو پلتفرم چقدر متفاوت ئه. اما این نتیجه گیری شما چقدر برای برنامه نویسی که میخواد پلتفرم انتخاب کنه اهمیت داره؟ یعنی اگر برنامه نویس بخواد بین پلتفرم x و y انتخابی بکنه، تغییر ظاهر کنترل ملاک چندمش میشه؟
مثلا Adobe Flash یک پلتفرم با سابقه و با انعطاف پذیری بالا در طراحی واسط کاربری است که سالها هم تو بازار یکه تازی کرده، بیشتر از بیست سال سابقه داره، Macromedia و Adobe هم که شرکت های گمنام ای نبودن که البته بعدا Adobe صاحب Macromedia شد. خودتون اجرای انواع نرم افزار ها رو روی سیستم تون دیدید، چند تا نرم افزار بین شون بود که ظاهرشون نشون بده با Adobe Flash طراحی شدن؟
بیشترین استفاده ای که من ازش دیدم در Autorun ها و پکیج های نرم افزاری بوده، نه بیشتر. نرم افزار کوچیک و جمع و جوری که انیمیشن داشتن، ولی اگر ظاهر شون رو نادیده میگرفتید کار خاصی انجام نمیدادن. روی دکمه ای کلیک میشد تا فلان فایل ستاپ رو اجرا کنه. اما انواع بازی های Flash رو دیدم. مورد توجه طراحان سایت و بازی سازان بوده اما برنامه نویسان دسکتاپ خیلی ازش استقبال نکردن. لابد ملاک مورد نظر شما براشون اولویت نداشته.

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

SajjadKhati

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

یک نکته رو هم در نظر بگیرید که برنامه نویس باید چه معیار هایی برای انتخاب پلتفرم داشته باشه. شما WPF و Windows Forms رو بر اساس روش هایی که میشناسید مقایسه می کنید تا نتیجه بگیرید که تغییر ظاهر کنترل در ایندو پلتفرم چقدر متفاوت ئه. اما این نتیجه گیری شما چقدر برای برنامه نویسی که میخواد پلتفرم انتخاب کنه اهمیت داره؟ یعنی اگر برنامه نویس بخواد بین پلتفرم x و y انتخابی بکنه، تغییر ظاهر کنترل ملاک چندمش میشه؟
مثلا Adobe Flash یک پلتفرم با سابقه و با انعطاف پذیری بالا در طراحی واسط کاربری است که سالها هم تو بازار یکه تازی کرده، بیشتر از بیست سال سابقه داره، Macromedia و Adobe هم که شرکت های گمنام ای نبودن که البته بعدا Adobe صاحب Macromedia شد. خودتون اجرای انواع نرم افزار ها رو روی سیستم تون دیدید، چند تا نرم افزار بین شون بود که ظاهرشون نشون بده با Adobe Flash طراحی شدن؟
بیشترین استفاده ای که من ازش دیدم در Autorun ها و پکیج های نرم افزاری بوده، نه بیشتر. نرم افزار کوچیک و جمع و جوری که انیمیشن داشتن، ولی اگر ظاهر شون رو نادیده میگرفتید کار خاصی انجام نمیدادن. روی دکمه ای کلیک میشد تا فلان فایل ستاپ رو اجرا کنه. اما انواع بازی های Flash رو دیدم. مورد توجه طراحان سایت و بازی سازان بوده اما برنامه نویسان دسکتاپ خیلی ازش استقبال نکردن. لابد ملاک مورد نظر شما براشون اولویت نداشته.

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

خیلی ممنون استاد .
استاد ، پس یه لینکی یا سایتی را میشناسید که کدهای تغییر شکل کنترل های winform را بده (2 الی 3 کنترل معروف هم که باشه مثل combobox و listbox و tree ، کافی هه) . جوری که تغییر شکل کنترل ها ، زیبا باشن (مثل همونی که خودتون ساخته بودین) . یا مثلا در حد مثلا این کنترل combobox در wpf و اینها باشه :

کد:
            <!-- SimpleComboBox -->
            <Style x:Key="SimpleComboBox" TargetType="{x:Type ComboBox}">
                <Setter Property="SnapsToDevicePixels" Value="False"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ComboBox}">
                            <Grid>
                                <!--Template="{DynamicResource ComboBoxTextBox}"-->

                                <!--The ToggleButton is databound to the ComboBox itself to toggle IsDropDownOpen-->
                                <ToggleButton Grid.Column="2" Template="{DynamicResource ComboBoxToggleButton}" x:Name="ToggleButton" Focusable="false" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"/>
                                <ContentPresenter HorizontalAlignment="Left" Margin="3,3,23,3" x:Name="ContentSite" VerticalAlignment="Center" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" IsHitTestVisible="False"/>

                                <!--The TextBox must be named PART_EditableTextBox or ComboBox will not recognize it-->
                                <TextBox Visibility="Hidden" HorizontalAlignment="Left" Margin="3,3,23,3" x:Name="PART_EditableTextBox" VerticalAlignment="Center" Focusable="True" Background="Transparent" IsReadOnly="{TemplateBinding IsReadOnly}"/>
                                <!--The Popup shows the list of items in the ComboBox. IsOpen is databound to IsDropDownOpen which is toggled via the ComboBoxToggleButton-->
                                <Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" x:Name="PART_Popup" Focusable="False" AllowsTransparency="True" PopupAnimation="Slide">
                                    <Grid MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True">
                                        <Border x:Name="DropDownBorder" Background="{DynamicResource WindowBackgroundBrush}" BorderBrush="{DynamicResource SolidBorderBrush}" BorderThickness="1"/>
                                        <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True">

                                            <ItemsPresenter />

                                        </ScrollViewer>
                                    </Grid>
                                </Popup>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <!--This forces the DropDown to have a minimum size if it is empty-->
                                <Trigger Property="HasItems" Value="false">
                                    <Setter Property="MinHeight" Value="95" TargetName="DropDownBorder"/>
                                </Trigger>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/>
                                </Trigger>
                                <Trigger Property="IsGrouping" Value="true">
                                    <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                                </Trigger>
                                <Trigger Property="AllowsTransparency" SourceName="PART_Popup" Value="true">
                                    <Setter Property="CornerRadius" Value="4" TargetName="DropDownBorder"/>
                                    <Setter Property="Margin" Value="0,2,0,0" TargetName="DropDownBorder"/>
                                </Trigger>
                                <Trigger Property="IsEditable" Value="true">
                                    <Setter Property="IsTabStop" Value="false"/>
                                    <Setter Property="Visibility" Value="Hidden" TargetName="ContentSite"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

همچین سایت هایی میشناسید ، بگید؟
من جستجو کردم ولی برای winform ، بیشتر سایت ها فقط تغییر شکل کنترل button را گذاشته بودن که بلدم . کنترل های دیگه اش را هم در حد اولیه بلدم اما در حد حرفه ای که خوب و سالم و تمیز دربیاد ، در بازه ی کوتاهی که فقط برای آموزش بخوام ، نه (اون جوری باید حداقل چند روز یا هفته یا شاید هم ماه ، وقت بذارم ببینم میتونم درست کنم یا نه که هدفم چون صرفا نمایش کدها در آموزش هست و نمیخوام در پروژه ام استفاده کنم ، نمیارزه این وقت رو بذارم) .

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

بعد اینکه استاد قبلا در همین تاپیک یه سئوالی درباره ی این پرسیده بودم که وقتی یه آهنگ را پلی میکنیم ، مثل بعضی از پلیرها ، هر از چند گاهی (مثلا هر 100 میلی ثانیه) ، تغییرات صدای اون آهنگ را بصورت نمودار رسم کنه و شما یه پروژه هم بهم دادید ، مطالب اون ، در کدوم صفحه هست؟
من صفحه ی 41 و 42 را دیدم . انگار نصف مباحثی که قبلا در این باره سئوال پرسیدم در اونجاست . اون پروژه ای که دادین ، در اونجا نیست . خیلی از صفحات دیگه را هم دیدم . (از 41 تا 48 و همچنین تک و توک صفحات دیگه و همچنین جستجو هم کردم ولی بقیه ی مطالب اش را پیدا نکردم) .
ممنون استاد .
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
استاد ، پس یه لینکی یا سایتی را میشناسید که کدهای تغییر شکل کنترل های winform را بده (2 الی 3 کنترل معروف هم که باشه مثل combobox و listbox و tree ، کافی هه) . جوری که تغییر شکل کنترل ها ، زیبا باشن (مثل همونی که خودتون ساخته بودین) . یا مثلا در حد مثلا این کنترل combobox در wpf و اینها باشه :

کد:
            <!-- SimpleComboBox -->
            <Style x:Key="SimpleComboBox" TargetType="{x:Type ComboBox}">
                <Setter Property="SnapsToDevicePixels" Value="False"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ComboBox}">
                            <Grid>
                                <!--Template="{DynamicResource ComboBoxTextBox}"-->

                                <!--The ToggleButton is databound to the ComboBox itself to toggle IsDropDownOpen-->
                                <ToggleButton Grid.Column="2" Template="{DynamicResource ComboBoxToggleButton}" x:Name="ToggleButton" Focusable="false" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"/>
                                <ContentPresenter HorizontalAlignment="Left" Margin="3,3,23,3" x:Name="ContentSite" VerticalAlignment="Center" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" IsHitTestVisible="False"/>

                                <!--The TextBox must be named PART_EditableTextBox or ComboBox will not recognize it-->
                                <TextBox Visibility="Hidden" HorizontalAlignment="Left" Margin="3,3,23,3" x:Name="PART_EditableTextBox" VerticalAlignment="Center" Focusable="True" Background="Transparent" IsReadOnly="{TemplateBinding IsReadOnly}"/>
                                <!--The Popup shows the list of items in the ComboBox. IsOpen is databound to IsDropDownOpen which is toggled via the ComboBoxToggleButton-->
                                <Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" x:Name="PART_Popup" Focusable="False" AllowsTransparency="True" PopupAnimation="Slide">
                                    <Grid MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True">
                                        <Border x:Name="DropDownBorder" Background="{DynamicResource WindowBackgroundBrush}" BorderBrush="{DynamicResource SolidBorderBrush}" BorderThickness="1"/>
                                        <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True">

                                            <ItemsPresenter />

                                        </ScrollViewer>
                                    </Grid>
                                </Popup>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <!--This forces the DropDown to have a minimum size if it is empty-->
                                <Trigger Property="HasItems" Value="false">
                                    <Setter Property="MinHeight" Value="95" TargetName="DropDownBorder"/>
                                </Trigger>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/>
                                </Trigger>
                                <Trigger Property="IsGrouping" Value="true">
                                    <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                                </Trigger>
                                <Trigger Property="AllowsTransparency" SourceName="PART_Popup" Value="true">
                                    <Setter Property="CornerRadius" Value="4" TargetName="DropDownBorder"/>
                                    <Setter Property="Margin" Value="0,2,0,0" TargetName="DropDownBorder"/>
                                </Trigger>
                                <Trigger Property="IsEditable" Value="true">
                                    <Setter Property="IsTabStop" Value="false"/>
                                    <Setter Property="Visibility" Value="Hidden" TargetName="ContentSite"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

همچین سایت هایی میشناسید ، بگید؟
مورد خاصی نمیشناسم، مثال در سایت هایی مثل codeproject.com هست.
بعد اینکه استاد قبلا در همین تاپیک یه سئوالی درباره ی این پرسیده بودم که وقتی یه آهنگ را پلی میکنیم ، مثل بعضی از پلیرها ، هر از چند گاهی (مثلا هر 100 میلی ثانیه) ، تغییرات صدای اون آهنگ را بصورت نمودار رسم کنه و شما یه پروژه هم بهم دادید ، مطالب اون ، در کدوم صفحه هست؟
من صفحه ی 41 و 42 را دیدم . انگار نصف مباحثی که قبلا در این باره سئوال پرسیدم در اونجاست . اون پروژه ای که دادین ، در اونجا نیست . خیلی از صفحات دیگه را هم دیدم . (از 41 تا 48 و همچنین تک و توک صفحات دیگه و همچنین جستجو هم کردم ولی بقیه ی مطالب اش را پیدا نکردم) .
ممنون استاد .
دنبال این می گردید؟
ساختار و کار کردن با فایل ها برای برنامه نویسی
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
مورد خاصی نمیشناسم، مثال در سایت هایی مثل codeproject.com هست.

خیلی ممنون استاد .
از لینک زیر ، یه کنترل combobox را پیدا کردم :

How to Create a Custom ComboBox from Scratch

واقعا پیچیده هست (منظورم این نیست که خیلی سخت و نشدنی هست) ولی تغییر دادن ظاهر کنترل (مخصوصا کنترل های پیچیده تر و ترکیبی مثل combobox) در winform ، نسبت به wpf ، بسیار سخت تر و پیچیده تر هست .
نزدیک به 1000 خط کد سی شارپ برای تغییر ظاهر کمبوباکس شد .



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

the_king

مدیرکل انجمن
خیلی ممنون استاد .
از لینک زیر ، یه کنترل combobox را پیدا کردم :

How to Create a Custom ComboBox from Scratch

واقعا پیچیده هست (منظورم این نیست که خیلی سخت و نشدنی هست) ولی تغییر دادن ظاهر کنترل (مخصوصا کنترل های پیچیده تر و ترکیبی مثل combobox) در winform ، نسبت به wpf ، بسیار سخت تر و پیچیده تر هست .
نزدیک به 1000 خط کد سی شارپ برای تغییر ظاهر کمبوباکس شد .
from scratch یعنی صفر تا صد. ویرایش ظاهر کمبوباکس نیست، دست بردن در چیزی نیست، ساختن کامل ظاهر کمبوباکس ئه، از آغاز و بصورت کامل.
البته در اینکه طراحی ویژوال در WPF یا توصیف اجزاء بصری در XAML ساده تر از کد نویسی رسم اون اجزاء در Windows Forms ئه باهاتون موافق هستم.
 

SajjadKhati

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


به نظرتون در نسخه ی 2.0 (با تغییراتی که در زیر گفتن) ، پشتیبانی میکنه؟ :

 

the_king

مدیرکل انجمن
ممنون استاد .
استاد ، قبلا که در پست زیر گفته بودید alphavss 1.4 از اون متد CoInitializeSecurity پشتیبانی نمیکنه :


به نظرتون در نسخه ی 2.0 (با تغییراتی که در زیر گفتن) ، پشتیبانی میکنه؟ :

پشتیبانی نه، استفاده نمی کنه. کاری به COM نداره که CoInitializeSecurity روی اون تاثیری داشته باشه.
موردی در این تغییرات نمی بینم که به اون مساله مربوط باشه.
 

SajjadKhati

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

.

در واقع ، کمپایلر ، چیزی هه که کدهای زبان سی شارپی را که نوشتیم ، به کد زبان میانی (که همون clr هست) ، تبدیل میکنه . نام کمپایلر ای که مایکروسافت برای سی شارپ طراحی کرد و در ویژال استودیو استفاده میشه ، Roslyn هست .

و یه چیز دیگه ای بنام RyuJIT داریم که این ، کدهای زبان میانی (کدهای clr) را به زبان ماشین که همون زبان پردازنده هست ، تبدیل میکنه (که بنابراین فقط در زمان اجرای برنامه ، از این استفاده میشه) . این RyuJIT ، یک کمپایلر هست؟


همچنین اینکه تفاوت نسخه های مختلف دات نت ، در این هستن که مثلا نسخه های این کمپایلر و یا اون RyuJIT ، میتونن به روزتر بشن (انگار مثل نسخه ی .net framework 5 preview 8) و اون clr و gc و اینها هم همچنین که باعث افزایش سرعت برنامه های نوشته شده در سی شارپ میشن .

همچنین کلاس هایی که بیشتر در سطح تعامل با سخت افزار و گرفتن اطلاعات در تعامل با سخت افزار هست (مثل کلاس ها و استراکچرهای مربوط به gc) را اضافه میکنن تا برنامه نویس ، مدیریت بهتری روی برنامه اش از لحاظ سخت افزاری داشته باشه . (مثل استراکچر GCMemoryInfo که اخیرا برای نسخه ی دات نت 5 پرویو 8 اضافه شد) .

منظورم اینه که وقتی نسخه ی دات نتِ جدیدتری میاد ، دیگه خیلی کم پیش میاد کلاس ها و استراکچرهای سطح بالاتر (مثلا کلاس هایی که مربوط به کار با کنترل ها باشه) را اضافه کنن .

درست گفتم؟

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

بعد اینکه شما قبلا گفته بودین که بخاطر کمپایلر هست که سرعت سی شارپ نسبت به C++ Native کمتره (اگه اشتباه نکنم) .
خوب چرا مایکروسافت ، یه همچین کمپایلری که سرعت اجرای کدش در حد C++ Native باشه ، طراحی نمیکنه؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
خیلی ممنون استاد .
استاد ، میگم طبق لینک زیر :

.

در واقع ، کمپایلر ، چیزی هه که کدهای زبان سی شارپی را که نوشتیم ، به کد زبان میانی (که همون clr هست) ، تبدیل میکنه . نام کمپایلر ای که مایکروسافت برای سی شارپ طراحی کرد و در ویژال استودیو استفاده میشه ، Roslyn هست .
قبلا در مورد اینکه Roslyn کامپایلر نیست توضیح داده بودم، چه فایده ای داره پاسخ دادنم وقتی مجددا همون اشتباه رو تکرار می کنید.

و یه چیز دیگه ای بنام RyuJIT داریم که این ، کدهای زبان میانی (کدهای clr) را به زبان ماشین که همون زبان پردازنده هست ، تبدیل میکنه (که بنابراین فقط در زمان اجرای برنامه ، از این استفاده میشه) . این RyuJIT ، یک کمپایلر هست؟
بله.

همچنین اینکه تفاوت نسخه های مختلف دات نت ، در این هستن که مثلا نسخه های این کمپایلر و یا اون RyuJIT ، میتونن به روزتر بشن (انگار مثل نسخه ی .net framework 5 preview 8) و اون clr و gc و اینها هم همچنین که باعث افزایش سرعت برنامه های نوشته شده در سی شارپ میشن .
تفاوت هر نسخه با نسخه قبلی بصورت مستند مشخص میشه، اگر منظورتون تفاوت NET Core. با NET Framework. ئه که دو تا پیاده سازی متفاوت هستند و مستقل هستند.

منظورم اینه که وقتی نسخه ی دات نتِ جدیدتری میاد ، دیگه خیلی کم پیش میاد کلاس ها و استراکچرهای سطح بالاتر (مثلا کلاس هایی که مربوط به کار با کنترل ها باشه) را اضافه کنن .
قابل پیشبینی نیست، تیم طراح بر حسب نیاز ممکنه مواردی رو اضافه کنه.


بعد اینکه شما قبلا گفته بودین که بخاطر کمپایلر هست که سرعت سی شارپ نسبت به C++ Native کمتره (اگه اشتباه نکنم) .
خوب چرا مایکروسافت ، یه همچین کمپایلری که سرعت اجرای کدش در حد C++ Native باشه ، طراحی نمیکنه؟
چون اگه بخواد سرعت اجرا رو در حد خروجی C++ Native افزایش بده باید خیلی از ویژگی های پلتفرم NET. رو فدا کنه. همون اول کار باید ماشین مجازی رو حذف کنه، ویژگی Any CPU رو حذف کنه، سازگاری NET. با نسخه های قبلی رو حذف کنه، کل کتابخانه Framework رو باز نویسی کنه و ...
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
Roslyn کامپایلر نیست، پلتفرمی است برای استفاده از کامپایلر ها که کامپایلر #C رو هم شامل میشه و اینکار رو بصورت سرویس ارائه میکنه. یعنی بجای اینکه مشتری مجبور بشه یک کامپایلر اختصاصی از بنیان بسازه، از API اینجور سرویس ها استفاده میکنه تا فرضا زبان #C رو تحت کنترل روتین های خودش مرحله به مرحله کامپایل کنه. این رو نمیشه با یک کامپایلر متعارفی که همراه Visual Studio می بینید مقایسه کرد.

ممنون استاد :rose:
آها ، یعنی Roslyn ، چیزی شبیه به یک کلاس پایه و پدر و یا شبیه به اینترفیس هاست تا کسانی که میخوان برای سی شارپ کمپایلری بسازن ، از اول ننویسن و از این استفاده کنن؟
پس نام کمپایلر زبان سی شارپ چیه؟ یعنی اون کمپایلری که کد سی شارپ را به کد clr ترجمه میکنه ، چیه؟


نه. CLR کاملا ماهیت نرم افزاری پیاده سازی شده داره. چرا بگیم پیاده سازی نشده؟


نه. CLI استانداردی که برای این منظور به ثبت رسیده، مثلا شما مودم WIFI میسازید تحت استاندارد IEEE ئه 802.11a. اون 802.11a اسم استاندارد ئه، پیاده سازی نیست.

نه. شما دارید مثال داخل زبان می زنید، شبیه همچین چیزهایی نیست. استاندارد فنی ئه، ممکنه چند برگ باشه یا چند جلد کتاب. یه pdf مربوط به یک استاندارد فنی رو بخونید، شباهتی به اینترفیس #C نداره.


نه. مایکروسافت CLR رو طراحی کرد و چند سال بعد بصورت یک استاندارد به نام CLI به ثبت رسید. تکنولوژی های استاندارد شده دیگه هم اول پیاده سازی میشن تا موانع و مشکلات برطرف بشه و بعد که به نتیجه رسید تازه برای استاندارد سازی اش اقدام می کنند. استاندارد میگه اگه بخواهید فلان چیز رو پیاده سازی کنید، مشخصات و ساختار و اجزاء و روالش اینطوریه.

آها ، CLI ، یک استاندارد هست . CLR هم که پیاده سازی شده و زبان میانی .

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

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


من نمیخوام بگم مدیریت کننده حافظه پشته در دست چیز دیگری است، چون پشته اصلا مدیریت نمیخواد که دست چیز خاصی باشه.
حافظه ای مدیریت میخواد که به مقداری در جایی از کد مستقیم و غیر مستقیم دریافت شده و مشخص نیست کجا و با چه شرایطی آزاد میشه، شاید برنامه نویس اصلا همچین کاری رو خودش نکنه، مثل حالتی که در زبان c منجر به Memory Leak میشه. اما در NET. مدیریت حافظه خودکار و GC داره. GC حواسش هست که وقتی دیگه حافظه مورد نظر لازم نیست باید حتما پس داده بشه و آزاد بشه.
برای همین GC روی این حافظه مدیریت شده ای که در کدتون گرفته میشه نظارت میکنه.
پشته رو که با کد #C نمیگیرید که حالا یادتون بمونه یا بره که آزادش کنید و وظیفه مدیریت اش رو به چیزی واگذار میکنید.

یعنی پشته یا stack ، فقط زمانی اختصاص پیدا میکنه که یه نخ ای ایجاد شده باشه و پشته برای هر نخ ، حافظه ی مشخصی داره؟ و به چیز دیگه ای ربط نداره؟
یعنی پشته ، زمانی که یه متدی را فراخونی میکنیم ، ایجاد نمیشه؟
پس چرا زمانی که کد را در ویژال استودیو trace میکنیم ، وقتی متدی را فراخونی میکنیم ، تا وارد متد یا روریدادی میشه ، در پنجره ی Call Stack ، اسم اون متد و رویداد اضافه و با اتمامش ، از اون لیست حذف میشه؟

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

پس واسه ی همین مقدار مشخص داشتن حافظه ی استک هست که وقتی متدهای زیادی را فراخونی کنیم (در حلقه ای که زیاد باشه . نه صرفا اون حلقه بی نهایت باشه) ، باعث ارور stack overflow میشه؟
پس وقتی متد یا رویدادی را فراخونی میکنیم ، باید مقدار جدیدی در حافظه ی استکِ مربوط به نخ خودش ، ثبت کنه . درسته؟
حالا رابطه ای بین حافظه ی استک با تعریف متغییر هست؟


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


قبلا در مورد اینکه Roslyn کامپایلر نیست توضیح داده بودم، چه فایده ای داره پاسخ دادنم وقتی مجددا همون اشتباه رو تکرار می کنید.

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


چون اگه بخواد سرعت اجرا رو در حد خروجی C++ Native افزایش بده باید خیلی از ویژگی های پلتفرم NET. رو فدا کنه. همون اول کار باید ماشین مجازی رو حذف کنه، ویژگی Any CPU رو حذف کنه، سازگاری NET. با نسخه های قبلی رو حذف کنه، کل کتابخانه Framework رو باز نویسی کنه و ...

خیلی ممنون از جواب بقیه ی قسمت ها .
استاد ، پس چرا یه کمپایلر دیگه ای علاوه بر این نمیسازه که با C++ Native ، رقابت کنه؟ یعنی اون قابلیت هایی که گفتین را فدا کنه در عوضش سرعت را مثل ++C ، بهبود ببخشه تا هر کس اگه بخاطر مزایای C++ Native بخواد باهاش کد بنویسه (که مهمترینش ، سرعت اجرای کدش هست) ، به رقیب #C اش در اون صورت فکر کنه .
مثل اینکه C++ Native ، یه کمپایلری داره و مایکروسافت برای C++ CLI ، یک کمپایلر دیگه هم درست کرد که کلا 2 کمپایلر کاملا متفاوتی برای ++C هستند .
 

the_king

مدیرکل انجمن
ممنون استاد :rose:
آها ، یعنی Roslyn ، چیزی شبیه به یک کلاس پایه و پدر و یا شبیه به اینترفیس هاست تا کسانی که میخوان برای سی شارپ کمپایلری بسازن ، از اول ننویسن و از این استفاده کنن؟
چرا هر توضیحی که میدم شبیه یک چیز نامربوط دیگه توصیف می کنید. Roslyn پلتفرم ئه و بصورت سرویس ارائه میشه، شبیه پلتفرم ها و سرویس ها است، شبیه چیز دیگری نیست.
کسانی که میخوان کدی رو کامپایل کنند یا تجزیه و تحلیل کنند یا بهینه کنند و از اینجور موارد ... می توانند از سرویسی که Roslyn ارائه می کنه استفاده کنند.
وگرنه Roslyn نه کیت کامپایلر سازی است و نه سرویس ساختن کامپایلر ئه. سرویسی است برای استفاده از کامپایلر و آنالیز کننده کد و بهینه کننده کد و ...

پس نام کمپایلر زبان سی شارپ چیه؟ یعنی اون کمپایلری که کد سی شارپ را به کد clr ترجمه میکنه ، چیه؟
اسم خاصی نداره، C# Compiler ئه، وقتی Visual Studio 2002 ارائه شد #C این کامپایلر رو داشت. حالا ممکن بود مایکروسافت در شرکت خودش برای پروژه کامپایلر #C اش یک نام خاصی بکار برده باشه که مشخص نیست، کد های داخل سازمانی همیشه بکار می روند.
مایکروسافت هم نخواسته کامپایلرش رو با اسم خاصی معرفی کنه. اسم پروژه Roslyn هم که اولین بار در سال 2010 مطرح شده ربطی به اسم کامپایلر نداره.
اگر بخواهید به کامپایلری که روی سیستم تون نصب شده اشاره کنید Visual Studio C# Compiler ئه و اگر بخواهید به کامپایلر #C سرویس Roslyn اشاره کنید Roslyn C# Compiler ئه، این کامپایلر ها اسم منحصر بفردی ندارند، کامپایلر سی شارپ هستند، همین.


یعنی پشته یا stack ، فقط زمانی اختصاص پیدا میکنه که یه نخ ای ایجاد شده باشه و پشته برای هر نخ ، حافظه ی مشخصی داره؟ و به چیز دیگه ای ربط نداره؟
بله. نمیدونم منظورتون از ربط چیه.


یعنی پشته ، زمانی که یه متدی را فراخونی میکنیم ، ایجاد نمیشه؟
نه، نمیشه. پشته قبل از فراخوانی متد وجود داشته و ایجادش ربطی به فراخوانی متد ها نداره. اصلا اگر پشته از قبل وجود نداشت، نمیتونست متدی رو فراخوانی کنه. اگر پشته از قبل وجود نداشت نه می توانست به متد پارامتر ارسال کنه و نه می دونست بعد از خاتمه اجرای متد باید به کدوم موقعیت از کد برگرده و نه می توانست وضعیت رجیستر های پردازنده رو به حالت قبل از فراخوانی متد برگردونه.

پس چرا زمانی که کد را در ویژال استودیو trace میکنیم ، وقتی متدی را فراخونی میکنیم ، تا وارد متد یا روریدادی میشه ، در پنجره ی Call Stack ، اسم اون متد و رویداد اضافه و با اتمامش ، از اون لیست حذف میشه؟
چون Debugger برای راحتی شما صرفا بخشی از اطلاعات پشته پردازنده رو نشون میده که مربوط به اون بلوک از کد ئه، وگرنه پردازنده که نمیدونه متد چی هست، پردازنده کل کد ها رو یک سری بایت قاطی هم می بینه و کل داده ها رو یکسری بایت قاطی هم و کل پشته رو یکسری بایت قاطی هم.

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

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

پس واسه ی همین مقدار مشخص داشتن حافظه ی استک هست که وقتی متدهای زیادی را فراخونی کنیم (در حلقه ای که زیاد باشه . نه صرفا اون حلقه بی نهایت باشه) ، باعث ارور stack overflow میشه؟
بله. دقیقا همینطور ئه.

پس وقتی متد یا رویدادی را فراخونی میکنیم ، باید مقدار جدیدی در حافظه ی استکِ مربوط به نخ خودش ، ثبت کنه . درسته؟
تعداد مقادیر بستگی به سیستم فراخوانی و کامپایلر داره ولی بله، حداقل یک مقدار رو دارن.

حالا رابطه ای بین حافظه ی استک با تعریف متغییر هست؟
بستگی به پلتفرم و کامپایلر و معماری زبان داره، دارید در مورد مطالبی صحبت می کنید که هیچ ربطی به زبان #C نداره، مباحث طراحی کامپایلر ئه.
اینکه حافظه متغیر در چی باشه و نباشه نه ربطی به برنامه نویس #C داره و نه تاثیری روی روال برنامه اش داره و نه جایی مستند شده که در زبان #C متغیر باید در فلان بخش حافظه باشه. کد #C باید کامپایل بشه و اجرا بشه، به هر طریقی که کامپایل و اجرا بشه، شده. اگر در نسخه بعدی کامپایلر تغییری هم رخ بده، نه اتفاقی برای کد #C می افته و نه نتیجه اجرای کد تغییری می کنه. چه اهمیتی داره که متغیر در پشته پردازنده باشه؟ هر چی هست حافظه RAM و تعداد محدودی رجیستر ها است.

استاد ، پس چرا یه کمپایلر دیگه ای علاوه بر این نمیسازه که با C++ Native ، رقابت کنه؟ یعنی اون قابلیت هایی که گفتین را فدا کنه در عوضش سرعت را مثل ++C ، بهبود ببخشه تا هر کس اگه بخاطر مزایای C++ Native بخواد باهاش کد بنویسه (که مهمترینش ، سرعت اجرای کدش هست) ، به رقیب #C اش در اون صورت فکر کنه .
دیگه #C ای که ماشین مجازی و سیستم مدیریت شده ازش حذف بشه که مزیت خاصی نسبت به ++C نداره. میشه یک زبان سطح میانی که نه بدرد برنامه نویسی سریع می خوره و نه بدرد برنامه نویسی سیستمی.
++C خودش به اندازه کافی کتابخانه و کمپوننت و نمونه کد و آموزش و مستندات و متخصص داره، بجز C زبان سطح پایینی نیست که بخواد باهاش رقابت کنه. برنامه نویسی که به ++C و برنامه نویسی سطح پایین مسلط ئه که دلیلی نداره به #C فکر کنه.
برنامه نویسان #C هم که به محیط ساده و کاربر پسند NET. عادت کرده اند براشون برنامه نویسی در محیط C++ Native بخاطر سطح پایین بودن زبان خیلی سخت میشه.

مثل اینکه C++ Native ، یه کمپایلری داره و مایکروسافت برای C++ CLI ، یک کمپایلر دیگه هم درست کرد که کلا 2 کمپایلر کاملا متفاوتی برای ++C هستند .
بله، C++ CLI با مقداری تغییرات زبان ++C رو به زبان های تحت NET. اضافه کرده و کامپایلر و معماریش کلا با C++ Native تفاوت های اساسی زبان های تحت NET. و Native رو داره. از یکطرف محدودیت های NET. رو داره و از طرف دیگه مزایای زبان های Native رو نداره.
نه به اندازه #C راحت و کاربر پسند ئه و نه به اندازه C++ Native سطح پایین و سریع و انعطاف پذیر ئه و نه کاملا با ++C سازگاری داره، یک شتر گاو پلنگ به تمام معنا.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
پشتیبانی نه، استفاده نمی کنه. کاری به COM نداره که CoInitializeSecurity روی اون تاثیری داشته باشه.
موردی در این تغییرات نمی بینم که به اون مساله مربوط باشه.

خیلی ممنون استاد . :rose:
بجز alphavss ، کتابخونه ی دیگه ای در زمینه ی vss نیست که این محدود را نداشته باشه و تنظیماتی که در برنامه مون انجام میدیم ، روی تنظیمات اون کتابخونه هم تاثیر داشته باشه ؟ (یعنی وقتی در برنامه مون از متد CoInitializeSecurity استفاده میکنیم ، توی اون کتابخونه هم تاثیر داشته باشه) .

این محدودیت alphavss بخاطر اینه که درون کتابخونه اش ، نخ جدیدی (جدای از نخ برنامه مون) ، تعریف میکنه؟

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

درباره ی توضیح مفصل پست قبلی (پست 1579) ، خیلی ممنون . :rose:

مقدار ثابتی نیست، در هدر فایل اجرایی مشخص میشه و البته در زمان اجرا که آدرس پشته قابل تغییر ئه این اندازه هم قابل تغییر ئه. بصورت پیشفرض در حدود یک یا چند مگابایت ئه.

فقط چند سئوال اینکه ، چرا مقدار پشته برای هر نخ ، فرق میکنه؟ یعنی مقدار پشته برای هر نخ ، بر اساس چه معیاری تعیین میشه که برای هر نخ ، میتونه مقدار متفاوتی داشته باشه؟
و این پشته وقتی در هدر فایل اجرایی ساخته بشه ، پس برای نخ های جدیدی که بعدا در رویدادها ایجاد میکنیم ، چی؟



دیگه #C ای که ماشین مجازی و سیستم مدیریت شده ازش حذف بشه که مزیت خاصی نسبت به ++C نداره. میشه یک زبان سطح میانی که نه بدرد برنامه نویسی سریع می خوره و نه بدرد برنامه نویسی سیستمی.

چرا سی شارپ ای که ماشین مجازی و سیستم مدیریت شده ازش حذف بشه ، به درد برنامه نویسی سریع و همچنین سیستمی نمیخوره؟
چون گفته بودید کندی سی شارپ نسبت به سی پلاس پلاس ، بخاطر clr و کمپایلرش هه .
این دو که درست بشن ، طبعا باید سرعتش بیشتر بشه و به درد برنامه های سیستمی هم تا حدود زیادی بخورن دیگه .
این طور نیست؟ اگه نه ، چرا؟

بله، C++ CLI با مقداری تغییرات زبان ++C رو به زبان های تحت NET. اضافه کرده و کامپایلر و معماریش کلا با C++ Native تفاوت های اساسی زبان های تحت NET. و Native رو داره. از یکطرف محدودیت های NET. رو داره و از طرف دیگه مزایای زبان های Native رو نداره.
نه به اندازه #C راحت و کاربر پسند ئه و نه به اندازه C++ Native سطح پایین و سریع و انعطاف پذیر ئه و نه کاملا با ++C سازگاری داره، یک شتر گاو پلنگ به تمام معنا.


بله . اگه مایکروسافت بجای اینکه روی پروژه ی .Net کردن ++C کار میکرد ، حالت برعکسش را انجام میداد ، یعنی روی غیر دات نت و حذف کردن clr در سی شارپ (به منظور سریع تر شدن سی شارپ و اجرای برنامه های سیستمی توسط سی شارپ) کار میکرد ، به نظرم بخش قابل توجهی از کاربران ++C را به خودش جذب میکرد .


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

استاد ، کاربرد کلاس ProfileOptimization ، دقیقا در کجاست؟ :


در توضیحاتش نوشته (ترجمه اش که زیاد وارد نیستم) :

کارایی startup (شروع) ئه دامنه های اپلیکیشن را در اپلیکیشن هایی که به کمپایلر زمان اجرا (jit) نیاز دارن ، با اجرای کمپایل کردنِ پشت زمینه ی متدهایی که شبیه به اجرا شدن هستند ، بر اساس پروفایل هایی که در طول کمپایل های قبلی ایجاد شده ، بهبود میده .

که من دقیقا متوجه نشدم منظورش چیه .
منظورش از startup ، فقط زمان شروع اپلیکیشن هست (مثلا تا رویداد Load ویندوز) یا زمان های دیگه هم هست؟
منظورش از دامنه های اپلیکیشن هم متوجه نشدم چیه؟
منظورش از اپلیکیشن هایی که به کمپایلر زمان اجرا (jit) نیاز دارن را هم متوجه نشدم چیه؟ چون همه ی برنامه های سی شارپ ، کمپایلرِ jit را دارند دیگه . چون همه شون clr دارن .
کلا کاربرد این کلاس دقیقا کجاست؟
ممنون استاد :rose:
 

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

بالا