اخیرا مجموعه «هما» مخصوص ابونتو ۸.۱۰ بدستم رسید ، جاتون خالی بعد از اینکه کلی از بسته هاش رو نصب کردم و حالشونو بردم ، یه بسته تازه توی این مجموعه نظرم رو به خودش جلب کرد . بله ! این بسته همانا mono بود !
پروژه مونو توسط شرکت Novell پشتیبانی میشه که از اهدفش میشه به ساخت کامپایلر #C برای لینوکس و ایجاد محیطی برای طراحی، ساخت و اجرای برنامه های دات نتی در لینوکس اشاره کرد. بهتر بگم ، ساخت CLR لینوکسی ! ... البته این کار رو قبلا مایکروسافت تحت عنوان Rotor انجام داده ، اما چون تحت لیسانس Microsoft Shared Source منتشر شده ، برای جامعه لینوکسی ها بی استفادست . (چون مثل اینکه استفاده تجاری رو مستقیما منع کرده یا یه همچین چیزی ... )
خلاصه ... ما Mono Develop که یه IDE برای محیط گنوم هستش رو نصب کردیم .
در اولین اجرا با پنجره زیر روبرو شدم :
همون طور که میبینید محیطی تقریبا شبیه به ویژوال استدیو مایکروسافت داره ،منتها یه کم ساده و جم و جور تر ... خوب ، بلافاصله روی Start a New Solution کلیک کردم ، پنجره زیر باز شد :
باز همون طور که معلومه سعی شده محیط شبیه به ویژوال استدیو مایکروسافتی باشه تا کسایی قبلا اونو کار می کردند ، احساس آشنا بودن و راحتی بکنن ...
برای شروع از لیست سمت چپ #C رو انتخاب کردم ، سه تا گزینه اومد سمت راست :
Console Project , Empty Project , GTK# 2.0 Project , Library (این که شد ۴ تا !) ... یکیشون چشمک میزد ! درسته! #GTK . باید میدیدم چی هست و چه فرقی با GTK غیر # داره !
اسم پروژه رو test گذاشتم و رفتم مرحله بعد . توی این قسمت چهار تا چک باکس بود :
- اولی ازم میخواست تا ورژن GTK ای که می خوام استفاده کنم رو مشخص کنم (البته این جا توی پرانتز بگم که GTK ابزاریه برای طراحی ویژگی بصری نرم افزار ها (همون UI خودمون) که توی لینوکس خیلی طرفدار داره ، مخفف GIMP Tool Kit ، گیمپ هم یه نرم افزار پردازش تصویر ...)
- دومی درباره پکیج هایی که می خوام با پروژه بسازه میپرسه ، مثلا اینکه یه پکیچ جدا برای source ها ، یه پکیج جدا برای فایل های binary ...
- سومی درباره زبان هایی که قراره interface برنامه ازش استفاده کنه رو میپرسه
- و چهارمی و آخری بیشتر برای سیستم های UNIX کاربرد داره ، اینکه فایل های launcher و desktop برای پروژه بسازه یا نه ...
بعد از این پنجره به صفحه اصلی مونو برگردونده میشیم :
بعد از اینکه که یکم ور رفتم باهاش توی لیست solutions روی User Interface کلیک و Main Window رو انتخاب کردم ... اگر شما هم مثل من ناشی باشید ، فوری از توی تول باکس یه دکمه ور میدارید و میندازید توی پنجره تا امتحانی یه کد براش بنویسید ، اما غافل از اینکه قبل از همه این کار ها باید طریقه استفاده از GTK رو بدونید .. کسانی که با GTK برنامه نوشتن میدونن که توی یه پنجره نمیشه یه widget که غیر-ظرف (منظور همون non-container) هست رو بدون اینکه قبلش یه ظرف (یا container) براش تعریف کرده باشن ، استفاده کنن . یعنی در واقع موقعیت مکانی و اندازه یه widget رو container کنترل می کنه . و اگه مثل من گیج بزنید و همینجوری یه دکمه بندازید اون وسط ، یهو میبینید کل پنجرتون شده یه دکمه ساده !!
برای container میتونید مثلا از ویدگت fixed استفاده کنید و بعد دکمه تون رو توی اون قرار بدید .
حالا حتما انتظار دارید روی دکمه دابل کلیک کنید و طبق معمول IDE براتون n خط کد بنویسه و شما فقط کد دکمتون رو وارد کنید ... نه خیر ... از این خبرا نیست ...
هر ویدگت یه سری خصوصیت یا Property داره که مثلا موقعیت مکانی ، visibility و اینا توشه و یه سری پیام یا signal داره که رویداد هایی که ممکنه برای یه ویدگت پیش بیاد رو کنترل می کنن . این سیگنال ها دو دسته هستن ، یکی سیگنال هایی که مربوط به رویداد های بین اون ویدگت و ظرفش ممکنه وجود داشته باشه و دیگری سیگنال هایی که منحصرا برای اون ویدگت وجود داره . مسلما یه سری سیگنال های پیش فرض برای همه ویدگت ها وجود داره ، مثل Clicked و Activated و ... و یه سری سیگنال های خاص هم فقط مخصوص یه ویدگته ، مثلا سیگنال RowCollapse مربوط به ویدگت Tree View هستش ، این که واضحه ...
حالا این سیگنال ها به چه درد می خورن ؟ چجوری میشه ازشون استفاده کرد؟ این طوری که هر سیگنال یه سری Handler داره ، که در واقع یه سری توابع مجازی یا virtual هستن . یعنی موقع وقوع یه سیگنال خاص ، Handler های مربوط به اون صدا زده میشه (و البته این توابع مجازی میتونن ورودی هایی هم داشته باشن) .
حالا این چه فایده نسبت به تکنولوژی های قبلی داره ؟ فایدش اینه که زمان وقوع یه سیگنال شما میتونید چندین تابع رو به جای یک تابع صدا بزنید !
خوب حالا که تقریبا یاد گرفتیم باید چی کار کنیم ، برای تمرین یه برنامه «سلام دنیا» کوچولو با هم میسازیم :
از قسمت ToolBox و از قسمت Container دنبال Fixed میگردیم و بعد درگش می کنیم روی فرممون ، بعد هم از قسمت Widgets دنبال Button می گردیم و اون رو هم روی فرممون قرار میدیم . اگه دوست داشتیم میتونیم از قسمت Properties و Button Properties لیبل دکمه رو به Hello تغییر بدیم . بعد از قسمت properties برگه Signals رو انتخاب می کنیم و روی Button Signals کلیک می کنیم ، بعد برای سیگنال Click این دکمه یه handler مثل btn1_clicked تعریف می کنیم . هم زمان که این کار رو انجام میدیم ، خود Mono یه تابع virtual با همین نام توی کلاس MainWindow (و در واقع فایل MainWindow.cs) ایجاد می کنه ، که با رفتن به قسمت Source Code میتونیم اون رو ببینیم ، اینطوری :
حالا برای نمونه میتوینم این کد رو توش بنویسیم :
کد:
System.Console.WriteLine("Hello My IranVig Friends!");
که بعد از سیو کردن و زدن کلید F5 (یا همون Project>Run) برنامه رو میتونیم اجرا کنیم . نتیجه رو هم میتونیم توی قسمت Application Output ببینیم ...
من زیاد دات نت کار نکردم ، از دوستان اینکاره خواهشمندیم ، این بسته رو بگیرن ، تست کنن . خیلی چیزا هست که میشه راجع بهش حرف زد ، مهمترینش خروجی ها و در واقع اسمبلی هایی هست که این IDE درست میکنه (که مثلا با .net framework ها ی ویندوزی سازگاری کامل رو داره یا نه ...) .
به قول ویکی پدیا که میگه «این نوشتار خرد است» ! ما هم میگیم «این تاپیک خرد است» ، لطفا با تکمیل آن خود و ما را یاری کنید !