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

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 در بقیه ی کنترل هاست دیگه.
 

the_king

مدیرکل انجمن
خیلی ممنون استاد.
بذارید قبل از اینکه گفته هاتون را بررسی کنم ، این رو مطرح کنم که آیا شیِ بیت مپ ای که توسط آدرس فایل دادم ، آیا درون فایل resource.resx ذخیره میشه؟ اگه نه ، داخل کدوم فایل ذخیره میشه؟
نه، اون Resources.resx محل ذخیره شدن Resource های عمومی پروژه است، داده هایی که در همه جای پروژه ممکنه ازشون استفاده بشه. شی Bitmap مربوط به فرم Form1 شما در فایل Form1.resx ذخیره میشه که منبع محلی داده های اون فرم ئه. مزیت Form1.resx به اینه که اگر فرمی از یک پروژه به پروژه دیگری کپی بشه، منابع مورد نیاز فرم مثل آیکون ها و تصاویر همراه خودش باشه و نیازی به اضافه کردن منابع عمومی پروژه قبلی به پروژه جدید نباشه.

دوما و مهمتر از همه ، چجوری میشه اطلاعاتِ اون فایل را خوند تا متوجه شد ، شیِ بیت مپ ای (توسط آدرس اون فایل png) که بهش دادم ، دقیق برابر با همون فایل png درون اون فایل resource ذخیره شده یا نه؟
دو کار می توانید بکنید، هم می توانید با کدی شبیه به همون کد اون resources.GetObject در هر جایی بخونیدش و بررسیش کنید که البته اول باید با ComponentResourceManager اون متغیر resources رو ایجاد کنید که نمونه کدش داخل Form1.Designer.cs هست. راه دوم اینه که فایل Form1.resx رو باز کنید، می توانید در همون Solution Explorer رویش دوبار کلیک کنید تا باز بشه و تصویر رو ببینید یا راست کلیک کنید و Open With و XML (Text) Editor رو انتخاب کنید تا کدش رو ببینید که البته شاید چیز خاصی از داده base64 اش سر در نیارید ولی نشون میده که ذخیره شده و مقداری داده باینری داره.

پروژه ی مستقل و ساده که میگید ، خوب من کل کلاس TransparentControl (به همراه TransparentControlBitmap و TransparentControlText) را به همراه اعضاشون ، تست کردم . اینها مشکلی ندارن.
میمونه کلاس های مربوط به Editor که اولا بریک پوینت ای نمیشه براشون گذاشت و دوما من کد خاصی را براشون ننوشتم . تا حالا فقط طراحی ظاهرشون را انجام دادم و بعد هم فقط کد دکمه های Browse Image را براشون نوشتم . بخش مهم کد این دکمه هم که همون 2 خط بود که براتون گذاشتم .
الان شما اصرار دارین که اون پروژه ها را اینجا براتون آپلود کنم؟
نه من نیازی به کد پروژه ندارم، پروژه ای که شرحش رو خودم بگم و بسازید که خودم هم میتونستم دو دقیقه ای بسازم، خودم که میدونم ایرادی در کد ذخیره کردن Bitmap نیست، برای همین میگم همچین پروژه ای رو بسازید تا ببینید ایراد از اون نیست. شما اصرار دارید که کاری که گفتم انجام ندید. کاری که ازتون خواستم نه کار زمانبری است و نه مشکلی ایجاد می کنه.
شما گفتید مشخصه DefaultBitmap عوض میشه ولی ظاهرا ذخیره نمیشه و موقع باز کردن ویژوال استدیو دیگه فراخوانی نمیشه، منم دارم راهنمایی تون می کنم که ببینید در یک پروژه کوچک که ارتباطی با بخش های دیگه پروژه تون نداره مشکلی که مربوط به ذخیره شدن Bitmap در کلاس فلان باشه نیست. همونقدر چیزی که میگم برایم واضحه که بگم اگر بنویسید ;int a = 4 اونوقت a مقدار 4 خواهد داشت. Bitmap رو که شما طراحی نکردید که دنبال مشکلی در بازتولیدش باشیم. Designer هم کارش رو بدون مشکل انجام میده، جایی که ایراد داره بخشی از کد شما است که در پروژه شما است و هنوز تفکیک اش نکردید. قبلا هم گفتم اگر موقع استفاده از Editor تصویرعوض میشه نشون میده که Editor کارش رو درست انجام داده، برای همین به Editor مشکوک نیستم. و کلا برای بررسی ذخیره شدن مشخصه نیازی به Editor نیست، می توانید بجای Editor در یک مشخصه bool دیگه در TransparentControl در get همیشه false برگردونید و در set شرط بذارید که اگر value مقدارش true بود تصویر فلان رو در DefaultBitmap قرار بده ولی مقدار value رو ثبت نکن و بذار مشخصه اش همیشه false بمونه. از این مشخصه فقط برای تغییر تصویر استفاده می کنید، انگار Editor تون بوده. تا وقتی تفاوت بین این پروژه ساده ای که گفتم رو با چیزی که ساختید نبینید متوجه این قضیه نمیشید.

و سئوال مهمتر اینه که پروپرتیِ BackgroundImage کنترل ها ، از چه ویژگی یا اتریباتس یا عملیاتی استفاده میکنند که همچین مشکلی را در دیزاینر ندارن؟ چون DefaultBitmap ام معادلِ BackgroundImage در بقیه ی کنترل هاست دیگه.
با هم قابل مقایسه نیستند. چون شما باید مشخصه های کنترل تون رو با مشخصه های کنترل دیگری مقایسه کنید، نه مشخصه های یک کلاس TransparentControlBitmap که مشخصه کنترل شما است با مشخصه Bitmap.
اون BackgroundImage یک مشخصه است از نوع Bitmap که در کنترل فلان قرار داره. اما DefaultBitmap که مشخصه کنترل شما نیست، DefaultBitmap مشخصه یک کلاس دیگر مستقل از کنترل شما است. اون چیزی که مشخصه کنترل شما است یک TransparentControlBitmap ئه، نه یک Bitmap. شما باید Bitmap رو با TransparentControlBitmap مقایسه کنید. که یکی شون میدونه چطور serialize بشه و یکی شون نمیدونه و serialize شدنی نیست.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
نه، اون Resources.resx محل ذخیره شدن Resource های عمومی پروژه است، داده هایی که در همه جای پروژه ممکنه ازشون استفاده بشه. شی Bitmap مربوط به فرم Form1 شما در فایل Form1.resx ذخیره میشه که منبع محلی داده های اون فرم ئه. مزیت Form1.resx به اینه که اگر فرمی از یک پروژه به پروژه دیگری کپی بشه، منابع مورد نیاز فرم مثل آیکون ها و تصاویر همراه خودش باشه و نیازی به اضافه کردن منابع عمومی پروژه قبلی به پروژه جدید نباشه.


دو کار می توانید بکنید، هم می توانید با کدی شبیه به همون کد اون resources.GetObject در هر جایی بخونیدش و بررسیش کنید که البته اول باید با ComponentResourceManager اون متغیر resources رو ایجاد کنید که نمونه کدش داخل Form1.Designer.cs هست. راه دوم اینه که فایل Form1.resx رو باز کنید، می توانید در همون Solution Explorer رویش دوبار کلیک کنید تا باز بشه و تصویر رو ببینید یا راست کلیک کنید و Open With و XML (Text) Editor رو انتخاب کنید تا کدش رو ببینید که البته شاید چیز خاصی از داده base64 اش سر در نیارید ولی نشون میده که ذخیره شده و مقداری داده باینری داره.


نه من نیازی به کد پروژه ندارم، پروژه ای که شرحش رو خودم بگم و بسازید که خودم هم میتونستم دو دقیقه ای بسازم، خودم که میدونم ایرادی در کد ذخیره کردن Bitmap نیست، برای همین میگم همچین پروژه ای رو بسازید تا ببینید ایراد از اون نیست. شما اصرار دارید که کاری که گفتم انجام ندید. کاری که ازتون خواستم نه کار زمانبری است و نه مشکلی ایجاد می کنه.
شما گفتید مشخصه DefaultBitmap عوض میشه ولی ظاهرا ذخیره نمیشه و موقع باز کردن ویژوال استدیو دیگه فراخوانی نمیشه، منم دارم راهنمایی تون می کنم که ببینید در یک پروژه کوچک که ارتباطی با بخش های دیگه پروژه تون نداره مشکلی که مربوط به ذخیره شدن Bitmap در کلاس فلان باشه نیست. همونقدر چیزی که میگم برایم واضحه که بگم اگر بنویسید ;int a = 4 اونوقت a مقدار 4 خواهد داشت. Bitmap رو که شما طراحی نکردید که دنبال مشکلی در بازتولیدش باشیم. Designer هم کارش رو بدون مشکل انجام میده، جایی که ایراد داره بخشی از کد شما است که در پروژه شما است و هنوز تفکیک اش نکردید. قبلا هم گفتم اگر موقع استفاده از Editor تصویرعوض میشه نشون میده که Editor کارش رو درست انجام داده، برای همین به Editor مشکوک نیستم. و کلا برای بررسی ذخیره شدن مشخصه نیازی به Editor نیست، می توانید بجای Editor در یک مشخصه bool دیگه در TransparentControl در get همیشه false برگردونید و در set شرط بذارید که اگر value مقدارش true بود تصویر فلان رو در DefaultBitmap قرار بده ولی مقدار value رو ثبت نکن و بذار مشخصه اش همیشه false بمونه. از این مشخصه فقط برای تغییر تصویر استفاده می کنید، انگار Editor تون بوده. تا وقتی تفاوت بین این پروژه ساده ای که گفتم رو با چیزی که ساختید نبینید متوجه این قضیه نمیشید.


با هم قابل مقایسه نیستند. چون شما باید مشخصه های کنترل تون رو با مشخصه های کنترل دیگری مقایسه کنید، نه مشخصه های یک کلاس TransparentControlBitmap که مشخصه کنترل شما است با مشخصه Bitmap.
اون BackgroundImage یک مشخصه است از نوع Bitmap که در کنترل فلان قرار داره. اما DefaultBitmap که مشخصه کنترل شما نیست، DefaultBitmap مشخصه یک کلاس دیگر مستقل از کنترل شما است. اون چیزی که مشخصه کنترل شما است یک TransparentControlBitmap ئه، نه یک Bitmap. شما باید Bitmap رو با TransparentControlBitmap مقایسه کنید. که یکی شون میدونه چطور serialize بشه و یکی شون نمیدونه و serialize شدنی نیست.

خیلی ممنون استاد .
خدا خیرتون بده .
دلیل مشکلش را یافتم اما روش حلش رو بلد نیستم . :green:
بخاطر اینه که اصلا بیت مپِ جدیدی که ساختم ، در اون فایل Form1.resx ام ذخیره نمیشه . همون فایل بیت مپ اولیه (که در متد سازنده ی پیش فرض با گرافیک ساختم) و قبلا ذخیره بود ، دیگه با اختصاص شی جدید بیت مپ ، تغییر نمیکنه در این فایل و همون قبلی هه ذخیره هست.
حالا دلیل اینکه چرا در زمان طراحی ، فایل ام تغییر میکنه بخاطر اینه که وقتی پروپرتی DefaultBitmap (یا هر پروپرتی دیگه) (در اینجا ، در کلاس TransparentControlBitmapEditorForm) ، مقدار میگیره ، در قسمت اکسسور set در این پروپرتی گفتم که رسم مجدد انجام بده اما وقتی برنامه را اجرا میکنم ، مشخص هست که بیت مپ اش را از فایل resx میگیره که همون بیت مپ قبلی هست.

الان باید چه کدی بنویسم که در اون فایل ذخیره کنه؟
چرا شی بیت مپ ای را که توسط گرافیک (در متد سازنده ساخته بودم) را ذخیره میتونه کنه اما شی بیت مپ ای را که توسط مسیر فایل png ساختم ، نمیتونه ذخیره کنه؟ هر دو تا که شی بیت مپ هستن . نباید فرقی داشته باشن.
به نظرتون اگه شی بیت مپ ای را که توسط فایل png ساختم را ازش گرافیک بگیرم و دوباره توسط DrawImage درون یک بیت مپِ جدیدِ دیگه رسم کنم و حالا این بیت مپ را به پروپرتی مورد نظر مثل پروپرتی DefaultBitmap اختصاص بدم ، میتونه توی فایل resx ذخیره کنه با این روش؟
فکر کنم بتونه . نه؟

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

بعد اینکه من نمیدونم serialize که میگین یعنی چه .
در این لینک :

C# Serialization & Deserialization with Example

میگه همون ذخیره کردن اطلاعات هست . منظور شما از اختصاص دادن SerializableAttribute به کلاس ، همینه که اون کلاس بتونه ذخیره بشه؟
قشنگ متوجه نشدم.

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

یه درخواست اینکه بی زحمت ، فایل ای که در پست 1312 و پست 1320 (صفحه ی 66) و پست 1285 (صفحه 65) آپلود کردم را حذف میکنید؟
ببخشیدها جسارت میکنم ولی من بهشون دسترسی ندارم که خودم بتونم حذف شون کنم.
 
آخرین ویرایش:

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
الان باید چه کدی بنویسم که در اون فایل ذخیره کنه؟
چرا شی بیت مپ ای را که توسط گرافیک (در متد سازنده ساخته بودم) را ذخیره میتونه کنه اما شی بیت مپ ای را که توسط مسیر فایل png ساختم ، نمیتونه ذخیره کنه؟ هر دو تا که شی بیت مپ هستن . نباید فرقی داشته باشن.
به نظرتون اگه شی بیت مپ ای را که توسط فایل png ساختم را ازش گرافیک بگیرم و دوباره توسط DrawImage درون یک بیت مپِ جدیدِ دیگه رسم کنم و حالا این بیت مپ را به پروپرتی مورد نظر مثل پروپرتی DefaultBitmap اختصاص بدم ، میتونه توی فایل resx ذخیره کنه با این روش؟
فکر کنم بتونه . نه؟

عجیبه .
یه بیت مپ جدید (بدون رسمی در داخلش) دیگه هم که میسازم و ازش گرافیک میگیرم و داخلش اون بیت مپ ای که از فایل گرفتم را ذخیره میکنم و به DefaultBitmap که میدم ، باز هم داخل فایل resx ذخیره نمیکنه و همون بیت مپ پیش فرض (در متد سازنده ی پیش فرض) را که داده بودم ، عوض نمیشه.
پس چرا بیت مپی که در متد سازنده به DefaultBitmap (و بقیه ی پروپرتی ها) داده بودم ، ذخیره میشه؟!!
مشکل از کجاست و چجوری باید رفع کنم و بشه داخل فایل resx ذخیره کرد؟

درباره ی serialize ، مروری بر پست های قبلی تون که کردم ، این بار خیلی بیشتر متوجه شدم.
 

SajjadKhati

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

درباره ی serialize ، مروری بر پست های قبلی تون که کردم ، این بار خیلی بیشتر متوجه شدم.

تا حدودی فهمیدم .
باید از کد زیر برای قرار دادنِ آبجکت مون در فایل Form1.resx استفاده کنم . درسته؟ :

کد:
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(this.CurrentTransparentControl.Parent.GetType());
            resources.ApplyResources();

1) این کد رو در کلاس TransparentControlBitmapEditorForm مینویسم.
2) پارامتری که به متد سازنده ی ComponentResourceManager دادم ، درسته؟ یعنی کنترلِ والدِ کنترلِ TransparentControl را باید بگیرم دیگه چون هر والدی برای خودش یه فایل resx مجزا داره . درسته؟ مثل یوزر کنترل و ... .
3) متد resources.ApplyResources ، دو تا پارامتر میگیره . اولی که نوع object هست که همون شی مورد نظرمون (مثل همین بیت مپ) هست . دومی ، رشته ای تحت عنوان InstanceName.PropertyName هست . PropertyName شو که میدونم . InstanceName شو دقیق نمیدونم چجوری بدست بیارم . میدونم از طریق reflex شاید بشه اما دقیق نمیدونم چجوری.

کلا به نظرتون از این روش برم؟
یا روش دیگه ای؟ اگه روش دیگه ای ، بگین چه روشی رو برم؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
تا حدودی فهمیدم .
باید از کد زیر برای قرار دادنِ آبجکت مون در فایل Form1.resx استفاده کنم . درسته؟ :

کد:
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(this.CurrentTransparentControl.Parent.GetType());
            resources.ApplyResources();

1) این کد رو در کلاس TransparentControlBitmapEditorForm مینویسم.
2) پارامتری که به متد سازنده ی ComponentResourceManager دادم ، درسته؟ یعنی کنترلِ والدِ کنترلِ TransparentControl را باید بگیرم دیگه چون هر والدی برای خودش یه فایل resx مجزا داره . درسته؟ مثل یوزر کنترل و ... .

جواب شماره ی 2 غلط هه . نباید والد را بگیرم . باید به یه طریقی بفهمم که این شی CurrentTransparentControl ، توی کدوم کلاس نوشته شده و Type مربوط به اون کلاس را در متد سازنده ی ComponentResourceManager بذارم.
اما چجوری میتونم بفهمم که این شی CurrentTransparentControl ، درونِ کدوم کلاس نوشته شده؟
 

the_king

مدیرکل انجمن
جواب شماره ی 2 غلط هه . نباید والد را بگیرم . باید به یه طریقی بفهمم که این شی CurrentTransparentControl ، توی کدوم کلاس نوشته شده و Type مربوط به اون کلاس را در متد سازنده ی ComponentResourceManager بذارم.
اما چجوری میتونم بفهمم که این شی CurrentTransparentControl ، درونِ کدوم کلاس نوشته شده؟
چیکار دارید می کنید؟ این کارها رو برای چی دارید انجام میدید؟ کجا همچین چیزی دیدید که کنترل سراغ Resources فرم بره؟ ApplyResources به وظایف کنترل شما ربطی نداره. کاری که گفتم انجام بدید این بود؟
ازتون خواستم چه کاری انجام بدید؟ یک پروژه کوچک قرار بود بسازید که نشون بده ذخیره سازی درست انجام میشه یا نه.
اگر قرار باشه از من بپرسید و جواب بدم ولی اعتنا نکنید و کار دیگه ای انجام بدید برای چی وقت بذارم و جواب بدم؟
من بهتون گفتم برای ذخیره کردن باید با ApplyResources کار کنید؟
این پروژه ای بود که قرار بود بسازید و حاضر نشدید بسازید و خودم ساختم و پیوست اش کردم : TransparentControlTest.zip
اگر ایراد داره و SetBitmap یا Editor درست ذخیره و بازیابی نمیکنه بگید که کدی که نوشتم درست کار نمی کنه.
ولی اگر درست کار کرد دیگه دلیلی نمی بینم که برای جواب دادن به سوالاتی وقت بذارم که به پاسخ ام اهمیتی داده نمیشه.
 

پیوست ها

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
چیکار دارید می کنید؟ این کارها رو برای چی دارید انجام میدید؟ کجا همچین چیزی دیدید که کنترل سراغ Resources فرم بره؟ ApplyResources به وظایف کنترل شما ربطی نداره. کاری که گفتم انجام بدید این بود؟
ازتون خواستم چه کاری انجام بدید؟ یک پروژه کوچک قرار بود بسازید که نشون بده ذخیره سازی درست انجام میشه یا نه.
اگر قرار باشه از من بپرسید و جواب بدم ولی اعتنا نکنید و کار دیگه ای انجام بدید برای چی وقت بذارم و جواب بدم؟
من بهتون گفتم برای ذخیره کردن باید با ApplyResources کار کنید؟
این پروژه ای بود که قرار بود بسازید و حاضر نشدید بسازید و خودم ساختم و پیوست اش کردم : TransparentControlTest.zip
اگر ایراد داره و SetBitmap یا Editor درست ذخیره و بازیابی نمیکنه بگید که کدی که نوشتم درست کار نمی کنه.
ولی اگر درست کار کرد دیگه دلیلی نمی بینم که برای جواب دادن به سوالاتی وقت بذارم که به پاسخ ام اهمیتی داده نمیشه.

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


اما باز سئوال پیش میاد که چرا این جوری هست و چی کار باید کنم تا زمانی که به شیِ جاریِ TransparentControlBitmap ام دست نمیزنم ، و فقط اعضاش را میخوام مقداردهی کنم ، مقدارِ اعضاش (مثل همین DefaultBitmap) ، در فایل resx ثبت بشه؟

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

استاد ، ببینید من اصلا نمیدونستم که باید در هر پروپرتی ای که هستیم ، مقدار جدید بهش بدیم تا ثبت بشه . و اگه بخوایم اعضاش را فقط مقداردهی کنیم ، ثبت نمیشه . بنابراین واسه ی همین میگفتم کدم ایراد نداره و فعلا کاری نکردم جز اینکه ظاهرِ TransparentControlBitmapEditorForm ام را ساختم با اینکه برای دکمه ی Browse اش مقدار دادم که اصلِ کدِ دکمه ی Browse ، همون 2 خط ای بود که براتون گذاشتم.
بنابراین اگه در مقیاس کوچیک هم پیاده سازیش میکردم ، باز هم همین روش را پیاده سازی میکردم که اعضای TransparentControlBitmap را فقط ویرایش کنم . نه اینکه به TransparentControlBitmap اش مقدار جدیدی بدم.
بنابراین باز هم اون پروژه ، سرنوشتِ این پروژه را میداشت و مشکلش را متوجه نمیشدم.
حالا شما ببخشید استاد .
الان راهنمایی میکنین که چی کار باید کنم تا وقتی اعضای TransparentControlBitmap (مثل DefaultBitmap و MouseEnterBitmap و ...) را که مقداردهی میکنم ، ذخیره کنه؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
چیکار دارید می کنید؟ این کارها رو برای چی دارید انجام میدید؟ کجا همچین چیزی دیدید که کنترل سراغ Resources فرم بره؟ ApplyResources به وظایف کنترل شما ربطی نداره. کاری که گفتم انجام بدید این بود؟
ازتون خواستم چه کاری انجام بدید؟ یک پروژه کوچک قرار بود بسازید که نشون بده ذخیره سازی درست انجام میشه یا نه.
اگر قرار باشه از من بپرسید و جواب بدم ولی اعتنا نکنید و کار دیگه ای انجام بدید برای چی وقت بذارم و جواب بدم؟
من بهتون گفتم برای ذخیره کردن باید با ApplyResources کار کنید؟
این پروژه ای بود که قرار بود بسازید و حاضر نشدید بسازید و خودم ساختم و پیوست اش کردم : TransparentControlTest.zip
اگر ایراد داره و SetBitmap یا Editor درست ذخیره و بازیابی نمیکنه بگید که کدی که نوشتم درست کار نمی کنه.
ولی اگر درست کار کرد دیگه دلیلی نمی بینم که برای جواب دادن به سوالاتی وقت بذارم که به پاسخ ام اهمیتی داده نمیشه.

واسه ی این هم نیست. اعضای TransparentControlBitmap (مثل TransparentControlBitmap.ِDefaultBitmap) را که تغییر میدم ، گاها تغییراتش ذخیره میشه و گاها نمیشه.


نمیدونم واسه ی چیه .
روی مغز آدم راه میره این مشکل .
چند ساعت دارم بررسی اش میکنم ، متوجه نشدم واسه چیه.
بریک پوینت هم نمیشه واسش گذاشت.
 

the_king

مدیرکل انجمن
استاد ، ببینید من اصلا نمیدونستم که باید در هر پروپرتی ای که هستیم ، مقدار جدید بهش بدیم تا ثبت بشه . و اگه بخوایم اعضاش را فقط مقداردهی کنیم ، ثبت نمیشه . بنابراین واسه ی همین میگفتم کدم ایراد نداره و فعلا کاری نکردم جز اینکه ظاهرِ TransparentControlBitmapEditorForm ام را ساختم با اینکه برای دکمه ی Browse اش مقدار دادم که اصلِ کدِ دکمه ی Browse ، همون 2 خط ای بود که براتون گذاشتم.
بنابراین اگه در مقیاس کوچیک هم پیاده سازیش میکردم ، باز هم همین روش را پیاده سازی میکردم که اعضای TransparentControlBitmap را فقط ویرایش کنم . نه اینکه به TransparentControlBitmap اش مقدار جدیدی بدم.
بنابراین باز هم اون پروژه ، سرنوشتِ این پروژه را میداشت و مشکلش را متوجه نمیشدم.
حالا شما ببخشید استاد .
الان راهنمایی میکنین که چی کار باید کنم تا وقتی اعضای TransparentControlBitmap (مثل DefaultBitmap و MouseEnterBitmap و ...) را که مقداردهی میکنم ، ذخیره کنه؟
شما اگر مقدار خود مشخصه رو تغییر ندید که Designer متوجه تغییری نمیشه که بخواد ذخیره کنه. Designer که نمیدونه در داخل TransparentControlBitmap تغییری رخ داده.
اون چیزی که شما می خواهید متفاوت از کارکردی که DataGridView.DefaultCellStyle داره نیست، اونم شیء ای داره که از ابتدا هست و Editor اش میخواد مقدارش رو قدری تغییر بده.
در DataGridView برای مشخصه DefaultCellStyle یک Editor داره که مثل Editor شما نیت ساختن شی جدید نداره، ولی با این وجود Editor ای که برای DataGridViewCellStyle طراحی شده یک شی جدید میسازه، شیء قبلی رو تغییر نمیده. با new شی جدیدی میسازه و مقادیر مشخصه هایی که تغییر نکرده اند رو از قبلی کپی می کنه. شما هم در کدتون یک TransparentControlBitmap جدید میسازید، حتی اگر مقادیرش مشابه قبلی باشه.
چیزی در این روال نامناسب نیست که بخواهید بجای ساختن شیء جدید کار دیگری انجام بدید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
شما اگر مقدار خود مشخصه رو تغییر ندید که Designer متوجه تغییری نمیشه که بخواد ذخیره کنه. Designer که نمیدونه در داخل TransparentControlBitmap تغییری رخ داده.
اون چیزی که شما می خواهید متفاوت از کارکردی که DataGridView.DefaultCellStyle داره نیست، اونم شیء ای داره که از ابتدا هست و Editor اش میخواد مقدارش رو قدری تغییر بده.
در DataGridView برای مشخصه DefaultCellStyle یک Editor داره که مثل Editor شما نیت ساختن شی جدید نداره، ولی با این وجود Editor ای که برای DataGridViewCellStyle طراحی شده یک شی جدید میسازه، شیء قبلی رو تغییر نمیده. با new شی جدیدی میسازه و مقادیر مشخصه هایی که تغییر نکرده اند رو از قبلی کپی می کنه. شما هم در کدتون یک TransparentControlBitmap جدید میسازید، حتی اگر مقادیرش مشابه قبلی باشه.
چیزی در این روال نامناسب نیست که بخواهید بجای ساختن شیء جدید کار دیگری انجام بدید.

آها . یعنی به نظرتون شی جدید بسازم؟ و بقیه ی اعضا را کپی کنم؟
خوب زودتر بگین ها . من در صدد تغییر اعضاش بودم نه شی جدید ساختنِ براش.

من آخر متوجه نشدم که حداقل چرا وقتی مثلا DefaultBitmap شو تغییر میدادم ، گاها ذخیره میکرد و گاها نمیکرد.
 

SU-57

Active Member
string یک نوع داده خاص ئه، بصورت کلاس تعریف شده ولی برخلاف سایر کلاس ها که reference type هستند رفتارش شبیه value type ها است. یعنی کلاسش رو طوری کد نویسی کرده اند که شبیه value type ها مقدار بگیره، شبیه value type ها مقایسه کنه و شبیه value type ها مقدارش کپی بشه.
دلیل اینکه بصورت کلاس تعریف شده اینه که ممکنه رشته متنی داخلش خیلی طولانی و حجیم باشه که برای نگهداریش value type ها مناسب نیست. و رفتارش شبیه value type ها است چون اگر غیر از این بود برای کار با رشته ها و مقایسه کردنشون به مشکل برمیخوردیم.
سلام

1- پس اگر به این صورت باشه رشته مورد نظر به parameter1 به صورت رفرنس ارجاع می شه . درسته؟

کد:
private void button1_Click(object sender, EventArgs e)
{
    StringBuilder str1 = new StringBuilder("Sajjad");
    StringBuilder str2 = Method1(str1);
    MessageBox.Show(str2.ToString());
}

StringBuilder Method1(StringBuilder parameter1)
{
    return parameter1;
}

2- اگه مقدار یک کلاس null بشه توسط gc از حافظه پاک می شه البته هر وقت خودش تصمیم بگیره و مثلا نیازی هم بهش نداشته باشه

3- من می خوام موارد ضروری رو فقط یاد بگیرم. مثلا فقط سی شارپ و SQL Server. اگه موردی وجود داره که در کنار این ها ضروریه یاد بگیرم شما بفرمایید مثلا xml هم نیازه یا mvc که البته نمی دونم چی هستن ولی اگه به صورت کلی مسیر اصلی و موارد یادگیری که مهم و ضروری هستن رو برای من مشخص کنید ممنون میشم.

4- یک sql server داریم که داخل خود سی شارپه آیا همین برای برنامه نویسی کافیه یا باید sql server 2019 هم یاد بگیرم و تو پروژه هام از اون استفاده کنم. اگه چنانچه از sql server 2019 استفاده کنم کسی که نرم افزار رو نصب می کنه باید sql server 2019 هم روی سیستمش نصب کنه یا همون .net framework کافیه. SQL Server Management Studio هم هست که باز من نمی دونم چیه. باز تو این قسمت مسیر درست رو اگه برام مشخص کنید ممنوم میشم.
 
آخرین ویرایش:

SajjadKhati

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

من آخر متوجه نشدم که حداقل چرا وقتی مثلا DefaultBitmap شو تغییر میدادم ، گاها ذخیره میکرد و گاها نمیکرد.

استاد نمیدونم مشکل از کجا هه.
باز هم با اونکه شی جدید را برمیگردونم ، همونجوری هه . گاها ذخیره میشه و گاها نمیشه!

در کد زیر هم 3 جا MessageBox گذاشتم تا ببینم کجاها ، کد اجرا میشه . با کمال تعجب ، حتی اون وقت هایی که هر 3 تا MessageBox هم داده میشد ، ولی باز ذخیره نمیشد! :

کد:
        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            // مقدار context.Instance ، همون شیِ جاری ای که پروپرتیِ جاری یعنی پروپرتیِ TransparentControlBitmap درونِ اون کلاس قرار داره ، هست . یعنی همون شی ای از کلاس TransparentControl (که شی TransparentControlBitmap درونِ این کلاس قرار داره).
            TransparentControl currentTranspControl = context.Instance as TransparentControl;
            if (currentTranspControl == null)
                return value;

            // مقدار value ، همون مقدارِ پروپرتیِ جاری ، یعنی مقدار پروپرتیِ TransparentControl.TransparentControlBitmap هست.
            // اگر value مقدار نداشت و نال بود ، سئوال کنه و در صورت پاسخ مثبت ، مقدار پیش فرض بهش بده وگرنه ادامه نده.
            TransparentControlBitmap currentTranspControlBitmap = value as TransparentControlBitmap;
            if (currentTranspControlBitmap == null)
            {
                string messageText = "مقدار این پروپرتی ، در حال حاضر ، خالی (یا همون نال) هست.\nبرای تنظیم و مقدار دادن به اعضایش ، ابتدا باید مقداردهی اولیه شود.\n\nبه این پروپرتی ، مقدار اولیه اختصاص داده شود؟";
                DialogResult buttonPressed = MessageBox.Show(messageText, "Transparent Control", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign);
                if (buttonPressed == DialogResult.Yes)
                    currentTranspControlBitmap = new TransparentControlBitmap();
                else
                    return value;
            }

            // برای نمایش فرم TransparentControlBitmapEditorForm مون ، لازم داریم provider را به نوعِ IWindowsFormsEditorService تبدیل کنیم.
            IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
            if (edSvc != null)
            {
                MessageBox.Show("first");
                // اول شی ای از فرم TransparentControlBitmapEditorForm برای نمایش بسازه و مقدارِ جاریِ پروپرتی TransparentControl.TransparentControlBitmap را برایش در متد سازنده ی این کلاس توسط value ، ارسال کنه و بعد فرم را به نمایش بذاره تا برنامه نویس از صفحه ی فرم برای ویرایش مقادیر ، استفاده کنه.
                TransparentControlBitmapEditorForm transCtrlBtmpEditorForm = new TransparentControlBitmapEditorForm(currentTranspControl, currentTranspControlBitmap);
                MessageBox.Show("second");
                edSvc.ShowDialog(transCtrlBtmpEditorForm);

                // مقدار transCtrlBtmpEditorForm.CurrentTransparentControlBitmap را گرفتیم و currentTranspControlBitmap را بجاش نگرفتیم ، چون وقتی اشاره گرِ transCtrlBtmpEditorForm.CurrentTransparentControlBitmap اگه تغییر کرد (مثلا اگه برنامه نویس ، با زدن دکمه ی Set Null ) مقدارش را نال کرد ، اون وقت فقط اشاره گرِ transCtrlBtmpEditorForm.CurrentTransparentControlBitmap تغییر میکنه و ما از این طریق ، همون مقدار و اشاره گر را بدست بیاریم اما در این صورت ، اشاره گرِ currentTranspControlBitmap ، تغییر نمیکنه. مگر اینکه اگه بصورت ref براش ارسال میکردیم.
                TransparentControlBitmap returnedTransCtrlBmp = transCtrlBtmpEditorForm.CurrentTransparentControlBitmap;
                MessageBox.Show(returnedTransCtrlBmp.ToString());
                if (returnedTransCtrlBmp != null)
                {
                    // باید برای هر پروپرتی ای که Editor ساختیم ، موقع برگردوندن در همین متد EditValue ، باید شیِ جدیدی از اون پروپرتی را برگردونیم تا دیزاینرِ ویژال استودیو بتونه مقادیرش را ذخیره کنه . نه اینکه فقط اعضایش مثل همین DefaultBitmap و ... را ویرایش کنیم و شی TransparentControlBitmap قبلی را برگردونیم وگرنه دیزاینرِ ویژال استودیو نمیتونه مقادیرش را ذخیره کنه . اگه شی قبلی را برگردونیم
                    TransparentControlBitmap newTransCtrlBitmap = new TransparentControlBitmap { Bounds = returnedTransCtrlBmp.Bounds, GraphicInterpolationMode = returnedTransCtrlBmp.GraphicInterpolationMode, DefaultBitmap = returnedTransCtrlBmp.DefaultBitmap, MouseEnterBitmap = returnedTransCtrlBmp.MouseEnterBitmap, MouseDownBitmap = returnedTransCtrlBmp.MouseDownBitmap, ControlDisabledBitmap = returnedTransCtrlBmp.ControlDisabledBitmap, Tag = returnedTransCtrlBmp.Tag};
                }
                else
                    return null;
            }

            return value;
        }

من که دیگه نمیدونم چی کار باید کرد.
اون اجرای کد در مقیاس کوچیک هم که میگین ، خوب باید به یه جای کد ، حداقل مشکوک بود و فرضیه ی تقریبی از احتمال مشکل داشتن یک قسمت از کد را داد تا در مقیاس کوچیک پیاده سازیش کرد دیگه. درسته؟
من هر چی فکر میکنم که کجای کدم احتمال مشکل میتونه داشته باشه (مثلا MessageBox هایی که میذارم) ، حتی ذره ای نمیدونم مشکل از کدوم قسمت از کدم میتونه باشه .
تا جایی هم که تست کردم ، مشکل از کلاس TransparentControl و کلاس های مربوطه اش (مثل TransparentControlBitmap و TransparentControlText) فکر نکنم باشه . احتمالا اگه مشکلی باشه ، شاید از کلاس های Editor باشه . ولی توی کلاس Editor (کلاس TransparentControlBitmapEditorForm) ،کدی ننوشتم . فقط ظاهرش رو ساختم و همون دو خط دکمه ی Browse Image اش رو کد نوشتم . کلا این کلاس کدش اینه که در زیر فایلش را براتون آپلود میکنم.
 

پیوست ها

  • Editor.rar
    9.7 کیلوبایت · بازدیدها: 2

the_king

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

من آخر متوجه نشدم که حداقل چرا وقتی مثلا DefaultBitmap شو تغییر میدادم ، گاها ذخیره میکرد و گاها نمیکرد.
اون DefaultBitmap ملاک تغییر مشخصه TransparentControlBitmap نیست، وقتی ذخیره سازی انجام شده که مقدار TransparentControlBitmap یا بین null و غیر null تغییر کرده یا از یک شیء به شیء دیگری تغییر کرده. گاها هایی که میگید در یکی از این شرایط ها است.

استاد نمیدونم مشکل از کجا هه.
باز هم با اونکه شی جدید را برمیگردونم ، همونجوری هه . گاها ذخیره میشه و گاها نمیشه!

در کد زیر هم 3 جا MessageBox گذاشتم تا ببینم کجاها ، کد اجرا میشه . با کمال تعجب ، حتی اون وقت هایی که هر 3 تا MessageBox هم داده میشد ، ولی باز ذخیره نمیشد! :
استفاده از var رو که گفتم و گوش نکردید ولی عادت کنید MessageBox رو برای پیدا کردن محل خطاها بکار نبرید. Breakpoint بذارید، حتی اگر دیدید جایی Breakpoint گذاشتنی نیست، یک سطر اضافی مثل ;int a = 123 اضافه کنید و رویش Breakpoint بذارید. با Breakpoint می توانید مقدار همه اشیاء و متغیر ها رو در اون وضعیت ببیینید، بدون اینکه مثل MessageBox تداخلی در ترتیب اجرای رخداد ها ایجاد بشه و نتایج متفاوت بگیرید. MessageBox اصلا مناسب اینکاری که میکنید نیست.

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

the_king

مدیرکل انجمن
کد:
        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            // مقدار context.Instance ، همون شیِ جاری ای که پروپرتیِ جاری یعنی پروپرتیِ TransparentControlBitmap درونِ اون کلاس قرار داره ، هست . یعنی همون شی ای از کلاس TransparentControl (که شی TransparentControlBitmap درونِ این کلاس قرار داره).
            TransparentControl currentTranspControl = context.Instance as TransparentControl;
            if (currentTranspControl == null)
                return value;

            // مقدار value ، همون مقدارِ پروپرتیِ جاری ، یعنی مقدار پروپرتیِ TransparentControl.TransparentControlBitmap هست.
            // اگر value مقدار نداشت و نال بود ، سئوال کنه و در صورت پاسخ مثبت ، مقدار پیش فرض بهش بده وگرنه ادامه نده.
            TransparentControlBitmap currentTranspControlBitmap = value as TransparentControlBitmap;
            if (currentTranspControlBitmap == null)
            {
                string messageText = "مقدار این پروپرتی ، در حال حاضر ، خالی (یا همون نال) هست.\nبرای تنظیم و مقدار دادن به اعضایش ، ابتدا باید مقداردهی اولیه شود.\n\nبه این پروپرتی ، مقدار اولیه اختصاص داده شود؟";
                DialogResult buttonPressed = MessageBox.Show(messageText, "Transparent Control", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign);
                if (buttonPressed == DialogResult.Yes)
                    currentTranspControlBitmap = new TransparentControlBitmap();
                else
                    return value;
            }

            // برای نمایش فرم TransparentControlBitmapEditorForm مون ، لازم داریم provider را به نوعِ IWindowsFormsEditorService تبدیل کنیم.
            IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
            if (edSvc != null)
            {
                MessageBox.Show("first");
                // اول شی ای از فرم TransparentControlBitmapEditorForm برای نمایش بسازه و مقدارِ جاریِ پروپرتی TransparentControl.TransparentControlBitmap را برایش در متد سازنده ی این کلاس توسط value ، ارسال کنه و بعد فرم را به نمایش بذاره تا برنامه نویس از صفحه ی فرم برای ویرایش مقادیر ، استفاده کنه.
                TransparentControlBitmapEditorForm transCtrlBtmpEditorForm = new TransparentControlBitmapEditorForm(currentTranspControl, currentTranspControlBitmap);
                MessageBox.Show("second");
                edSvc.ShowDialog(transCtrlBtmpEditorForm);

                // مقدار transCtrlBtmpEditorForm.CurrentTransparentControlBitmap را گرفتیم و currentTranspControlBitmap را بجاش نگرفتیم ، چون وقتی اشاره گرِ transCtrlBtmpEditorForm.CurrentTransparentControlBitmap اگه تغییر کرد (مثلا اگه برنامه نویس ، با زدن دکمه ی Set Null ) مقدارش را نال کرد ، اون وقت فقط اشاره گرِ transCtrlBtmpEditorForm.CurrentTransparentControlBitmap تغییر میکنه و ما از این طریق ، همون مقدار و اشاره گر را بدست بیاریم اما در این صورت ، اشاره گرِ currentTranspControlBitmap ، تغییر نمیکنه. مگر اینکه اگه بصورت ref براش ارسال میکردیم.
                TransparentControlBitmap returnedTransCtrlBmp = transCtrlBtmpEditorForm.CurrentTransparentControlBitmap;
                MessageBox.Show(returnedTransCtrlBmp.ToString());
                if (returnedTransCtrlBmp != null)
                {
                    // باید برای هر پروپرتی ای که Editor ساختیم ، موقع برگردوندن در همین متد EditValue ، باید شیِ جدیدی از اون پروپرتی را برگردونیم تا دیزاینرِ ویژال استودیو بتونه مقادیرش را ذخیره کنه . نه اینکه فقط اعضایش مثل همین DefaultBitmap و ... را ویرایش کنیم و شی TransparentControlBitmap قبلی را برگردونیم وگرنه دیزاینرِ ویژال استودیو نمیتونه مقادیرش را ذخیره کنه . اگه شی قبلی را برگردونیم
                    TransparentControlBitmap newTransCtrlBitmap = new TransparentControlBitmap { Bounds = returnedTransCtrlBmp.Bounds, GraphicInterpolationMode = returnedTransCtrlBmp.GraphicInterpolationMode, DefaultBitmap = returnedTransCtrlBmp.DefaultBitmap, MouseEnterBitmap = returnedTransCtrlBmp.MouseEnterBitmap, MouseDownBitmap = returnedTransCtrlBmp.MouseDownBitmap, ControlDisabledBitmap = returnedTransCtrlBmp.ControlDisabledBitmap, Tag = returnedTransCtrlBmp.Tag};
                }
                else
                    return null;
            }

            return value;
        }
به کدی که در EditValue نوشتید نگاه کنید، شما قرار بوده مقداری که تو مشخصه ثبت میشه رو return کنید، درسته؟ ببینید چی return می کنید. شما return هاتون یا null ئه یا value. پس کی مقدار شیء های جدیدی که در متغیر میسازید رو درون value قرار دادید؟ هیچوقت. شما در newTransCtrlBitmap شیء رو ساختید، قبول، بعد چیکار کردید با متغیرش؟ استفاده ای ازش نکردید، return اش نکردید.
 

the_king

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

1- پس اگر به این صورت باشه رشته مورد نظر به parameter1 به صورت رفرنس ارجاع می شه . درسته؟

کد:
private void button1_Click(object sender, EventArgs e)
{
    StringBuilder str1 = new StringBuilder("Sajjad");
    StringBuilder str2 = Method1(str1);
    MessageBox.Show(str2.ToString());
}

StringBuilder Method1(StringBuilder parameter1)
{
    return parameter1;
}
درسته. بجای StringBuilder می توانید از ref string هم استفاده کنید، هم در تعریف پارامتر parameter1 و هم موقع ارسال str1 به Method1 کلمه کلیدی ref رو اضافه می کنیم :
کد:
        string Method1(ref string parameter1)
        {
            parameter1 = "Ali";
            return parameter1;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string str1 = "Reza";
            string str2 = Method1(ref str1);
            MessageBox.Show(str1);
        }
ما مقدار parameter1 رو تغییر دادیم، ولی مقدار str1 هم از "Reza" به "Ali" تغییر کرد، چون شیء اش بصورت ارجاع به Method1 رسال شده بود و parameter1 ارجاعی به string ای بود که str1 داشت.

در حالی که اگه ref رو بکار نبریم و از string به تنهایی استفاده کنیم، مقدار str1 در parameter1 کپی میشه و تغییر دادن parameter1 تاثیری روی str1 نداره :
کد:
        string Method1(string parameter1)
        {
            parameter1 = "Ali";
            return parameter1;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string str1 = "Reza";
            string str2 = Method1(str1);
            MessageBox.Show(str1);
        }

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

3- من می خوام موارد ضروری رو فقط یاد بگیرم. مثلا فقط سی شارپ و SQL Server. اگه موردی وجود داره که در کنار این ها ضروریه یاد بگیرم شما بفرمایید مثلا xml هم نیازه یا mvc که البته نمی دونم چی هستن ولی اگه به صورت کلی مسیر اصلی و موارد یادگیری که مهم و ضروری هستن رو برای من مشخص کنید ممنون میشم.
هر چیزی که به تدریج لازمتون شد یاد بگیرید، لزومی نداره که قبل از اینکه کاری در موردشون انجام بدید یادشون بگیرید.
فرضا زمانی که خواستید برای وب سایت برنامه نویسی کنید، HTML و SQL Server و ASP.NET و ... معمولا لازمتون میشه که هر وقت دیدید بهش احتیاج پیدا کردید یاد میگیرید.
XML یک قالب کلی ئه، خودش چیز خاصی برای یاد گرفتن نداره. اما زبان ها و ساختار های زیادی هستند که با قالب XML طراحی شدن. مثلا اگه کد های HTML رو دیده باشید، XML براتون آشنا است، HTML بر اساس XML ئه، فایل های ویژوال استدیو بر اساس XML ئه، فایل های Microsoft Office که البته zip شده هستند محتوای داخلشون xml ئه، تنظیمات خیلی برنامه ها که در فایل ذخیره میشه همینطور و ...
برای برنامه نویس بیشتر اوقات لازم میشه که یاد بگیره چطور در NET. فایل XML رو بخونه، تفسیر کنه، ویرایش کنه و ایجاد کنه، یادگیری اینکار ها بیشتر اهمیت داره تا اینکه خودش بتونه فایل متنی دستی xml رو ویرایش کنه.
اونقدر چیزها برای یادگرفتن هست که همیشه وقت کم میارید، لذا برای یادگرفتن چیزی که هنوز لازمتون نشده عجله نکنید.

4- یک sql server داریم که داخل خود سی شارپه آیا همین برای برنامه نویسی کافیه یا باید sql server 2019 هم یاد بگیرم و تو پروژه هام از اون استفاده کنم. اگه چنانچه از sql server 2019 استفاده کنم کسی که نرم افزار رو نصب می کنه باید sql server 2019 هم روی سیستمش نصب کنه یا همون .net framework کافیه. SQL Server Management Studio هم هست که باز من نمی دونم چیه. باز تو این قسمت مسیر درست رو اگه برام مشخص کنید ممنوم میشم.
خود SQL Server همیشه یک نرم افزار مجزا است، مستقل از ویژوال استدیو، و چه همراه Visual Studio نصب بشه و چه جدا نصب بشه به هر حال جزئی از برنامه شما نیست.
برنامه نمیتونه بدون نصب شدن SQL Server Express یا SQL Server پایگاه داده رو باز کنه، پس فقط نصب بودن NET Framework. کافی نیست.
SQL Server Express هم با SQL Server حجم و امکاناتشون خیلی فرق داره، Express خیلی سبکتر ئه و برای نرم افزار های بزرگ تحت سرور که خیلی کاربر دارند نیست.
ولی تفاوت شون در نرم افزار های سازمانی و تحت سرور معلوم میشه، وگرنه هر دو برای برنامه های عادی و سبک قابل استفاده هستند، یعنی کاربرتون میتونه هر کدوم رو که خواست برای پایگاه داده برنامه شما استفاده کنه.

اون چیزی که بخشی از NET. ئه، فقط رابط بین برنامه شما و SQL Server ئه، همون چیزهایی که در System.Data و زیر مجموعه هاش هست که نصب شدن هم نمیخواد و همیشه برنامه تون میتونه ازش استفاده کنه.
برنامه SQL Server نسخه های مختلفی داره، هر کدوم هم که روی سیستم نصب شدنی باشه (چون همه ویندوز ها همه نسخه های SQL Server رو پشتیبانی نمی کنند) برای دسترسی به پایگاه داده کفایت می کنه.
اما یک مساله مهمی هست، وقتی یک SQL Server نسخه فلان پایگاه داده ای رو باز کرد، نسخه پایگاه داده هر چقدر هم که قدیمی باشه، ارتقاء پیدا می کنه به نسخه اون SQL Server که بازش کرده و دیگه SQL Server های قدیمی تر نمیتوانند اون فایل پایگاه داده رو باز کنند. برای همین هر چقدر نسخه SQL Server ای که استفاده می کنید بالاتر باشه، برای کاربر انتخاب SQL Server رو محدودتر کردید چون مجبوره همون SQL Server شما یا جدیدترش رو نصب کنه.
نرم افزار SQL Server Management Studio برای مدیریت پایگاه داده و سرور اونه. میشه داخلش پایگاه داده ساخت، ویرایش کرد، به سرور اضافه کرد، حذف کرد، برای سرور کاربر و رمز عبور تعریف کرد و ...
وجودش برای برنامه ضروری نیست، سرور بدون SQL Server Management Studio کار می کنه، اما برای شرکت و اداراتی که شبکه و سرور دارند SQL Server Management Studio نصب میشه و لازمه.
اگر برنامه تون رو خوب طراحی کرده باشید کاربر برنامه تون نیازی به SQL Server Management Studio نداره، ولی خودتون برای تغییر تنظیمات سرور یا امتحان کردن برنامه تون احتمالا بهش نیاز پیدا می کنید.

مهمترین قابلیت برای برنامه هایی که از SQL Server استفاده می کنند اینه که کاربر بتونه راحت و کامل تنظیمات سرور رو تغییر بده و رفع اشکال کنه. اینها رو برنامه نویسی متوجه میشه که خودش به SQL Server وارد باشه.
هیچ چیزی در ارتباط با SQL Server رو قطعی و ثابت فرض نکنید. روی هر سیستمی ممکنه شرایط نصب SQL Server و تنظیماتش فرق کنه. SQL Server هم نصب کردنش و هم رفع خطاهاش خیلی پیچیدگی ها میتونه داشته باشه. مثلا بعضی برنامه که بد طراحی شدن از کاربر میخوان که رمز کاربر sa رو بذاره فلان، یا اسم سرور رو فلان نام مشخص بذارن. اینا چیزی نیست که هر کاربری بتونه انجام بده یا اصلا تمایلی به انجامشون داشته باشه. یا بعضی برنامه ها اگه سرور خطا بده فقط پیام میدهند "خطای عدم ارتباط با پایگاه داده" و هیچ جزئیاتی در مورد خطا که خود NET. اعلام می کنه به کاربر ارائه نمی کنند. یا خود برنامه، پایگاه داده اش رو خودکار به سرور اضافه نمی کنه و کاربر رو وادار میکنن یک دوره آموزشی SQL Server رو طی کنه تا ببینه چطور باید دستی پایگاه داده رو attach کنه. یا Setup برنامه رو بد طراحی می کنند که اگر بخواهید از نو نصبش کنید یا ارتقاء اش بدید یا میزنه پایگاه داده قبلی رو با همه اطلاعات داخلش بازنویسی میکنه که داده ها میپره یا کاربر رو وادار می کنند اول دستی پایگاه داده موجود رو detach کنند و جابجا کنند به یک فولدر دیگه تا بعد از نصب مجددا برگردونند.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
من که نمیدونستم شما میخواهید در Editor یک مشخصه مقدار اون مشخصه رو تغییر ندید وگرنه حتما میگفتم.
اون DefaultBitmap ملاک تغییر مشخصه TransparentControlBitmap نیست، وقتی ذخیره سازی انجام شده که مقدار TransparentControlBitmap یا بین null و غیر null تغییر کرده یا از یک شیء به شیء دیگری تغییر کرده. گاها هایی که میگید در یکی از این شرایط ها است.

خیلی ممنون استاد.
منم نمیدونستم ها .
یعنی شاید در ناخودآگاهم میدونستم ولی بصورت رسمی نمیدونستم . :green:


استفاده از var رو که گفتم و گوش نکردید ولی عادت کنید MessageBox رو برای پیدا کردن محل خطاها بکار نبرید. Breakpoint بذارید، حتی اگر دیدید جایی Breakpoint گذاشتنی نیست، یک سطر اضافی مثل ;int a = 123 اضافه کنید و رویش Breakpoint بذارید. با Breakpoint می توانید مقدار همه اشیاء و متغیر ها رو در اون وضعیت ببیینید، بدون اینکه مثل MessageBox تداخلی در ترتیب اجرای رخداد ها ایجاد بشه و نتایج متفاوت بگیرید. MessageBox اصلا مناسب اینکاری که میکنید نیست.

var که من باهاش عادت ندارم . :green: نوع داده ای شو مشخص کنم ، راحت ترم . کلا شبیه دیزاینر ویژال استودیو کد مینویسم . this رو مشخص میکنم و ... . همه چیز باید شفاف باشه ، آدم متوجه ی کدنویسی بشه. :green:
MessageBox را من توی کدهای Editor گذاشتم . توی Editor من که نمیتونم بریک پوینت بذارم . بریک پوینت بذارم هم ، اصلا اونجا متوقف نمیشه . چه همون int a = 0; بذارم و روش بریک پوینت بذارم یا نذارم. شما توی ادیتور بریک پوینت بذارید ، متوجه ی منظورم میشید.

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

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


به کدی که در EditValue نوشتید نگاه کنید، شما قرار بوده مقداری که تو مشخصه ثبت میشه رو return کنید، درسته؟ ببینید چی return می کنید. شما return هاتون یا null ئه یا value. پس کی مقدار شیء های جدیدی که در متغیر میسازید رو درون value قرار دادید؟ هیچوقت. شما در newTransCtrlBitmap شیء رو ساختید، قبول، بعد چیکار کردید با متغیرش؟ استفاده ای ازش نکردید، return اش نکردید.

خیلی متشکرم استاد . خدا خیرتون بده . :rose:
مشکل از همین بود و رفع شد .
حواسم به اون نبود . فکر کردم return رو گذاشتم کنارش.

در حالی که اگه ref رو بکار نبریم و از string به تنهایی استفاده کنیم، مقدار str1 در parameter1 کپی میشه و تغییر دادن parameter1 تاثیری روی str1 نداره :
کد:
        string Method1(string parameter1)
        {
            parameter1 = "Ali";
            return parameter1;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string str1 = "Reza";
            string str2 = Method1(str1);
            MessageBox.Show(str1);
        }

استاد ، من یادمه قبلا شما درباره ی همین قضیه میگفتین که اشاره گر هستش . بنابراین وقتی مثلا کد زیررا اجرا کنیم :

کد:
            string a = "salam";
            string b = a;

هر دوی متغییرهای a و b ، به یک شی اشاره میکنند (کپی نمیشن) .
اما وقتی یه رشته بهش میدیم ، در واقعیت ، یه شی جدید میسازه مثل :

کد:
            string a = "salam";
            string b = a;
            b = "khobi";

بنابراین ، در اینجا (در خط آخر کد) ، دو شی a و b ، به دو شی متفاوت اشاره میکنند .
بنابراین در کد بالا که دادین ، وقتی متغییر str1 ، به پارامتر parameter1 در Method1 ارسال میشه ، تا به این لحظه ، هم متغییر str1 و هم parameter1 ، به یه شی در حافظه اشاره میکنند (کپی نمیشه) اما وقتی مقدار parameter1 درون متد Method1 تغییر کرد ، (اگه بصورت ref نباشه که نیست) ، اشاره به شی جدید خواهد کرد .

اینو من یادمه استاد.

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

درباره ی روش درستِ ساختنِ ستاپ برنامه ، بعدا سئوالاتی دارم مخصوصا همینی که گفتید جوری باید ستاپ درست کرد که دیتابیس موجود ، مشکلی روش ایجاد نشه.
 

the_king

مدیرکل انجمن
استاد ، من یادمه قبلا شما درباره ی همین قضیه میگفتین که اشاره گر هستش . بنابراین وقتی مثلا کد زیررا اجرا کنیم :

کد:
            string a = "salam";
            string b = a;

هر دوی متغییرهای a و b ، به یک شی اشاره میکنند (کپی نمیشن) .
متوجه میشم که چی میگید، درسته، ولی پاسخی که برای reference بودن parameter1 دادم رو دقیق بخونید، به سوال جواب منفی که ندادم، خصوصیات string رو شرح دادم.
اشاره گر خودش یک نوع داده است که آدرس حافظه داخلش قرار میگیره، وقتی از متغیری به داخل متغیر دیگری کپی بشه، آدرس حافظه عینا کپی میشه در متغیر جدید.
دقیقا مشابه اینکه int a مقدارش در int b کپی بشه، اون آدرس حافظه یک عدد مثلا 64 بیتی است که کپی میشه. string a آدرس حافظه رو نگهداری کرده، خود رشته جای دیگری است.
قبلا به خودتون هم شبیه این پاسخ رو داده بودم : 210# و 199#

اما وقتی یه رشته بهش میدیم ، در واقعیت ، یه شی جدید میسازه مثل :

کد:
            string a = "salam";
            string b = a;
            b = "khobi";

بنابراین ، در اینجا (در خط آخر کد) ، دو شی a و b ، به دو شی متفاوت اشاره میکنند .
بنابراین در کد بالا که دادین ، وقتی متغییر str1 ، به پارامتر parameter1 در Method1 ارسال میشه ، تا به این لحظه ، هم متغییر str1 و هم parameter1 ، به یه شی در حافظه اشاره میکنند (کپی نمیشه) اما وقتی مقدار parameter1 درون متد Method1 تغییر کرد ، (اگه بصورت ref نباشه که نیست) ، اشاره به شی جدید خواهد کرد .
بله.
درباره ی روش درستِ ساختنِ ستاپ برنامه ، بعدا سئوالاتی دارم مخصوصا همینی که گفتید جوری باید ستاپ درست کرد که دیتابیس موجود ، مشکلی روش ایجاد نشه.
داخل Setup باید دستورات SQL ارسال بشه، حالا اگر برنامه Setup ساز خودش همچین قابلیتی رو نداشته باشه، با #C برای اینکار یک برنامه کوچک دیگه میسازید که در Setup اجرا بشه.
 

SajjadKhati

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

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

مشکل هم اینکه در آخرین ویرایش از Editor که در زیر براتون آپلود میکنم ، دکمه ی Clear مربوط به Control Disabled Bitmap را که میزنم ، و توش کد Null کردنِ این بیت مپ را نوشتم اما باز داخل متد EditValue که مقدار جدیدی از TransparentControlBitmap را برمیگردونم و در اونجا با اونکه MessageBox گذاشتم تا مقدار پروپرتیِ TransparentControlBitmap.ControlDisabledBitmap را متوجه بشم و با اونکه مقدار رو میگه که null هست اما دیزاینر ، بیت مپِ قبلی شو که توی فایل form1.resx هست را پاک نمیکنه . چرا؟
اما دکمه های Clear مربوط به دو تا دیگه از Bitmap ها ، وقتی کد Null شون اجرا میشه ، موقع بازگشت در متد EditValue ، دیزاینر بیت مپِ مربوط به اونها را اگه Null باشن ، حذف میکنه. که منم همین رو میخوام.

مشکل از کلاس های مربوط به کنترل TransparentControl نیست . چون از لحاظ کدنویسی همین قضیه را تستش کردم. فقط توی دیزاینر و اونم فقط برای Null کردنِ TransparentControlBitmap.ControlDisabledBitmap مشکل ایجاد میشه و پاک نمیشه.
فایل TransparentControl را در همون "گفتگو پ.خ" بهتون دادم .
خیلی ممنون.
 

پیوست ها

  • Editor.rar
    11 کیلوبایت · بازدیدها: 0

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
مشکل هم اینکه در آخرین ویرایش از Editor که در زیر براتون آپلود میکنم ، دکمه ی Clear مربوط به Control Disabled Bitmap را که میزنم ، و توش کد Null کردنِ این بیت مپ را نوشتم اما باز داخل متد EditValue که مقدار جدیدی از TransparentControlBitmap را برمیگردونم و در اونجا با اونکه MessageBox گذاشتم تا مقدار پروپرتیِ TransparentControlBitmap.ControlDisabledBitmap را متوجه بشم و با اونکه مقدار رو میگه که null هست اما دیزاینر ، بیت مپِ قبلی شو که توی فایل form1.resx هست را پاک نمیکنه . چرا؟
اما دکمه های Clear مربوط به دو تا دیگه از Bitmap ها ، وقتی کد Null شون اجرا میشه ، موقع بازگشت در متد EditValue ، دیزاینر بیت مپِ مربوط به اونها را اگه Null باشن ، حذف میکنه. که منم همین رو میخوام.

مشکل از کلاس های مربوط به کنترل TransparentControl نیست . چون از لحاظ کدنویسی همین قضیه را تستش کردم. فقط توی دیزاینر و اونم فقط برای Null کردنِ TransparentControlBitmap.ControlDisabledBitmap مشکل ایجاد میشه و پاک نمیشه.
فایل TransparentControl را در همون "گفتگو پ.خ" بهتون دادم .
خیلی ممنون.

این مشکل رو فهمیدم.
مشکل از کدهای توی TransparentControlBitmap.ParentChanged اش بود .
به این ترتیب که اول ، وقتی توی EditValue ، شی جدیدی از TransparentControlBitmap را برمیگردونم و پروپرتیِ TransparentControlBitmap.ControlDisabledBitmap اش نال هه ، بعد از اون ، توی رویداد ParentChanged اش مقداردهی اش کرده بودم. این مقداردهی (که دومین بار درون ControlDisabledBitmap انجام شد) ، باعث شد تا دوباره ، دیزاینر ، مقدار جدید بیت مپ را در form1.resx ثبت کنه.
اما قضیه ی ثبت کردن مگه چجوری هه؟ الان ما این همه پروپرتی هاش (در پست های قبل ، مثل پروپرتی DefautBitmap و ... که معلوم شد تا فقط اگه شی جدیدی به TransparentControlBitmap بدیم را ثبت میکنه) را تغییر میدادیم ، چرا ثبت نمیکرد؟
من گفتم استاد ، از همون شی ، هر وقت دلش میخواست ثبت میکرد . روال مشخصی برای ثبت کردن نداره.

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

یه چیز هم اینکه بجز اختصاص دادن متغییری به عنوان فلگ ، چجوری میشه متوجه شد که یه پروپرتی را آیا برنامه نویس مقدار null داد یا اینکه اصلا مقداردهی نشده و بخاطر مقداردهی نشدن هست که null هه؟
دوم اینکه مثلا وقتی داخل کلاس TransparentControlBitmap که هستیم ، میشه وقتی داخلِ یک متد که هستیم ، فهمید که الان این متد داره اجرا میشه ، آیا زمانِ دیزاینر هست (دیزاینر ویژال استودیو باعثِ اجرای این متد شده) یا زمانی که برنامه نویس ، برنامه را اجرا کرده؟

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

بعد اینکه به نظرتون توی TransparentControlBitmap ، برای پروپرتیِ ControlDisabledBitmap ، قابلیت نال بذارم یا نذارم؟
ControlDisabledBitmap هم که بیت مپی هست وقتی که اون کنترل غیر فعال شد ، رسم میشه.
معنا نداره یه کنترل ، غیر فعال بشه اما رسم اش همون باقی بمونه و تغییری نکنه . درسته؟
 
آخرین ویرایش:

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

بالا