شنبه، مرداد ۲۶، ۱۳۸۷

ساختن فرم فرزند MDI تک نمونه‌ای در دات نت

مسئله‌ای که در این پست در مورد آن صحبت می‌شود این است که چگونه می‌توان از فرمی که قرار است فرزند فرم دیگری (به صورت MDI) باشد تنها یک نمونه ساخت. مثلا اگر آن فرم وجود نداشته باشد، فرم ساخته شود و اگر وجود دارد و فعال نیست، دیگر ساخته نشود، تنها فعال شود. به عنوان نمونه‌ی کاربرد در محیط ویژوال استودیو، پنجره‌ی Properties یک پنجره‌ است که فرزند خود محیط ویژوال استودیو به حساب می‌آید. اما هیچ‌گاه نباید دو تا پنجره‌ی Properties در آن واحد در برنامه ببینیم.

۱. چگونه ببینیم فرم فرزند باز است یا خیر

فرم والد خصیصه‌ای دارد به نام MdiChildren که آرایه‌ای است از Form ها. برای این که ببینیم فرمی قبلا باز بوده در برنامه یا خیر باید این آرایه را جستجو کنیم. برای این منظور تابعی نوشتم به نام IsChildFormLoaded که نوع فرم مورد نظر را بگیرد و به دلایلی که بعدا توضیح داده خواهد شد اشاره‌گری به فرم فرزند، چنان‌چه یافت شود برمی‌گرداند.

C#
  01:   
  02:   
  03:   
  04:   
  05:   
  06:   
  07:   
  08:   
  09:   
  10:   
  11:   
  12:   
  13:   
private bool IsChildFormLoaded(Type formType, out Form frmChild)
{
    frmChild = null;
    foreach (Form frm in this.MdiChildren)
    {
        if (frm.GetType().Name == formType.Name)
        {
            frmChild = frm;
            return true;
        }
    }
    return false;
}

۲. چگونه فرم فرزند را نمایش دهیم

در حالت عادی برای نمایش یک فرم به عنوان فرزند یک فرم والد MDI چند خط زیر کافیست

C#
  1:   
  2:   
  3:   
SomeFormType frm = new SomeFormType();
frm.MdiParent = this;
frm.Show();

اما این چند خط مقصود مورد نظر ما را برآورده نمی‌کنند. برای این منظور ابتدا باید با تابعی که قبلا معرفی شد، وجود فرم بررسی شود و اگر وجود نداشت ایجاد شود و اگر وجود داشت صرفا فعال شود. برای این منظور تابع ShowOrActivateMDIChildForm به صورت زیر تعریف می‌شود:

C#
  01:   
  02:   
  03:   
  04:   
  05:   
  06:   
  07:   
  08:   
  09:   
  10:   
  11:   
  12:   
  13:   
  14:   
  15:   
  16:   
private void ShowOrActivateMDIChildForm(Type formType)
{
    Form frmChild;
    if (IsChildFormLoaded(formType, out frmChild))
    {
        frmChild.Activate();
        if (frmChild.WindowState == FormWindowState.Minimized)
            frmChild.WindowState = FormWindowState.Normal;
    }
    else
    {
        Form frm = (Form)formType.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, nullnullnew object[0]);
        frm.MdiParent = this;
        frm.Show();
    }
}

خط ۱۲ صرفا یک شی از نوع فرم مورد نظر می‌سازد. علت ظاهر غیرعادی آن این است که ما در این تابع اطلاعی از فرم نداریم بجز شی‌ءای از نوع Type برای فرم مورد نظر. وظیفه‌ی این خط فراخوانی سازنده‌ی کلاس مرتبط با آن نوع و برگرداندن شی‌ء ساخته شده از این طریق می‌باشد.

در انتها فرض کنید پس از انتخاب منویی به نام mnuShowCustomers ما قصد داریم فرمی که اسم کلاسش FormCustomers است را به همین طریق فعال بکنیم:

C#
  1:   
  2:   
  3:   
  4:   
private void mnuShowCustomers_Click(object sender, EventArgs e)
{
    ShowOrActivateMDIChildForm(typeof(FormCustomers));
}

پ.ن.:

۱. MDI مخفف Multiple Document Interface می‌باشد و به مدلی گفته می‌شود که در آن یک پنجره والد است و مابقی پنجره‌های برنامه فرزند آن پنجره‌ی والد خواهند بود و داخل مرزهای آن نمایش داده می‌شوند. در این مدل نوار منو و نوار ابزار بین والد و فرزندان به اشتراک گذاشته می‌شود. برای نمونه محیط برنامه نویسی ویژوال استودیو و برنامه‌های مایکروسافت آفیس چنینند.

 

جمعه، مرداد ۱۸، ۱۳۸۷

آرزوی پاک

پرواز دسته‌جمعی مرغابیان شاد،
بر پرنیان آبی روشن،
در صبحِ تابناکِ طلایی.

آه،
ای آرزوی پاکِ رهایی.

فریدون مشیری

پ.ن.
۱. به نظرم آمد عکس اول بیشتر با توصیف ابتدای شعر جور در می‌آید و عکس دوم بیشتر با ... رهایی.
۲. دوست داشتم انتهای شعر را به قالب زیر می‌نوشتم:

آاااااااااه،
ای آرزویِ
            پاکِ
                 رهایی.

]و مقدار زیادی سکوت[

یکشنبه، مرداد ۱۳، ۱۳۸۷

چگونه بوت لودر سیستم‌عامل خود را ترمیم کنیم

این راهنما هنگامی به کار می‌آید که شما به دلایلی، دیگر قادر به بوت کردن به سیستم عامل کامپیوتر خود نمی‌باشید. مثلا هنگامی که سیستم‌عامل قدیمی‌تری را بعد از سیستم‌عامل جدیدتری نصب کنید، یا هنگامی که سیستم عاملی که وظیفه‌ی نمایش دادن منوی بوت کردن به سیستم‌عامل‌های دیگر را بر عهده داشته را به کلی از بین برده باشید.

ترمیم بوت لودر ویندوز XP

با دیسک نصب ویندوز بالا بیایید، وارد setup شوید و گزینه‌ی repair را انتخاب کنید. در کنسولی که باز می‌شود (recovery console) دستورات زیر را وارد کنید:

  1:   
  2:   
FixMBR
FixBoot

دستور FixMBR کل Master Boot Record را پاک می‌کند و با مقادیر اولیه در BIOS دوباره پر می‌کند. بنابراین با این دستور تمامی بوت‌لودرهایی که قبلا نصب شده بودند از بین می‌روند.

دستور FixBoot موجب نصب بوت‌لودر ویندوز (NTLDR) می‌شود. بنابراین ترتیب استفاده از این دو دستور مهم است.

ترمیم بوت‌لودر ویندوز Vista

با دیسک نصب ویندوز بالا بیایید، وارد setup شوید و گزینه‌ی repair را انتخاب کنید، در پنجره‌ی جدید آخرین گزینه را انتخاب کنید تا برنامه یک کنسول در اختیار شما قرار دهد. سپس دستور زیر را وارد کنید:

  1:   
BootRec.exe /FixMbr /FixBoot

توجه کنید که دستوراتی که در مورد ویندوز XP گفته شد، در Vista دیگر وجود ندارند.

ترمیم بوت‌لودر Grub در لینوکس

برای این مرحله باید یک محیط لینوکسی بالا بیاورید و پارتیشنی که /boot لینوکس معیوب در آن قرار دارد را در جایی mount کنید. برای انجام این کار چند راه وجود دارد. اکثر دیسک‌های نصب کننده‌ی لینوکس گزینه‌ی repair دارند که با انتخاب آن وارد یک محیط لینوکسی می‌شوید که خودش پارتیشن‌های لینوکس معیوب را mount کرده است. راه دیگر استفاده از دیسک‌های لینوکس Live هست.

فرض کنید پارتیشن root لینوکس (یا /boot چنان‌چه پارتیشن‌اش جدا باشد) را mount کرده باشیم در /mnt/oldlinux . با دستور زیر root را به مسیر ذکر شده تغییر می‌دهیم:

  1:   
  2:   
  3:   
[sudo] chroot /mnt/oldlinux
# use sudo in debian based linuxes
# use su -c  or  su -  in red-hat based linuxes if needed

سپس دستورات زیر را اجرا می‌کنیم:

  1:   
  2:   
  3:   
  4:   
  5:   
  6:   
  7:   
  8:   
  9:   
[sudo] grub
# opens a grub shell
find /boot/grub/stage1
# returns the partition location in the form of (hd?, ?)
root (hd??)
# replace question marks with the exact values returend by the previous statement
setup (hd0)
# installs the Master Boot Record
quit

در دستورات بالا عباراتی که بعد از علامت #‌ می‌آیند توضیح هستند.

توجه کنید که دستورات بالا برای ترمیم بوت‌لودری است که زمانی وجود داشته اما اکنون به دلایلی از بین رفته است. برای از نو ساختن یا سفارشی کردن بوت لودر لینوکس مراحل بسیار مفصل‌تر، یا بسته به کاری که می‌خواهید انجام دهید ممکن است کاملا متفاوت باشد.