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

the_king

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

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

آقا سجاد من 4 روزه روی این قسمت 11 گیر کردم روی enum . شما نوشتی که من هر چی مینویسم شما کاری نداشته باشید فعلا ولی من نمی تونستم بفهمم شما داری چیکار می کنی خلاصه تونستم با گشتن تو اینترنت بفهمم این enum چیه و ارتباطش رو با عملگر های بیتی
Enum یک گروه از مقادیری رو تعریف می کنه که هر کدوم یک اسم یکتا دارند. مقدار هر کدوم شون هم ثابت و بدون تغییر ئه. مزیت Enum در همون گروه ساختنه که یکسری مقادیر ثابت که به نحوی بهم مربوط اند رو یکجا و با یک اسم خاص جمع آوری می کنه. تو زبان هایی مثل ++C / C چون enum وجود نداشت مجبور شدن برای مقادیر یک پیشوند یکسان در نظر بگیرند تا پیدا کردنشون ساده تر بشه مثلا WM_KEYDOWN و WM_KEYUP و WM_CLOSE اما چون کامپایلر ارتباط بین این اسامی رو درک نمی کنه تو کد نویسی هیچ کمکی نمی کرد، اما با کمک enum همچین مشکلی پیش نمیاد، هر جا که اسم enum بیاد تمامی مقادیر زیر گروهش لیست میشه و در دسترس ئه.

الان فقط یک چیزی رو متوجه نشدم که چیه که تو کد می نویسم ولی فقط نتیجه ها رو

کد:
5 | 13 = 13

5 ^ 13 = 8


16 | 4 = 20

16 & 4 = 0

حالا ما اینا رو بدست آوردیم چه کمکی تو برنامه نویسی می کنه و کابردش چیه
ممکنه enum شامل مقادیری باشه که فقط یکتا بودنش مهمه، جابجا شدن مقدارها یا فرضا چند رقمی بودن مقادیر یا اینکه از چه مقداری شروع بشن یا توانی از 2 باشن یا نه مهم نباشه. فرضا اسامی شهر ها باشه. اینکه شهر تهران مقدار 178 داشته باشه یا 1009 باشه از نظر برنامه نویس مهم نیست. همه جا از نام City.Tehran استفاده میشه که City نام enum ئه و اینکه Tehran چه مقداری داره حقیقتا مهم نیست. در اینجور مثال به قول شما عملگر هایی مثل | و ^ و & معنی و مفهوم قابل درکی ندارند، چون فرضا City.Tehran | City.Yazd مقداری خواهد بود که نه ربطی به Tehran داره و نه Yazd. یک مقداری است که ممکنه معادل مقدار یکی از اعضاء City باشه یا نباشه.
برنامه نویس هم برایش ترکیب کردن مقادیر شهر ها معنی نداره. Tehran + Tabriz - Yazd معنی نداره. معادل عددی داره، ولی عدد ای نیست که معنی خاصی براش تعریف شده باشه.

اما مقادیر enum ها همیشه اینطوری بی اهمیت نیستند، فرضا enum ای رو در نظر بگیرید که ترکیب رنگ و نوع کفش باشه. رنگ یکسری مقادیر ئه و نوع کفش یکسری مقادیر دیگه که همه شون تحت enum ئه Shoes هستند. چطوری میخواهیم رنگ ونوع کفش رو در یک مجموعه مقدار دهی کنیم؟ یک راه نامناسب اینه که هر چی ترکیب رنگ و نوع هست رو همینطوری بدون توجه به مقدار یکی یکی بنویسیم. پوتین مشکی، پوتین قهوه ای و ...
و زمانی که بخواهیم همه پوتین ها یا همه مشکی ها رو سوا کنیم به مشکل برمیخوریم چون مقادیر هیچ تفکیک پذیری مشخصی ندارند. اما میشه فقط یک مقدار برای پوتین نوشت و فقط یک مقدار برای رنگ مشکی. به شرطی که مقادیر با شیوه مشخصی ترکیب بشوند. اینجا است که اون توان 2 بودن ها کمک می کنه. فرضا از قبل قرار میذاریم که چهار بیت برای رنگ باشه و چهار بیت بعدی برای نوع کفش. اینجا اون عملگر های | و & و ^ کاربرد پیدا می کنند چون هر مقدار رو بصورت بیتی تفسیر می کنیم. فرضا Shoes.Black | Shoes.Boot چکمه مشکی است. s & Shoes.Color) == Shoes.Black) فقط زمانی برقراره که s یک کفش مشکی باشه و با هر نوع دلخواه.
اگر 4 بیت اول رو به رنگ اختصاص میدیم Shoes.Color مقدار 15 داره، یعنی معادل باینری اش 00001111 ئه. و Shoes.Type که نوع کفش ئه مقدارش 240 ئه که معادل باینری اش 11110000 ئه. Color و Type به اصطلاح Mask هستند، با هر چی and بشوند بخش مربوط به خودشون رو سوا می کنند و بقیه رو حذف (صفر) می کنند.
 

SajjadKhati

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

کد:
public enum mah {};

mah mymah = ....;

من الان public رو بر میدارم باز هم درست کار می کنه. بعد کلمه کلیدی enum یک نوع داده ایه اما شما در خط پایینش mah رو نوشتی بعد جلوش mymah رو نوشتی یعنی اینجا mah یک نوع داده ایه؟

این enum رو هم بیرون رویداد نوشتی و گفتی که فعلا مهم نیست بدونید ولی من می خوام بدون چرا؟ چون من داخل رویداد نوشتم دیدم که خطا میده و نمی شه و اولین نوع داده ای و متغیری هست که نمی شه داخل رویداد نوشت

اگه می خوای جواب بدی نمی خواد تک تک نقل قول کنی که خسته بشی یکجا بگی من متوجه میشم. من تا نفهمم اینا چیه از ساعت 1 و 3 دقیقه قسمت 11 جلوتر نمیرم

با سلام آقا رامین
قبل از این تیکه رو که استاد علی در پست بالا ، لطف کردن ، توضیح دادن
اگه یادتون باشه ، من همون قسمت های اول گفتم که برنامه نویسی یه چیزی هه که مثل زنجیر به هم وصل هست . یعنی آدم نمیدونه از کجا شروع به توضیح دادن کنه . هر جاشو توضیح بده ، باز خودش به یه جای دیگه مربوط میشه . مخصوصا برنامه نویسی شی گرا .
دقیقا مثل قضیه ی شطرنج میمونه . حرکت یه مهره یه جوری هه و به مهره ی جلویی اش مربوط میشه (بجز برای اسب که مهره ی جلو و عقب نمیشناسه:green:) . باز مهره ی جلویی اش ، یه نوع حرکت دیگه ای داره . بخوای به کسی که تازه میخواد شطرنج یاد بگیره ، بگی که مثلا رخ ، حرکت اش مستقیم هه ولی اینجا در این لحظه نمیتونه جلوتر بره چون جلوش سربازه ، میگه حالا سرباز رو چجوری کنار بکشم؟ یا یه جایی که جلوی رخ ، فیل هست هم همینطور . بعد سئوال پیش میاد که چرا حرکت سرباز و فیل ، متفاوت هه؟ هر دو که شکل ظاهری شون که شبیه هم ان :green: . بنابراین باید صبر کرد که به طرف ، همه ی حرکات در شطرنج توضیح داده بشه تا تازه متوجه ی قوانین شرطنج بشه
شما هم باید صبر کنید تا همه ی مباحث سی شارپ رو ببینید و تمرین کنید تا متوجه ی کلیات اش بشین . اون کلیات اش ، هنوز که تا قسمت 54 هستم ، تموم نشد :green: حداقل تا 80 جلسه باید خون دل بخورین تا متوجه شین :green:
----------------------
اول اینکه enum ها به قضیه ی شی گرایی برمیگردن . شی گرایی هم سطح دسترسی داره و دنیایی مطالب دیگه . واسه همین گفتم فعلا به این چیزایی که مینویسم کار نداشته باشین . چون هر کدوم شون ، دنیایی مطالب میشد که خیلی هاش گفته شد و خیلی هاشم موند . شی گرایی از قسمت 27 شروع شد . فعلا اگه متوجه ی enum نمیشید که طبیعی هم هست ، میتونید بجاش از متغییرهای نوع int استفاده کنید . مثلا بجای Mah.Farvardin که برابر 1 هست، یه متغییری از نوع int تعریف کنید که برابر 1 بگیرید
public ربطی به ارور دادن یا ندادن ، نداره . سطح دسترسی هه . قضیه ی سطح دسترسی ، خودش در 2 قسمت (قسمت های 29 و 42) گفته شد . خود این ، باز به مباحث قبلی شی گرایی ربط داره که از قسمت 27 شروع شد
خود enum ، نوع داده ای نیست .یعنی احتمالا شما فرض میکنید که enum مثل string میمونه چون هر دو کلمه ی کلیدی هستن . این طور نیست . بلکه یه کلمه ی کلیدی ای هست که میشه باهاش نوع داده ای تعریف کرد . یعنی نوع Mah که با استفاده از کلمه ی کلیدی enum تعریف کردیم ، در اینجا نوع داده ای هست . یعنی در اینجا ، Mah ، شبیه string و object و ... هست (البته با صرف نظر از نوع استراکچر یا کلاس بودنشون که بعدا باهاش آشنا میشین) . enum ، مثل کلمه ی کلیدی class میمونه که حالا توی بحث شی گرایی ، آشنا میشین
اولا که خود enum ، نوع (داده ای) نیست . یعنی نمیتونین فرضا بنویسین :
کد:
enum myObj = ...
بجای نقطه چین ، حالا منظورم ، مقدار بود .
بلکه با اون چیزی که با استفاده از کلمه ی کلیدی enum تعریف میکنین (مثل Mah که تعریف کردم) ، میتونین نوع تعریف کنین
دوم اینکه هر نوع داده ای و کلا هر چیزی ، 2 بخش داره . بخش تعریف کردن و دوم بخش شی (متغییر) ساختن اش . شما وقتی دارید شی ای از نوع string میسازید مثلا مینویسید :
کد:
string myObj = "salam";
این string ، یه کلاسی هست که قبلا توسط مایکروسافت تعریف شد . یعنی شما نیومدید string رو تعریف کنید . فقط ازش شی ساختید . ولی نوع داده ای Mah که وجود نداشت . بنابراین خودتون اول اومدید تعریف کردید. این تعریف کردن رو در هر جایی نمیشه تعریف کرد. یعنی مثلا درون رویدادها نمیشه تعریف کرد . صرفا فقط درون فضای نام و یا درون کلاس میشه تعریف کرد . کلاس string و بقیه ی انواع داده ای مثل object و int و ... هم همینطوره . یعنی فرض کنید که مایکروسافت این کلاس (فرضا string) رو نمیساخت و خودتون مجبور بودین بسازین تا ازش استفاده کنید ، نمیتونستید در رویداد تعریفش کنید
اینکه کی و کجا ، چه جیز رو میشه تعریف کرد یا نکرد ، در قسمت های مربوط به شی گرایی ، بصورت پراکنده گفته شد (نه اینکه یکدفعه در یک قسمت صرفا گفته شه)
 

SajjadKhati

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

the_king

مدیرکل انجمن
سلام
استاد علی ، قبلا هم این سئوال رو پرسیدم ولی به جواب کامل نرسیدم
اینکه میشه با رشته که حاوی نام کلاس هست و یا Type اون کلاس ، دسترسی پیدا کرد به اطلاعات اون کلاس و ازش شی درست کرد و ...
ولی در جواب اینکه قبلا گفتم ، آیا از طریق رشته ، میشه مثلا نام یک متغییر رو (نه اینکه مقدارش رو) برابرهمون رشته گرفت یا نه؟ من هنوز به جواب نرسیدم . اگه نمیشه چطور مایکروسافت این کار رو میکنه؟ مثلا نام یک کنترل (پروپرتی Name) رو از ما بصورت رشته میگیره و همون رو برابر نام متغییر برای اون کنترل میکنه
اونا از زبان های دیگه این کار رو میکنن؟ با زبان های دیگه میشه این کار رو کرد؟ کلا چجوری اونا میتونن این کار رو کنن؟
متوجه منظورتون از "برابر همون رشته گرفتن" نمیشم، شما وقتی در یک پروژه طراحی فرم می کنید یکسری کد #C نوشته میشه و همون زمان کامپایل میشه. برای همینه که اگه در فایل Designer یک فرم خطایی رخ بده نمایش فرم با مشکل مواجه میشه، در حالی که شما دستور اجرای پروژه یا کامپایل رو ندادید، ولی اون فرم برای نمایش در حالت Designer به کامپایل شدن فایل Designer اش نیاز داره. فرضا یک کنترل روی فرم قرار می دهید و در مقابل یک متغیر در فایل کد Designer تعریف میشه که یک فایل متنی ئه، هر متغیری با هر اسمی میتونه داخلش بصورت کد تعریف بشه، مثلا متغیری با نام button1 تعریف میشه. تعریف شدن به این معنی ئه که یک سطر داخل فایل کد Designer نوشته شده که Button button1 و در سطر دیگری ()button1 = new Button و در سطر دیگری "button1.Name = "button1 و ...
وقتی این فایل کامپایل میشه فیلدی به کلاس Form1 اضافه شده که یک متغیر ئه به نام button1 که System.Reflection هم بهش دسترسی داره.
شما چه ابهامی در این مورد دارید؟ مشکل تون اینه که مایکروسافت چطور فیلد هایی مثل button1 رو داخل کلاس Form1 پیدا می کنه؟ یا مشکل تون اینه که چطور در this.Controls دنبال یک کنترل با Name ئه button1 میگرده؟ اینها که کار عجیب و غیر عادی ای نیستند.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
متوجه منظورتون از "برابر همون رشته گرفتن" نمیشم، شما وقتی در یک پروژه طراحی فرم می کنید یکسری کد #C نوشته میشه و همون زمان کامپایل میشه. برای همینه که اگه در فایل Designer یک فرم خطایی رخ بده نمایش فرم با مشکل مواجه میشه، در حالی که شما دستور اجرای پروژه یا کامپایل رو ندادید، ولی اون فرم برای نمایش در حالت Designer به کامپایل شدن فایل Designer اش نیاز داره. فرضا یک کنترل روی فرم قرار می دهید و در مقابل یک متغیر در فایل کد Designer تعریف میشه که یک فایل متنی ئه، هر متغیری با هر اسمی میتونه داخلش بصورت کد تعریف بشه، مثلا متغیری با نام button1 تعریف میشه. تعریف شدن به این معنی ئه که یک سطر داخل فایل کد Designer نوشته شده که Button button1 و در سطر دیگری ()button1 = new Button و در سطر دیگری "button1.Name = "button1 و ...
وقتی این فایل کامپایل میشه فیلدی به کلاس Form1 اضافه شده که یک متغیر ئه به نام button1 که System.Reflection هم بهش دسترسی داره.
شما چه ابهامی در این مورد دارید؟ مشکل تون اینه که مایکروسافت چطور فیلد هایی مثل button1 رو داخل کلاس Form1 پیدا می کنه؟ یا مشکل تون اینه که چطور در this.Controls دنبال یک کنترل با Name ئه button1 میگرده؟ اینها که کار عجیب و غیر عادی ای نیستند.

ممنون استاد علی
میدونیم که در پروپرتی Name هر کنترلی ، مقداری بدیم ، اون مقدار رشته ، به نام متغییرِ (شیِ) همون کنترل تبدیل میشه . مثلا پروپرتی Name دکمه ای رو از button1 به btnTest تغییر بدیم (در قسمت designer) ، از اون به بعد ، نام اون کنترل با this.btnTest در دسترس خواهد بود . پروپرتی Name در کنترل ها هم از نوع string هه دیگه
خوب پس مایکروسافت تونست یک رشته بگیره و تبدیل به نام متغییر کنه
ولی ما این کار رو نمیتونیم کنیم
سئوالم همینه
اگه ما هم همچین کاری میتونستیم کنیم ، موقع اجرا ، خیلی دست مون بازتر میشد . حالا خیلی مهم نیست
ممنون
 

the_king

مدیرکل انجمن
ممنون استاد علی
میدونیم که در پروپرتی Name هر کنترلی ، مقداری بدیم ، اون مقدار رشته ، به نام متغییرِ (شیِ) همون کنترل تبدیل میشه.

این خصوصیت مربوط به Designer ویژوال استدیو ئه، برای کد نویسی ئه، ربطی به زمان اجرا نداره، خصوصیت Name یا #C یا پروژه شما نیست. در حین اجرای پروژه نه Designer نقشی داره و نه پروژه کامپایل مجدد میشه که با تغییر Name اسم متغیری عوض بشه. در زبانهایی که کامپایلر دارند که اسم متغیر در حال اجرا تغییر نمی کنه.
. مثلا پروپرتی Name دکمه ای رو از button1 به btnTest تغییر بدیم (در قسمت designer) ، از اون به بعد ، نام اون کنترل با this.btnTest در دسترس خواهد بود . پروپرتی Name در کنترل ها هم از نوع string هه دیگه
خوب پس مایکروسافت تونست یک رشته بگیره و تبدیل به نام متغییر کنه
ولی ما این کار رو نمیتونیم کنیم
سئوالم همینه
اگه ما هم همچین کاری میتونستیم کنیم ، موقع اجرا ، خیلی دست مون بازتر میشد . حالا خیلی مهم نیست
ممنون
یک رشته رو به نام متغیر تبدیل نمی کنه که، شما با خود متغیر دارید کار می کنید و خود متغیر رو تغییر نام میدید، Name ئه Control این وسط نقشی نداره. اون متغیر هم خود شیء کنترل ئه. من اگر یک کنترل بسازم و Name اش رو 47 بذارم باید در فرم متغیری به نام 47 باشه؟ اصلا همچین رابطه ای نیست. شما در اجرای چه پروژه ای دست تون بسته شده؟ در هیچ زبانی برنامه نویس دستش بسته نیست، توانایی برنامه نویس تعیین کننده است، نه زبان.
کد:
        private void Form1_Load(object sender, EventArgs e)
        {
            var name = "button1";
            var b = (Button) this.GetType().GetField(name, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this);
            b.Text = "Exit";
            b.Click += B_Click;
        }

        private void B_Click(object sender, EventArgs e)
        {
            Close();
        }
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون
من آخر این پارامتری که مربوط به enum ی که BindingFlags داره رو دقیق متوجه نشدم برای چیه؟
 

the_king

مدیرکل انجمن
ممنون
من آخر این پارامتری که مربوط به enum ی که BindingFlags داره رو دقیق متوجه نشدم برای چیه؟
نوع چیزی که دنبالش هستید و میزان دسترسیش رو تعیین می کنه که بدونه کجا و دنبال موردی با چه جور دسترسی ای بگرده. طبیعتا فیلدی که مربوط به شیء ئه (instance) با فیلدی که مربوط به خود کلاس ئه (static) محل های متفاوتی قرار دارند و Public بودن و نبودن (NonPublic) اش هم موثره.
 

SU-57

Active Member
استاد علی عزیز اولا ممنونم از اینکه پاسخ ما رو با صبر و حوصله و بدون منت میدی و این لطف های شما و آقا سجاد رو هرگز فراموش نمی کنم

یه سوال دارم

آقا سجاد گفت که من کد نمیدم و من معنی این رومتوجه نشدم چون وقتی بخواهی یک مثال بزنی باید کدش رو بدی

حالا من درباره enum چند تا مثال دارم که باید کد داده بشه می خواستم ببینم اگه شما هم کد نمیدید من دیگه مثال ها رو تایپ نکنم پ و اگه هم کد نمیدید این حق طبیعی شماست و من یک درصد ناراحت نمیشم یعنی دوست ندارم کسی به اجبار پاسخ بده
 

SajjadKhati

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

یه سوال دارم

آقا سجاد گفت که من کد نمیدم و من معنی این رومتوجه نشدم چون وقتی بخواهی یک مثال بزنی باید کدش رو بدی

حالا من درباره enum چند تا مثال دارم که باید کد داده بشه می خواستم ببینم اگه شما هم کد نمیدید من دیگه مثال ها رو تایپ نکنم پ و اگه هم کد نمیدید این حق طبیعی شماست و من یک درصد ناراحت نمیشم یعنی دوست ندارم کسی به اجبار پاسخ بده

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

SajjadKhati

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

SU-57

Active Member
من می دونم خیلی کارها رو می شه ساده تر و با روش های دیگه هم انجام داد ولی من اینجا هدفم اینه که بدونم با enum هم می شه

1- من رفتم تو سایت مایکروسافت این کد رو داده بود که من یکمی تغییرش دادم تا منظورم رو بیان کنم

کد:
 enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri };

private void button1_Click(object sender, EventArgs e)
{

         int x = (int)Days.Sun;

         MessageBox.Show(x.ToString());
}

یعنی ما میگیم یکشنبه چندمین روز هفته است و جواب میاد 2. حالا امکان داره که ما بتونیم در قسمت رویداد کدی بنویسیم که بگیم دومین روز هفته چیه و جواب sun بشه

2- من این کد رو با string و if نوشتم

کد:
string mah1 = "Farvardin", mah2 = "Ordibehesht", mah3 = "Khordad";

            if (mah1 == "Farvardin" | mah2 == "Ordibehesht" | mah3 == "Khordad")
                MessageBox.Show("Bahar");

حالا من احساس می کنم اگه بشه دو تا enum رو با هم ترکیب کرد خیلی جالب می شه. شما کد زیر رو نگاه کن

کد:
 public enum Mah_ha { Farvardin, Ordibehesht, khordad, Tir, Mordad, shahrivar };

public enum Fasl_ha { bahar, Tabestan };

حالا کد داخل رویداد رو می خوام به این صورت که اگه Farvardin ، Ordibehesht و khordad بود کلمه bahar رو از توی enum برگردونه و اگه اون 3 تا ماه دیگه بود Tabestan رو برگردونه

3- از استاد علی هم می خوام که اون مثالی که از کفش ها زدن رو کدش رو بزارن مثلا 3 نوع کفش با سه نوع رنگ که ترکیب و تفصیل اون عملگرهای بیتی رو یاد بگیرم و طریقه mask کردن اون ها رو

اگه وقت ندارید فقط لطف کنید بفرمائید شماره 1 و 2 شدنی هست اگه هست خودم بالاخره پیداش می کنم و شماره 3 رو فعلا بی خیال میشم چون کار من نیست
 

the_king

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

یا اینکه توی سی شارپ میشه یه برنامه ای (مثل اتوپلی) نوشت که از لوا که Unmanaged هست ، استفاده کنه؟ کلا ساده ترین روش اش چجوری هه؟
ساده ترین روش تعیین کننده نیست، هدف تعیین کننده است. روش رو باید بر اساس هدفی که دارید انتخاب کنید.
اول در نظر بگیرید که هدف چیه، کد لوا قراره اجرا بشه که چه اتفاقی بیافته؟ یک کد مستقل از لوا اجرا بشه که مستقل از برنامه #C اجرا میشه یا یک کد لوا که مقداری رو در متغیر های #C قرار بده یا رخدادی رو فراخوانی کنه. اگه بخواهید با برنامه #C تعاملی داشته باشه باید یک کتابخانه در کار باشه. Unmanged بودنش اینجا مطرح نیست، مهم هم نیست. توابع API هم Unmanaged اند، Unmanaged بودنشون باعث نمیشه که نتونید فراخوانی شون کنید. Unmanaged بودنشون هم باعث نمیشه که نتوانید بهشون مقدار بفرستید یا ازشون مقدار دریافت کنید. اما فرضا برای ارتباط با Notepad.exe امکانات خاصی وجود نداره، چون کتابخانه ای ارائه نکرده چه Managed باشه یا Unmanaged باشه، یک پروسه مستقل ئه که در #C رویش کنترل خاصی ندارید. برای همین مهمه که کتابخانه ای در کار باشه.
شما توابع API رو چطور در برنامه فراخوانی می کنید؟ همانطور هم باید کتابخانه ای برای مفسر یا کامپایلر لوا باشه که فراخوانی شون کنید.
 

SajjadKhati

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

1- من رفتم تو سایت مایکروسافت این کد رو داده بود که من یکمی تغییرش دادم تا منظورم رو بیان کنم

کد:
 enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri };

private void button1_Click(object sender, EventArgs e)
{

         int x = (int)Days.Sun;

         MessageBox.Show(x.ToString());
}

یعنی ما میگیم یکشنبه چندمین روز هفته است و جواب میاد 2. حالا امکان داره که ما بتونیم در قسمت رویداد کدی بنویسیم که بگیم دومین روز هفته چیه و جواب sun بشه

2- من این کد رو با string و if نوشتم

کد:
string mah1 = "Farvardin", mah2 = "Ordibehesht", mah3 = "Khordad";

            if (mah1 == "Farvardin" | mah2 == "Ordibehesht" | mah3 == "Khordad")
                MessageBox.Show("Bahar");

حالا من احساس می کنم اگه بشه دو تا enum رو با هم ترکیب کرد خیلی جالب می شه. شما کد زیر رو نگاه کن

کد:
 public enum Mah_ha { Farvardin, Ordibehesht, khordad, Tir, Mordad, shahrivar };

public enum Fasl_ha { bahar, Tabestan };

حالا کد داخل رویداد رو می خوام به این صورت که اگه Farvardin ، Ordibehesht و khordad بود کلمه bahar رو از توی enum برگردونه و اگه اون 3 تا ماه دیگه بود Tabestan رو برگردونه

3- از استاد علی هم می خوام که اون مثالی که از کفش ها زدن رو کدش رو بزارن مثلا 3 نوع کفش با سه نوع رنگ که ترکیب و تفصیل اون عملگرهای بیتی رو یاد بگیرم و طریقه mask کردن اون ها رو

اگه وقت ندارید فقط لطف کنید بفرمائید شماره 1 و 2 شدنی هست اگه هست خودم بالاخره پیداش می کنم و شماره 3 رو فعلا بی خیال میشم چون کار من نیست

سلام آقا رامین
1) بله میشه
باید از متد استاتیک ای بنام GetNames در کلاس Enum استفاده کنین که در قسمت 47 گفته شد . در enum ای که در مثال اول نوشتید (Days) ، در ورودی اول ، شی ای از کلاس Type برای اون اینامِ Days تون را با عملگر typeof (یا متد gettype) بدین و در آرگومان دوم ، مقدار اینام مورد نظظر را مثلا مقدار sun که 2 میشه را (اینکه متد چیه یا استاتیک چیه و کلاس چیه و کلاس Type و عملگر typeof و ... چی هستن ، خودش بحث های مفصلی هست که در قسمت های متراکم گفته شد . واسه ی همین ها گفتم فعلا زیاد نخواین ته وتوی Enum ها رو بدونین تا وقت اش برسه) :

کد:
string dayName = System.Enum.GetName(typeof(Days), 2);
            MessageBox.Show(dayName);

2) مثالی که زدید ، ربطی به مثال اینام نداشت . شما عملگر منطقی رو مثال زدید ولی در قضیه ی اینام (در آموزش)، عملگر بیتی مثال زده شد :

کد:
private void button1_Click(object sender, EventArgs e)
        {
            Mah_ha currentMah = Mah_ha.Ordibehesht;

            int currentMahNum = (int)currentMah;
            int currentFaslNum = (int)(Math.Ceiling( ((decimal)currentMahNum) / 3));
            string fasleName = Enum.GetName(typeof(Fasl_ha), currentFaslNum);
            MessageBox.Show(fasleName);
        }

        public enum Mah_ha { Farvardin =1, Ordibehesht, khordad, Tir, Mordad, shahrivar };
        public enum Fasl_ha { bahar =1, Tabestan };

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
نوع چیزی که دنبالش هستید و میزان دسترسیش رو تعیین می کنه که بدونه کجا و دنبال موردی با چه جور دسترسی ای بگرده. طبیعتا فیلدی که مربوط به شیء ئه (instance) با فیلدی که مربوط به خود کلاس ئه (static) محل های متفاوتی قرار دارند و Public بودن و نبودن (NonPublic) اش هم موثره.

ممنون
استاد علی ، میشه اطلاعات یک عضو با سطح دسترسی private رو گرفت؟
من در کلاس Page2Class.Child ، یک فیلد private با نام privt دارم و کد زیر رو برای گرفتن اطلاعاتش نوشتم ولی ارور null reference رو میده :


کد:
private void btnType5_Click(object sender, EventArgs e)
        {
            Page2Class.Child childMainObj = new Page2Class.Child("salam");
            Type childType = childMainObj.GetType();
         
            MessageBox.Show(childType.GetMember("privt",  BindingFlags.NonPublic | BindingFlags.GetField)[0].Name);
        }

با متد GetField هم رفتم ، همین بود و ارور میداد.
چجوری اطلاعات اعضای private رو باید گرفت؟
--------------------------------
ببخشید . جواب شو متوجه شدم .
چون وابسته به شی بود ، باید توی BindingFlags ، مقدار BindingFlags.Instance هم میذاشتم
 
آخرین ویرایش:

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
استاد علی ، پیروِ این سئوال فراخونی تابع ChooseFont در api که در اتوپلی که پرسیده بودم ، من دقیق توی اتوپلی متوجه نشدم
میشه توی سی شارپ ، یه مثالی از فراخونی همون تابع api بزنید جوری که بشه نام فونت رو براش فرستاد و نام فونت انتخابی کاربر رو دریافت کرد؟ تا تبدیل به کد اتوپلی کنم
ممنون
 

the_king

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

کد:
        [DllImport("comdlg32.dll", CharSet = CharSet.Ansi, EntryPoint = "ChooseFontA", SetLastError = true)]
        private static extern bool ChooseFontA(IntPtr lpcf);

        private const int LF_FACESIZE = 32;

        [Flags]
        private enum CHOOSEFONTFLAGS
        {
            CF_SCREENFONTS = 0x00000001,
            CF_PRINTERFONTS = 0x00000002,
            CF_BOTH = (CF_SCREENFONTS | CF_PRINTERFONTS),
            CF_SHOWHELP = 0x00000004,
            CF_ENABLEHOOK = 0x00000008,
            CF_ENABLETEMPLATE = 0x00000010,
            CF_ENABLETEMPLATEHANDLE = 0x00000020,
            CF_INITTOLOGFONTSTRUCT = 0x00000040,
            CF_USESTYLE = 0x00000080,
            CF_EFFECTS = 0x00000100,
            CF_APPLY = 0x00000200,
            CF_ANSIONLY = 0x00000400,
            CF_SCRIPTSONLY = CF_ANSIONLY,
            CF_NOVECTORFONTS = 0x00000800,
            CF_NOOEMFONTS = CF_NOVECTORFONTS,
            CF_NOSIMULATIONS = 0x00001000,
            CF_LIMITSIZE = 0x00002000,
            CF_FIXEDPITCHONLY = 0x00004000,
            CF_WYSIWYG = 0x00008000,
            CF_FORCEFONTEXIST = 0x00010000,
            CF_SCALABLEONLY = 0x00020000,
            CF_TTONLY = 0x00040000,
            CF_NOFACESEL = 0x00080000,
            CF_NOSTYLESEL = 0x00100000,
            CF_NOSIZESEL = 0x00200000,
            CF_SELECTSCRIPT = 0x00400000,
            CF_NOSCRIPTSEL = 0x00800000,
            CF_NOVERTFONTS = 0x01000000,
            CF_INACTIVEFONTS = 0x02000000
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        private struct LOGFONT
        {
            public int lfHeight;
            public int lfWidth;
            public int lfEscapement;
            public int lfOrientation;
            public int lfWeight;
            public byte lfItalic;
            public byte lfUnderline;
            public byte lfStrikeOut;
            public byte lfCharSet;
            public byte lfOutPrecision;
            public byte lfClipPrecision;
            public byte lfQuality;
            public byte lfPitchAndFamily;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = LF_FACESIZE)]
            public string lfFaceName;
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        private struct CHOOSEFONT
        {
            public int lStructSize;
            public IntPtr hwndOwner;
            public IntPtr hDC;
            public IntPtr lpLogFont;
            public int iPointSize;
            public CHOOSEFONTFLAGS Flags;
            public int rgbColors;
            public IntPtr lCustData;
            public IntPtr lpfnHook;
            public string lpTemplateName;
            public IntPtr hInstance;
            public string lpszStyle;
            public short nFontType;
            private short __MISSING_ALIGNMENT__;
            public int nSizeMin;
            public int nSizeMax;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var lfont = new LOGFONT { lfFaceName = "Impact", lfWeight = 400, lfHeight = -14 * 96 / 72 }; // Impact Regular 14
            var pfont = Marshal.AllocHGlobal(Marshal.SizeOf(lfont));
            Marshal.StructureToPtr(lfont, pfont, false);
            var choose = new CHOOSEFONT
            {
                nSizeMin = 64,
                nSizeMax = 64,
                Flags = CHOOSEFONTFLAGS.CF_SCREENFONTS | CHOOSEFONTFLAGS.CF_FORCEFONTEXIST
                    | CHOOSEFONTFLAGS.CF_INACTIVEFONTS | CHOOSEFONTFLAGS.CF_INITTOLOGFONTSTRUCT
                    | CHOOSEFONTFLAGS.CF_SCALABLEONLY,
                lpLogFont = pfont,
                hwndOwner = this.Handle
            };
            choose.lStructSize = Marshal.SizeOf(choose);
            var pchoose = Marshal.AllocHGlobal(Marshal.SizeOf(choose));
            Marshal.StructureToPtr(choose, pchoose, false);
            var result = ChooseFontA(pchoose);
            lfont = (LOGFONT)Marshal.PtrToStructure(pfont, typeof(LOGFONT));
            var fontName = lfont.lfFaceName;
            Marshal.FreeHGlobal(pchoose);
            Marshal.FreeHGlobal(pfont);
            if (result)
            {
                MessageBox.Show(fontName);
            }
        }
 

SajjadKhati

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

کد:
        [DllImport("comdlg32.dll", CharSet = CharSet.Ansi, EntryPoint = "ChooseFontA", SetLastError = true)]
        private static extern bool ChooseFontA(IntPtr lpcf);

        private const int LF_FACESIZE = 32;

        [Flags]
        private enum CHOOSEFONTFLAGS
        {
            CF_SCREENFONTS = 0x00000001,
            CF_PRINTERFONTS = 0x00000002,
            CF_BOTH = (CF_SCREENFONTS | CF_PRINTERFONTS),
            CF_SHOWHELP = 0x00000004,
            CF_ENABLEHOOK = 0x00000008,
            CF_ENABLETEMPLATE = 0x00000010,
            CF_ENABLETEMPLATEHANDLE = 0x00000020,
            CF_INITTOLOGFONTSTRUCT = 0x00000040,
            CF_USESTYLE = 0x00000080,
            CF_EFFECTS = 0x00000100,
            CF_APPLY = 0x00000200,
            CF_ANSIONLY = 0x00000400,
            CF_SCRIPTSONLY = CF_ANSIONLY,
            CF_NOVECTORFONTS = 0x00000800,
            CF_NOOEMFONTS = CF_NOVECTORFONTS,
            CF_NOSIMULATIONS = 0x00001000,
            CF_LIMITSIZE = 0x00002000,
            CF_FIXEDPITCHONLY = 0x00004000,
            CF_WYSIWYG = 0x00008000,
            CF_FORCEFONTEXIST = 0x00010000,
            CF_SCALABLEONLY = 0x00020000,
            CF_TTONLY = 0x00040000,
            CF_NOFACESEL = 0x00080000,
            CF_NOSTYLESEL = 0x00100000,
            CF_NOSIZESEL = 0x00200000,
            CF_SELECTSCRIPT = 0x00400000,
            CF_NOSCRIPTSEL = 0x00800000,
            CF_NOVERTFONTS = 0x01000000,
            CF_INACTIVEFONTS = 0x02000000
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        private struct LOGFONT
        {
            public int lfHeight;
            public int lfWidth;
            public int lfEscapement;
            public int lfOrientation;
            public int lfWeight;
            public byte lfItalic;
            public byte lfUnderline;
            public byte lfStrikeOut;
            public byte lfCharSet;
            public byte lfOutPrecision;
            public byte lfClipPrecision;
            public byte lfQuality;
            public byte lfPitchAndFamily;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = LF_FACESIZE)]
            public string lfFaceName;
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        private struct CHOOSEFONT
        {
            public int lStructSize;
            public IntPtr hwndOwner;
            public IntPtr hDC;
            public IntPtr lpLogFont;
            public int iPointSize;
            public CHOOSEFONTFLAGS Flags;
            public int rgbColors;
            public IntPtr lCustData;
            public IntPtr lpfnHook;
            public string lpTemplateName;
            public IntPtr hInstance;
            public string lpszStyle;
            public short nFontType;
            private short __MISSING_ALIGNMENT__;
            public int nSizeMin;
            public int nSizeMax;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var lfont = new LOGFONT { lfFaceName = "Impact", lfWeight = 400, lfHeight = -14 * 96 / 72 }; // Impact Regular 14
            var pfont = Marshal.AllocHGlobal(Marshal.SizeOf(lfont));
            Marshal.StructureToPtr(lfont, pfont, false);
            var choose = new CHOOSEFONT
            {
                nSizeMin = 64,
                nSizeMax = 64,
                Flags = CHOOSEFONTFLAGS.CF_SCREENFONTS | CHOOSEFONTFLAGS.CF_FORCEFONTEXIST
                    | CHOOSEFONTFLAGS.CF_INACTIVEFONTS | CHOOSEFONTFLAGS.CF_INITTOLOGFONTSTRUCT
                    | CHOOSEFONTFLAGS.CF_SCALABLEONLY,
                lpLogFont = pfont,
                hwndOwner = this.Handle
            };
            choose.lStructSize = Marshal.SizeOf(choose);
            var pchoose = Marshal.AllocHGlobal(Marshal.SizeOf(choose));
            Marshal.StructureToPtr(choose, pchoose, false);
            var result = ChooseFontA(pchoose);
            lfont = (LOGFONT)Marshal.PtrToStructure(pfont, typeof(LOGFONT));
            var fontName = lfont.lfFaceName;
            Marshal.FreeHGlobal(pchoose);
            Marshal.FreeHGlobal(pfont);
            if (result)
            {
                MessageBox.Show(fontName);
            }
        }

سلام
ممنون استاد علی
نه همچین آرمانی ندارم :) یکی در یه انجمن دیگه در اتوپلی ، درباره ی فراخونی کردن و گرفتن اطلاعات (مخصوصا نام) فونت که در api هست کدشو نوشته بود و در جاهایی اش مشکل داشت . هر چند واسه اتوپلی ، پلاگین های بسیار راحتی برای این کار بود ولی از api میخواست . سئوال اش برام جذاب بود و خودمم دوست داشتم دنبالش برم
به هر حال ممنون
---------------------------------
کدهای داخل رویداد button1_Click رو متوجه شدم (شاید کامل نشده باشم و کلا متوجه شدم)
ولی یه مشکل ، اون attributes هایی که به کار بردین ، برای چی هستن؟ مخصوصا اون attributes ای بنام MarshalAs که برای رشته بکار بردین چی هه و کارش چیه و آرگومان هاش برای چی هستن؟ یعنی کلا میتونم یه چیزهایی از این attributes ها بفهمم ولی یه کم متوجه میشم و زیاد چیزی نمیدونم
بعد اینکه در اتریباتس MarshalAs ، فیلد SizeConst مگه تعداد کاراکترهای در یک رشته نیست؟ پس چرا طول ثابت 32 داره؟ نمیدونم اندازه یک کاراکترها برای این تابع فونت که ansi هست حساب میشه (هر کاراکتر یک بایت) یا به عنوان کد سی شارپ که کاراکتری 2 بایت
ولی طول رشته برای فیلد lfFaceName که متغییر هه . یعنی شما مقدارشو بصورت پیش فرض ، نام Impact دادین که 6 کاراکتر داره . موقع انتخاب یک فونت توسط کاربر ، ممکنه یه فونتی را انتخاب کنه که بیش از 31 کاراکتر داشته باشه (آخری که نال هه) . کلا این عدد 32 برای چی هه دقیقا و بر چه اساس انتخاب کردین؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
کدهای داخل رویداد button1_Click رو متوجه شدم (شاید کامل نشده باشم و کلا متوجه شدم)
ولی یه مشکل ، اون attributes هایی که به کار بردین ، برای چی هستن؟ مخصوصا اون attributes ای بنام MarshalAs که برای رشته بکار بردین چی هه و کارش چیه و آرگومان هاش برای چی هستن؟ یعنی کلا میتونم یه چیزهایی از این attributes ها بفهمم ولی یه کم متوجه میشم و زیاد چیزی نمیدونم
بعد اینکه در اتریباتس MarshalAs ، فیلد SizeConst مگه تعداد کاراکترهای در یک رشته نیست؟ پس چرا طول ثابت 32 داره؟ نمیدونم اندازه یک کاراکترها برای این تابع فونت که ansi هست حساب میشه (هر کاراکتر یک بایت) یا به عنوان کد سی شارپ که کاراکتری 2 بایت
ولی طول رشته برای فیلد lfFaceName که متغییر هه . یعنی شما مقدارشو بصورت پیش فرض ، نام Impact دادین که 6 کاراکتر داره . موقع انتخاب یک فونت توسط کاربر ، ممکنه یه فونتی را انتخاب کنه که بیش از 31 کاراکتر داشته باشه (آخری که نال هه) . کلا این عدد 32 برای چی هه دقیقا و بر چه اساس انتخاب کردین؟
من 32 رو انتخاب نکردم؛ اجباری ئه، هیچ مقداری بجز 32 نمیتونه باشه، طولش ثابته. مستندات API رو که برنامه نویس به دلخواهش نمیتونه تغییر بده. هیچ نام فونتی با طول بیشتر از 31 کاراکتر در اون ساختار قرار نمی گیره. قبلا هم گفتم برای اینجور موارد به MSDN مراجعه کنید. برید ببینید در توضیحاتی که برای اون فیلد lfFaceName نوشته برای طول بیشتر از 32 کاراکتر چی گفته. LOGFONT structure

مساله متفاوت بودن طول نام نیست، چون آخرش یک کاراکتر null نوشته میشه و طولش مشخص میشه، مساله جای نگهداری شه، حافظه ای که بهش اختصاص داده میشه که نمیتونه با طول نامحدود باشه. یک struct طول مشخصی داره، یک تعداد بایت مشخصی اختصاص داده به فضای ذخیره سازی نام فونت. حالا شما بودید شاید 128 کاراکتر می گرفتید ولی طراح اون LOGFONT مقدار 32 کاراکتر در نظر گرفته. دست من و شما هم نیست، قابل تغییر هم نیست، در مستندات API تعریف شده. تک بایتی یا دو بایتی بودنش هم بستگی به فراخوانی کننده اش داره، روتین ANSI با تک بایتی کار می کنه و روتین Unicode با دو بایتی. مثالش ChooseFontW و ChooseFontA ئه. مثل بقیه ساختار های داده ای رشته ای، یک نسخه A ئه ANSI دارند و یک نسخه W ئه Unicode . حتی صریحا ممکنه از LOGFONTW اسم برده بشه.
API ویندوز که تعاریف شون با زبان ++C / C ئه، حالا کتابخانه های متفرقه بماند که اکثرشون با کد های ++C ئه. به همین خاطر ساختار struct ها و پارامتر ها و انواع داده ای شون منطبق بر ++C ئه. شما در #C و هر زبان دیگه ای وقتی دارید با اون کتابخانه ها کار می کنید باید ساختار داده ای رو منطبق با همون تعاریف ++C پیاده سازی کنید، یک بایت اینور و اونور بشه ناسازگار میشه. ممکنه بعضی ساختار ها در #C معادل مشخصی نداشته باشند، مثلا در ++C داخل struct ها میشه string با طول ثابت تعریف کرد، اما #C بدون اون MarshalAs معادلی برای آرایه با طول ثابت داخل struct ها نداره. زبان #C بصورت خودکار سعی می کنه انواع داده ای رو هوشمندانه تبدیل کنه، اما فرضا نمیتونه بدون توضیحات MarshalAs بفهمه bool ای که نوشتید و اشاره به یک struct در اون کتابخانه داره قراره چند بایتی باشه، یک بایتی ئه، دو بایتی ئه، چهار بایتی ئه، یا نمیتونه بفهمه string ئه قراره چه Encoding ای داشته باشه، یا نمیتونه بفهمه string ئه قراره یک اشاره گر به یک حافظه دیگه باشه یا یک آرایه با طول ثابت فلان ئه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
ممنون استاد علی
واقعا کمک کردین و این قضیه ی فونت رو به نتایج قابل قبولی رسیدم (هر چند کلا سئوالاتی هنوز باقی موند) :rose:
-----------
توی زامارین 2 تا مشکل دارم . اول اینکه برنامه بسیار بسیار کند لود میشه و کلا کارهاش انجام میشه . پیام میده که یه چیزی بنام Android Virtual Device رو باید فعال کنم تا سرعتش 10 برابر بیشتر شه ولی همچین گزینه ای رو پیدا نمیکنم . از کجا میتونم فعال کنم؟
دوم اینکه برنامه ای که توی زامارین درست کردم ، اصلا بعد از اجرای پروژه ، در جایی نیست . حتی در لیست application ها !! این برنامه ی نوشته شده ، خودش و آیکونش پس کجاست تا اجرا کنم؟
 

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

بالا