Visual Studio 2010 و کارت گرافیکی NVIDIA OPTIMUS

20 04 2011

احتمالا برای برخی از دوستان برنامه نویس که روی سیستم هاشون Visual Studio 2010 نصب هستش و از کارت گرافیکی NVidia OPTIMUS بهره میبرند، پس از Update کردن درایور کارت گرافیکی، Visual Studio هنگام اجرا Crash کرده به صورتی که با بردن ماوس بر روی اکثر قسمت ها و منوی های نرم افزار نمیشه بطور عادی از آنها استفاده کرده حتی زمانی که پروژه ای باز می کنید قلم ها هنگام Scroll دادن کاملا به هم ریخته میشوند. این یکی از مشکلاتی بود که من رو هم چندین وقت درگیر خودش کرد، تا در نهایت موفق به پیدا کردن راهی برای حل این مشکل شدم.

تصویر بالا نمایی از نرم افزار رو نشون میده که هنگام اجرا شدن Freeze شده

راه حل : شما می توانید برای حل این مشکل از منوی Tools گزینه ی Option را انتخاب کرده سپس از برگه Environment روی General رفته و در قسمت Visual Experience تیک Use hardware graphics acceleration if available رو بردارید. پس از انجام این کار خواهید دید که محیط Visual Studio به حالت عادی قبلی برخواهد گشت.

Advertisements




آشنایی با افزونه های Regex Editor و DPack

8 06 2010

* – افزونه Regex Editor :

همانطور که میدونید کار با Regular Expression به دلیل Syntax ی که داره کار آسونی نیست. تا به حال ابزار های زیادی برای کار با Regex تولید شده که هر کدام ویژگی های خاص خودشان را دارند. این افزونه امکانات جالبی برای برنامه نویسان در حین کد نویسی ارائه میده که عباراتند از :

1- کد نویسی :

در کد نویسی زمانی که شما شیء ای از کلاس Regex ایجاد می کنید، این افزونه به صورت اتوماتیک فرم مربوط به Regex Editor را نشان میده تا برنامه نویس بتونه با استفاده از امکانات موجود الگوی مورد نظر رو طراحی کرده، تست کنه و در صورت گرفتن نتیجه مطلوب این الگوی رو در کد با تایید پنجره ویرایش استفاده کنه. به نظر بنده این یکی از بهترین ویژگی های این ابزار هستش چون برنامه نویس رو درگیر نرم افزار های و ابزار های دیگری نمیکنه.

ویرایشگر افزونه Regex Editor

ویرایشگر افزونه Regex Editor

2- امکان تست عبارت :

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

3- امکان ذخیره سازی الگوها و استفاده آنها در آینده :

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

برای دانلود این افزونه می توانید از آیتم Extension Manager منوی ابزار محیط ویژوال استودیو استفاده کنید.

برای دانلود مستقیم این افزونه می توانید از این لینک و برای دانلود سورس آن از این لینک استفاده نمایید.

*- افزونه DPack :

این افزونه یکی از محبوب ترین ابزار های ارائه شده برای محیط توسعه ویژوال استودیو می باشد. و شامل امکاناتی برای برنامه نویسان در راستای مدیریت پروژه، نگهداری و دسترسی آسان به Object های موجود در پروژه می باشد. از ویژگی های اصلی این نرم افزار می توان به موارد ذیل اشاره کرد:

فرم CodeBrowser

فرم CodeBrowser

1- Code Browser :

شاید برای شما هم پیش آمده باشه که ای کاش ویژوال استودیو امکانی داشت که فقط دنبال چیزی که من می خوام بگرده و پیدا کنه. خوب شما می گید که ویژوال استودیو Seach داره با اون میشه آیتم مورد نظر رو مورد جستجو قرار داد. خوب این اون چیزی نیست که من دنبالش هستم، من می خوام دنبال کلاس، متد، فیلد و … بگردم که تو Solution تعریف شده، نه جایی که مورد استفاده قرار گرفته، Search ی که ویژوال استودیو ارائه میده واقعا وقت گیره تا تعریف متد یا ایتم مورد نظر رو پیدا کنه، من می خوام امکانی باشه که با تایپ نام خود کلاس که با Enter کردن بر روی آن من رو به کلاس مورد جستجو ببره. در اولین نگاه میگید که ای بابا خوب Solution Explorer را برای همین گذاشتن ولی بهتر می دونید که زمانی که بر روی یک پروژه ی واقعا بزرگ کار میکنید، حداقل برای من سخت که دائما توی فولدر های Solution دنبال آیتم مورد نظر بگردم.

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

2- آمار گیری از پروژه :

امکان دیگر اینه که می تونید به راحتی با استفاده از Solution Statistics آمار کلی از تعداد پروژه های موجود در Solution، تعداد فایل های پروژه، تعداد سطر کدهای نوشته شده، تعداد کامنت های موجود و … را ببینید.

3- پشتیبان گیری :

یکی دیگر از ویژگی های این افزونه فراهم کردن امکان پشتیبان گیری از Solution با یک کلیک است. به راحتی با انتخاب Solution Backup می توانید از پروژه ی مورد نظر در مسیر پیش فرض (مسیر Solution)که قابل تغییر در فرمت های مختلف است پشتیبان تهیه فرمایید.

فرم SolutionBrowser

فرم SolutionBrowser

4- Framework Browser :

امکان دیگری که می توان نام برد Framework Browser می باشد. شما با تایپ نام Object مورد نظر و انتخاب آن در صورت اینکه Reference آن در پروژه موجود نباشد ابتدا آن را اضافه کرده و در Class فعال Namespace مناسب آنرا Include می کند. در صورت استفاده از این افزونه دیگر نیازی نیست به استفاده Object Explorer و Add Reference ویژوال استادیو نمی باشد.

برای دانلود این افزونه می توانید از آیتم Extension Manager منوی ابزار محیط ویژوال استودیو استفاده کنید.

برای دانلود مستقیم این افزونه می توانید از این لینک استفاده نمایید.





Crystal Report و MSDN در ویژوال استادیو 2010

7 06 2010

همانطور که شاهدید در Visual Studio 2010 اثری از Crystal Report Basic و Document Explorer وجود ندارد. بنده ابتدا در نصب متوجه این موضوع نشدم، چون دنبال ویژگی های جدید می گشتم و انتظار اینرا نداشتم که از ویژگی های موجود تا آن زمان چیزی کسر شود !!!!.  تا اینکه مجبور شدم در پروژه ای از Crystal Report استفاده کنم.

زمانی که شما می خواهید فایل CrystalReport را به پروژه بیفزایید با چنین منظره ای مواجه خواهید شد :

راهنمای نصب و دانلود Crystal Report

Crystal Report دیگر بر روی Visual Studio نخواهد بود و باید مستقیما از سایت Business Object دانلود شود.

مورد بعدی این است که دیگر MSDN بر روی Document Explorer سرو نخواهد شد در عوض بر روی هر مرورگری قابل مشاهده است. ظاهرا مایکروسافت شدیدا علاقمند این موضوع است که دیگران برای محصولات وی Extension یا نرم افزار تولید نمایند البته اگرهدف این است خیلی پیش از اینها به خواسته ی خود رسیده است. پس سوال اینجاست که چرا ؟!!! بعضی وقتها که فکر میکنم واقعا سر از کار سیاست های مایکروسافت در نمیارم. چرا ؟

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

برای دانلود مستقیم Crystal Report برای Visual Studio 2010 اینجا رو کلیک کنید.

برای اینکه از قید و بند استفاده از مرورگر در هنگام کار با MSDN رها شوید می توانید از ابزار H3Viewer که از اینجا قابل دانلود است استفاده نمایید.

دوست و همکار عزیزم سالار طریقه نصب و استفاده از این ابزار را در این پست توضیح کامل داده است.

موفق باشید.





نرم افزار مترجم با استفاده از Google Translator

7 06 2010

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

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

از این رو شروع به نوشتن این برنامه کردم که توضیحات مفصل آن در ادامه خواهم داد.

من در این نرم افزار از یک کلاس Abstract به نام Translator استفاده کردم چرا Abstract چون اگه در آینده قرار باشه سرویس های دیگری غیر از Google Translator رو هم پشتیبانی باید اعضای این کلاس Override بشن. کلاسی که من برای ترجمه ی متون ازش استفاده می کنم GoogleTranslator هستش که همونطور که گفتم باید از کلاس Translator ارث ببره.

خوب در بالا هم گفتم که این نرم افزار ابتدا فایل رو باز میکنه و سپس فایل متنی رو به تکه های کوچک تقسیم می کنه و سپس هر chunk رو برای ترجمه کردن به کلاس GoogleTranslator میده .

نکته : چرا فایل رو به تکه تکه می کنیم، ببینید فرمت URL ای که من ازش استفاده میکنم با اون چیزی که شما در Browser مشاهده می کنید فوق می کنه. شما اگه از فرمتی http://translate.google.com/#en|fa|book استفاده کنید، این URL ای هستش که این سرویس از طریق Callback هنگام ترجمه تولید میکنه، اگه در این حالت شما از Firebug استفاده کنید تا ID تگ Result ی که متن ترجمه شده در آن قرار دارد را ببینید به راحتی قابل تشخیص خواهد بود، حال چنانچه این آدرس را از طریق HttpRequest بفرستید خواهید دید که Response برگشتی اصلا شامل چنین تگی نخواهد بود. و اما جواب که چرا فایل رو به خوب همونطور که می دونید در دات نت آدرس از لحاظ تعداد کاراکتر محدودیت داره و اگه بیشتر از اون محدوده ارسال بشه در Response پیغام خطا میده بنابراین چاره ای نیست جز اینکه فایل رو به chunk های کوچکتر تقسیم کنیم.

* – نحوه خواندن و ذخیره کردن در  Queue با استفاده از تابع ReadFile :

public Queue ReadFile()
{
StreamReader fileReader =
new StreamReader(_inputFile, Encoding.UTF8);
if (BeforeReadFile != null)
BeforeReadFile(this, null);
string val;
char[] buffer = new char[128];
lock (this)
{
while (fileReader.Peek() >= 0)
{
fileReader.Read(buffer, 0, 128);
if (char.IsWhiteSpace(buffer[buffer.Length - 1]))
{
val = new String(buffer);
_linesQueue.Enqueue(val);
buffer = new char[128];
}
else
{
for (int i = buffer.Length; i >= 0; i--)
{
if (char.IsWhiteSpace(buffer[i - 1]))
{
val = new String(buffer).Substring(0, i);
_linesQueue.Enqueue(val);
buffer = new char[128];
break;
}
}
}
}
}
if (AfterReadFile != null)
AfterReadFile(this, null);
return _linesQueue;
}

این تابعیست که وضیفه خواندن فایل رو بر عهده داره، چند نکته وجود داره که باید رعایت بشن. بافری که من برای خواندن از فایل اختصاص دادم 128 کاراکتر است، این بدین معنی هستش که زمان خواندن از فایل 128 کاراکتر باید از فایل خونده بشه. خوب همونطور که میبینید بنده برای اینکه مطمئن بشم که آخرین کاراکتری که در بافر قرار داده شده وسط یک کلمه نیست بنده اون رو با متد IsWhiteSpace بررسی کردم. خوب اگر کاراکتر موجود در خانه آخر بافر کاراکتر فضای خالی باشه مشکلی نیست می فهمیم که مشکلی وجود نداره و می تونیم که Chunk Queue اضافه کنیم. حال اگر کاراکتری غیر از فضای خالی بود چه ؟ باید بافر رو به صورت نزولی از آخر به اول بررسی کنید اگر کاراکتر فضای خالی دیدید آنرا به Queue اضافه کنید.

نکته : در انتخاب اندازه بافر دقت کنید چون این عمل تاثیر مستقیم بر روی طول URL داره که محدودیت خاص خودش رو داره.

*- پاس کردن و ترجمه Chunk ها با استفاده از کلاس GoogleTranslator :

قدم بعدی این هستش که تکه های متنی که ازفایل خونده شده رو با استفاده از متد Translate کلاس Translator ترجمه کنیم. همانطور که در تابع ReadFile دیدید مقدار بازگشتی این تابع یک Queue هستش. بنابراین باید هر آیتم رو از این صف به تابع Translate پاس کنیم.


public override string TranslateText(string content)
{
string url = CreateWebURL(content);
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(url);
webRequest.KeepAlive = false;
webRequest.AutomaticDecompression =
DecompressionMethods.GZip | DecompressionMethods.Deflate;
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
// Get response stream and download all raw html
Stream resStream = webResponse.GetResponseStream();
StreamReader streamReader = new StreamReader(resStream, Encoding.UTF8);
// ---------------------------------------------
string html = streamReader.ReadToEnd();
return ParseContent(html);
}

خوب عملکرد این تابع خیلی ساده است، در این حد که متن را که به عنوان ورودی به تابع پاس شده است را با استفاده از HttpWebRequest و HttpWebResponse ترجمه کرده و با استفاده از تابع GetResponseStream محتویات را که شامل Html می باشد را خوانده و پس از Parse  کردن آن مقدار متن ترجمه شده را بازگرداند.

*- تابع ParseContent :

public override string ParseContent(string html)
{
return HtmlParser.ParseHtml(html);
}

*- تابع  ParseContent از کلاس HtmlParser :


internal static string ParseHtml(string html)
{
int identifierIndex = -1;
int firstSpanIndex = -1;
int spanCloseIndex = -1;
int spanCloseTagIndex = -1;
// Remove all html and text from start to index of result box
identifierIndex = html.IndexOf(ResultBoxIdentifier);
html = html.Remove(0, identifierIndex);
// ----------------------------------------------------------
// Delete all text to index of
firstSpanIndex = html.IndexOf(FirstSpanIdentifier);
html = html.Remove(0, firstSpanIndex);
// -------------------------------------
// -------------------------------------
spanCloseIndex = html.IndexOf(SpanCloseIdentifier);
html = html.Remove(0, spanCloseIndex + 1);
// -------------------------------------
// Delete all remain html data from end of the translated texts
spanCloseTagIndex = html.IndexOf(SpanCloseTagIdentifier);
html = html.Remove(spanCloseTagIndex, html.Length - spanCloseTagIndex);
// ------------------------------------------------------------
return html.Replace("'", "'").Replace("
", "\n");
}

وظیفه ی این دو تابع بالا اینه که تا زمان رسیدن به تگ span با id=»result_box» و بعد از متن ترجمه شده بقیه Html ای که از طریق Response دریافت شده رو حذف کرده و در نهابت متن ترجمه شده را برگردانند.

برای دانلود سورس اینجا رو کلیک کنید.

موفق باشید





Hide Your Processes In Task Manager

12 12 2008

سلام مجدد خدمت دوستان، دیروز تو شرکت بحث از ویروس و نوشتن ویروس بود یکی از دوستان عزیزم به اسم سالار به موردی اشاره کرد که توجه مو جلب کرد اونم این بود که برخی از ویروسها اسم خودشونو از تو لیست Task Manager حذف یا اصطلاحا Hidden می کنن. نکته جالبی بود علاقه مند شدم که چطور ؟ دیشب نشستم و یک نمونه برنامه کوچیک نوشتم، که یک تابعی رو صدا میکنه و پارامتر ورودی تابع نام process ای که قرار به اصطلاح مخفی بشه. این بود که گفتم نمونه کد رو بزارم تا شما دوستان نیز بتونین ازش استفاده کنین. توضیحی در مورد نحوه عملکرد کد نمی دم چون comment برای هر بخش که مربوط به API میشه گذاشتم.

داشت یادم میرفت این نمونه کد در ویستا کار نمی کنه. در ضمن اگه در حین اجرا Exception پیش اومد که نتونستین رفع کنین یا سوالی در این رابطه دارین بپرسین و بگین تا حلش کنیم. 🙂

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


Int32 hwndParent = FindWindow(null, "Windows Task Manager");
Int32 hwndDialog = 0;
Int32 hwndProcessList = 0;
Int32 hwndProcessHeader = 0;


//-----/ Get menu task manager handle
Int32 hwndMenu = GetMenu(hwndParent);
//-----/ Get handle of view menu
Int32 hwndSubMenu = GetSubMenu(hwndMenu, 2);
//-----/ Get sub menu handle for update menu
Int32 hwndSubSubMenu = GetSubMenu(hwndSubMenu, 1);
//-----/ Get refresh item id
Int32 hwndRefreshItemID = GetMenuItemID(hwndSubMenu, 0);
//----/ Get high update item id
Int32 hwndHighUpdateItemID = GetMenuItemID(hwndSubSubMenu, 0);
//----/ Get normal update item id
Int32 hwndNormalUpdateItemID = GetMenuItemID(hwndSubSubMenu, 1);
//----/ Get low update item id
Int32 hwndLowUpdateItemID = GetMenuItemID(hwndSubSubMenu, 2);
//----/ Get pause update item id
Int32 hwndPauseUpdateItemID = GetMenuItemID(hwndSubSubMenu, 3);


if (processStatus)
{
for (int i = 0; i < 7; i++)
{
hwndDialog = FindWindowEx(hwndParent, hwndDialog, null, null);
if (hwndProcessList == 0) // Get process list view handle
hwndProcessList = FindWindowEx(hwndDialog, 0, "SysListView32", "Processes");
if (hwndProcessHeader == 0) // Get listview columns handle
hwndProcessHeader = FindWindowEx(hwndProcessList, 0, "SysHeader32", null);
}


//-----/ Click "paused update speed", so we can do it for the taskmgr
SendMessage(hwndParent, WM_COMMAND, hwndPauseUpdateItemID, 0);
//-----/ disable refresh now item
EnableMenuItem(hwndMenu, hwndRefreshItemID, MF_ENABLE);
//-----/ disable high update speed
EnableMenuItem(hwndMenu, hwndHighUpdateItemID, MF_GRAYED);
//-----/ disable normal update speed
EnableMenuItem(hwndMenu, hwndNormalUpdateItemID, MF_GRAYED);
//-----/ disable low update speed
EnableMenuItem(hwndMenu, hwndLowUpdateItemID, MF_GRAYED);
//-----/ disable paused update speed
EnableMenuItem(hwndMenu, hwndPauseUpdateItemID, MF_GRAYED);


//-----/ Disable the process header
EnableWindow(hwndProcessHeader, false);
//-----/ Sort process
SendMessage(hwndProcessList, LVM_SORTITEMS, 0, 0);
Int32 processIndex = GetProcessIndexByName(processName);
//-----/ disables drawing in the specified window
LockWindowUpdate(hwndProcessList);
//-----/ AutoClick refresh to update
SendMessage(hwndParent, WM_COMMAND, hwndRefreshItemID, 0);
//-----/ Delete process
SendMessage(hwndProcessList, LVM_DELETEITEM, processIndex - 1, 0);
//-----/ Unlock window - enable drawing in the specified window
LockWindowUpdate(0);





Microsoft Certification

10 12 2008

بنده یکی از افرادی هستم که اعتقاد دارم ایران جایی برای یک برنامه نویس حرفه ای نیست، وقتی از یک برنامه نویس یاد میشه مردم میگن اه مگه چیه اینم شد شغل. کلا ذهن مردم نسبت به کارهای نرم افزاری خرابه چرا ؟ یکی ازدلایلش شاید Copyright باشه. در طرف دیگه در USA در سال 2007 برنامه نویسی بهترین شغل انتخاب شده و شغل وکالت پر درآمد ترین شغل ها. بنابراین تصمیم گرفتم برای دوستان برنامه نویسم که قصد شرکت در آزمون برای کسب مدرک MCPD (Microsoft Certification Professional Developer)  مایکروسافت رو دارن منابع مرتبط رو معرفی کنم.تا بتونن با در دست داشتن یک مدرک بین المللی معتبر حداقل امنیت شغلی خودشون رو نه در ایران بلکه در خارج از کشور تامین کنند. ( خوده بنده نیز به دنبال همین هدف هستم )سعی میکنم در پست های بعدی تا اونجایی که امکانش هست لینک داونلود این منابع رو براتون بذارم.

سبز = عنوان آزمون- آبی = منابع متنی مرتبط با آزمون

MCTS ( Microsoft Certification Technology Specialist ) – MCPD Requirement Exams:

1- Exam 70–526 TS Microsoft .NET Framework 2.0 – Windows-Based Client Development

1-1- Microsoft .NET Framework 2.0 Windows-Based Client

1-2- Programming Microsoft ADO.NET 2.0 Core Reference

1-3- Programming Microsoft Visual C# 2005 The Language OR Microsoft Visual Basic 2005 The Language

2- Exam 70–536 TS Microsoft .NET Framework 2.0 – Application Development Foundation

2-1- Microsoft .NET Framework 2.0 Fundation

2-2- Programming Microsoft Visual C# 2005 The Language OR Microsoft Visual Basic 2005 The Language

3- Exam 70–529 TS Microsoft .NET Framework 2.0 – Distributed Application Development

3-1- Microsoft .NET Framework 2.0 – Distributed Application Development

3-2- Programming Microsoft Visual C# 2005 The Language OR Microsoft Visual Basic 2005 The Language

MCPD Exams :

1- Exam 70–548 PRO Designing and Developing Windows Applications by Using the Microsoft .NET Framework

1-1 CLR Via C# 2Nd Edition

1-2- Debugging, Testing, and Tuning Microsoft .NET 2.0 Applications

1-3- Designing and Developing Windows Applications by Using the Microsoft .NET Framework

2- Exam 70-505: Microsoft .NET Framework 3.5, Windows Forms Application Development

2-1- Microsoft MCTS Self-Paced Training Kit

2-2- Microsoft .NET Framework 2.0 Windows-Based Client Development

2-3- Debugging, Testing, and Tuning Microsoft .NET 2.0 Applications

2-4- Programming Microsoft ADO.NET 2.0 Core Reference

More Information: http://www.microsoft.com/learning/mcp/certifications.mspx





Make Your UI More Attractive

9 12 2008

چند روز پیش داشتم در مورد UI نرم افزار هایی که داریم طراحی و پیاده سازی می کنیم فکر می کردم با خودم گفتم چرا به جای استفاده از text معمولی در help برنامه ها از امکانات جذاب دیگه ای که در اختیار داریم استفاده نکنیم. یکی از این امکاناتی که نرم افزار رو کاربر پسند تر یا به اصطلاح ما برنامه نویسا User Friendly  می کنه، استفاده از AxAgent ویندوز هستش که یک Activex که به پروژه از طریق AddReference اضافه میشه و میشه ازش استفاده کرد. این Activex چند تا کاراکتر کارتونی در اختیار شما قرار میده که می تونین استفاده های گوناگونی از این کاراکتر های زیبا و جذاب بکنبن. اجازه بدین بقیه کار رو با مثالی ادامه بدیم، شما بعد از اضافه کردن Activex AxAgent که از تب COM پنجره Add Reference باید دو تا متغییر در دامنه کلاستون ( بسته به نوع استفاده )ایجاد کنید. طبق مثال زیر:

private AxAgentObjects.AxAgent agent;
private AgentObjects.IAgentCtlCharacter characterController;

متغییر agent برای load کردن کاراکتر مورد نظر و متغییر characterController برای کنترل کاراکتر load شده استفاده میشه، خوب حالا نوبت میرسه به استفاده از کاراکتر هامون اولین کاری که باید کرد اینه که کاراکتر هامونو Load کنیم و سپس با استفاده از کلاس IAgentCtlCharacter کاراکتر مورد نظرمون رو کنترل کنیم. طبق کد های زیر:

try
{
this.agent.Characters.Load("merlin" , "merlin.acs");
this.characterController= this.axAgent1.Characters["merlin"];
this.characterController.Show(null);
this.characterController.MoveTo(800, 600, null);
this.characterController.Play("Explain");
this.characterController.Speak("Try codeprojects.wordpress.com to get more tricks ... LOL", null);
}
catch
{
// Report codeprojects.wordpress.com OR Character not found
}

معمولا نباید نگرانی در مورد Exception پیدا نشدن کاراکتر ها داشت چون ویندوز هنگام نصب چندتاشون رو به صورت پیش فرض نصب می کنه.

امیدوارم به دردتون خورده باشه.