SajjadKhati
کاربر فعال <A href="http://forum.majidonline.com/f
اول مطمئن بشید که کدتون خطای نهفته نداره. در قدم بعدی برای کلاس TransparentControlBitmap تون باید کاری انجام بدید که مثل Font قابل بازتولید باشه.
براتون Font رو مثال زدم، خوب منطقی است که قبل از اینکه ابهام پیش بیاد باید کد Font رو ببینید، FontConverter اش رو ببینید.
باید نیست، اختیاریه. هر دو جا هم می توانید Editor رو مشخص کنید، برای مشخصه و برای کلاس. می توانید هر دو رو انجام بدید یا یکی شون رو. اگر قرار باشه TransparentControlBitmap به اندازه Font در کلاس ها و مشخصه های مختلفی بکار بره بهتره که خود کلاس Editor اش رو مشخص کرده باشه، وگرنه وقتی کارکردش در یکی دو مشخصه بیشتر نباشه فرقی نمی کنه که مشخصه Editor رو تعیین کنه یا کلاس، مثل کلاس شما.
نیازی نیست برای نشون دادن یک مشکل کد کنترل خودتون رو قرار بدید، یک مثال کوچیک و مستقل برای کدی که مشکل ایجاد میکنه بسازید، سریعترین راه برای پیدا کردن دلیل مشکل همینه که کد رو خلوت کنید. مثلا الان اینکه کنترل رسمش Transparent ئه یا دو تا کلاس جانبی داره یا کلاس ها چند تا مشخصه دارند یا رسم اش چطوریه که مهم نیست، شما یک کلاس کنترل ساده بدون مشخصه های اضافی لازم دارید که فقط یک کلاس جانبی داره برای یک مشخصه که داخل اون کلاس هم فقط یک مشخصه Bitmap داره که اونم با Editor تعیین میشه که وقتی تغییر کرد کنترل به ساده ترین شکل ممکن رسم اش تغییری می کنه، همین. مشکلش رو که پیدا کردید و حل شد، تغییرات لازم رو در پروژه اصلی تون می دهید. چیزی که لازمه پیوست کنید همچین پروژه مختصر ئه که ربطی هم به کنترل شما و کارکردش نداره.
چطور چنین چیزی ممکنه، شما داخل DefaultBitmap اون "file address" رو قرار نمیدید، Bitmap هم که مشخصه ای برای مسیر Path نداره که بشه از رویش کد ساخت، تازه اگر داشت هم شما فایل exe پروژه تون که نباید به مسیر "file address" وابسته باشه.
اول یک پروژه مستقل و ساده رو شروع کنید، متد های سازنده پارامتر دار رو اصلا در این پروژه جدید استفاده نکنید، خلاصه ترین حالت ممکن. یک کلاس برای کنترل تون بسازید که یک مشخصه به اسم TransparentControlBitmap داره، بعد کلاس TransparentControlBitmap رو تعریف کنید که متد سازنده اش پارامتر نداره و فقط یک مشخصه DefaultBitmap داره که وقتی تغییر کرد باید در کنترل رسم بشه. بعد یک Editor برایش بسازید. حالا در تمامی روتین های این پروژه که خیلی کوچیک شده با try catch و Breakpoint وضعیت خطا رو بررسی کنید. بعد که مطمئن شدید خطایی نداره، برای TransparentControlBitmap صفت Serializable رو تعریف کنید و اگر دلتون میخواد می توانید ShouldSerializeDefaultBitmap رو هم برای مشخصه DefaultBitmap بنویسید که فقط وقتی true برگردونه که مشخصه مقدار null نداشته باشه.
چون Designer که نمیدونه کدوم لازمه و کدوم لازم نیست. پیشفرض بودن به این معنی نیست که ذخیره اش نکن. پیشفرض به این معنی است که Reset شدنی هست یا نه. اینکه null یا پیشفرض ئه دلیل بر این نیست که نباید ذخیره بشه.
در مورد متد ShouldSerializePropertyName گفتم. برای مشخصه هایی که ShouldSerializePropertyName ندارند فرض بر اینه که همیشه مقدارشون مهم ئه و باید ذخیره بشن.
کلا چند جور انتخاب داریم :
1- کلاسی است که کلا نمیخواهیم Serialize بشه، یعنی نمیخواهیم ذخیره بشه که کدی خاص و صفتی هم لازم نداره. کنترل ها جزو این گروه نیستند، چون با صفت DesignerSerializer براشون Designer ذخیره سازی رو انجام میده.
2- در سایر حالات کلاسی داریم که میخواهیم Serialize بشه ولی با شرایط مختلف، که صفت Serializable رو بهش میدیم. همچین کلاسی بصورت پیشفرض فیلد های داخلش همگی ذخیره میشه ولی برای اینکه روی serialization کنترل داشته باشیم چند انتخاب داریم :
2a- یک انتخاب اینه که بیاییم با ISerializable یک روال اختصاصی serialization بسازیم که در جای دیگری نیازی به تعریف شرایط برای مشخصه ها نباشه. مثل کاری که Font کرده.
2b- یک انتخاب دیگه اینه که بیاییم بگیم فلان فیلد داخلش رو هیچوقت serialize نکن (صفت NonSerialized) که صرفا بقیه رو ذخیره کنه یا با ShouldSerializePropertyName برای ذخیره کردنش اما و اگر بذاریم. اگه تعداد فیلد هایی که ذخیره نمیشن زیاد باشه یا ذخیره کردن مقادیر شرط پیچیده داشته باشه بهتره بجای 2b از روش 2a استفاده کنید که در یک متد یکجا همه تصمیم گیری ها انجام بشه.
هم 2a و هم 2b باید صفت Serializable رو داشته باشن، مگر اینکه مثل کنترل ها serialization جزو خصوصیات به ارث رسیده شون باشه.
خیلی ممنون استاد.
بذارید قبل از اینکه گفته هاتون را بررسی کنم ، این رو مطرح کنم که آیا شیِ بیت مپ ای که توسط آدرس فایل دادم ، آیا درون فایل resource.resx ذخیره میشه؟ اگه نه ، داخل کدوم فایل ذخیره میشه؟
دوما و مهمتر از همه ، چجوری میشه اطلاعاتِ اون فایل را خوند تا متوجه شد ، شیِ بیت مپ ای (توسط آدرس اون فایل png) که بهش دادم ، دقیق برابر با همون فایل png درون اون فایل resource ذخیره شده یا نه؟
----------------------------
پروژه ی مستقل و ساده که میگید ، خوب من کل کلاس TransparentControl (به همراه TransparentControlBitmap و TransparentControlText) را به همراه اعضاشون ، تست کردم . اینها مشکلی ندارن.
میمونه کلاس های مربوط به Editor که اولا بریک پوینت ای نمیشه براشون گذاشت و دوما من کد خاصی را براشون ننوشتم . تا حالا فقط طراحی ظاهرشون را انجام دادم و بعد هم فقط کد دکمه های Browse Image را براشون نوشتم . بخش مهم کد این دکمه هم که همون 2 خط بود که براتون گذاشتم .
الان شما اصرار دارین که اون پروژه ها را اینجا براتون آپلود کنم؟
قبلا هم که شما گفته بودین برای کلاس ام متد سازنده ی بدون پارامتر بسازم تا دیزاینر بتونه باهاش کار کنه و من گفتم این کار را کردم اما نشد . اون موقع هم بخاطر این بود که پروپرتیِ DefaultBitmap را یه شیِ بیت مپ ای که از فایل آدرس دهی اش کرده بودم ، بهش (توی متد سازنده ی پیش فرض) اختصاص دادم و واسه ی همین متد سازنده ی پیش فرض اش قاتی میکرد. اما الان در متد سازنده ی پیش فرض اش ، خودم با گرافیک ، بیت مپ ای را رسم کردم.
و سئوال مهمتر اینه که پروپرتیِ BackgroundImage کنترل ها ، از چه ویژگی یا اتریباتس یا عملیاتی استفاده میکنند که همچین مشکلی را در دیزاینر ندارن؟ چون DefaultBitmap ام معادلِ BackgroundImage در بقیه ی کنترل هاست دیگه.