ایجاد کادرهای محاوره (دیالوگ باکس) در ASP.NET دلفی

تمام چیزهای مورد نیازشما در MonoSoftWare.web.Dialogs  بطور رایگان در اختیارتان قرار داده شده است.
کادر نمایش پیام ، کادر ورود اطلاعات ، کادر اعلام خطا ...؟؟!!!
حتما در طول سالها برنامه نویسی در دنیار win32 عادت کرده اید که با یک خط دستور پیامی را نمایش داده و از دستوراتی همچون showmessage و یا MessageDlg استفاده کنید. کاربرد آنها در برنامه نویسی چندان متداول و عادی بوده که آنها را جدی نمی گرفته ایم. اما اگر در تمام مجموعه وسیع .NET به دنبال یک دستور مشابه بگردید هیچ چیزی پیدا نخواهید کرد!!!.
ما به حدی در برنامه های متعارف از این پنجره ها استفاده کرده ایم که اهمیت آنها را از یاد برده ایم. از دید برنامه نویسی فراخوانی این کادر ها و بدست آوردن اطلاعات برگشتی از سوی آنها امری بسیار ساده می باشد. هر چند ساختار و تکنولوژی وب پیچیده تر از این بحثها بوده و اغلب برنامه نویس ها مجبورمی شوند تا ساعتها وقت خود را صرف نوشتن کدهای سمت کاربر نموده و به نوعی عملیات مشابه را شبیه سازی کنند.
در برنامه نویسی وب شما باید از مدلهای سمت سرور تبعیت کنید و لازمه اینکار هم پردازش همه اطلاعات توسط سرور می باشد. با توضیحاتی که داده شد باید اطلاعاتی که توسط کاربر وارد کادرهای ورود اطلاعات می شود توسط عمل POSTBACK یا ارسال پاسخ به  سرور فرستاده شده ( چرخه برگشت به سرور ) تا در نتیجه بتوانید آنچه وارد شده را ارزیابی کنید.
اما طبیعی است که در برنامه نویسی وب ، برنامه نویس تلاش کند تا کمترین مراجعه به سرور بویژه با روش پست بک را داشته باشد و به این ترتیب ترافیک سرور کاهش داده شده و زمان تلف شده کاربر نیز حداقل ممکن باشد.

مشکلی که باید در نظر گرفته شود:
تصور کنیدشما یک کادر ورود اطلاعات روی فرم خود دارید. کاربر اطلاعاتی را وارد می کند. و کلید تایید را فشار می دهد. در نتیجه یک پست بک رخ داده و شما باید اطلاعات را بررسی کرده و تصمیم بگیرید اطلاعات اشتباه بوده و به او اطلاع دهید.
خب می توانید یک برچسب خاص را روی فرم قرار داده و آنرا مخفی سازید و در زمان پست بک آنرا با رنگ قرمز آشکار کنید و بنویسید " اطلاعات اشتباه است" اما آیا بهتر نیست که یک پنجره کوچک در همان لحظه نمودار شده واعلام کند که چنین خطائی رخ داده است؟
حتما شما هم با این روش موافق هستید ولی مشکل اینجاست که ASP.NET چنین قابلیتی را در اختیار شما قرار نمی دهد.
یک راه حل آنست که چند ساعت وقت بگذارید و با روشهای مختلف کد نویسی آنچه نیاز دارید آماده کنید
روش دیگر استفاده از کامپوننت های آماده موجود می باشد.

راه حل قابل استفاده:
Mono Dialogs از شرکت Mono-SoftWare.com  چنین راه حلی برای شما ست. این کامپوننت ASP.NET شما را از دردسر کدهای برنامه نویسی برای انواع ماشینها مختلف کاربر و کادر های زشت نما نجات خواهد داد. و از همه مهمتر آنکه این ابزار رایگان است.
البته استفاده از کد نویسی سمت کاربر در این فصلهای مقدماتی و یا بکار گیری کامپوننت های شخص ثالث در این مراحل اندکی زود است اما خیلی هم دغدغه نداشته باشید زیرا برای شما چندان نامانوس نمی باشد.

MonoSoftWare.Web.Dialogs :
 برای دانلود کردن مجموع ابزار به این آدرس مراجعه کنید:

http://www.mono-software.com/ DesktopDefault.aspx%3Ftabid=244%26tabindex=3
این مجموعه تمام نیازهای شما به کادر های نمایش پیام ، نمایش خطا ، محاوره ها ، کنترلهای ورود اطلاعات و غیره را شامل می شود.
پس از نصب برنامه لازم است تا فایل Read me first.txt را که در مسیر نصب قراردارد را باز کرده و مطالعه کنید. این فایل حاوی چند نکته مهم بوده که برای استفاده صحیح از ابزار نصبی رعایت آنها لازم است. ما بطور اجمال آنها را بررسی میکنیم.

یک نمونه بکارگیری ابزار منودیالوگ ها:
در صورتیکه تا اینجا روال برنامه را دنبال کرده باشید یک برنامه کاربردی به نام DelphiASPNetTest خواهید داشت. آنرا باز کنید و یا اینکه یک پروژه جدید تعریف کنید. همچنین میتوانید از یک برنامه نمونه که داخل پکیج برنامه منوسافت ویر قرار دارد نیز استفاده کنید.
پس از باز کردن برنامه DelphiASPNetTest یک فرم جدید به برنامه اضافه کنید  و نام آنرا  MonoDialogs.aspx بگذارید.

روش افزودن یک صفحه جدید ASP.NET   به برنامه موجود:
برای اضافه کردن صفحه جدید به برنامه خود ابتدا file بعد New و بعد    Others را انتخاب کنید . در پنجره New Items گزینه Delphi Asp Files را انتخاب کنید ( زیر شاخه ای از  Delphi ASP Projects ) حال گزینه ASP.NET Page را انتخاب کرده و کلید OK  را فشار دهید.

 افزودن ارجاع به MonoSoftware.Web.Dialogs
از آنجائیکه ابزار بکار گرفته شده نوعی ابزار شخص ثالث می باشد، برای استفاده از آنها بایدابتدا یک ارجاع به آنها در برنامه ایجاد کنید. لذا داخل پنجره مدیر پروژه گره مربوط به زیر شاخه ارجاعات References را بسط داده و روی آن راست کلیک کرده و گزینه Add Reference را کلیک کنید.

پنجره افزودن عطف نمایش داده شده و طی آن می توانید موقعیت  MonoSoftware.Web.Dialogs را تعیین نموده و دکمه افزودن عطف ( Add Reference  ) را زده سپس کلید OK  را بزنید.
حال عطف اضافه شده را پیدا کرده و با راست کلیک روی آن کنار گزینه Copy Local تیک بزنید.

دست آخر آنچنانکه در فایل راهنما ذکر شده شما باید :
?   فایل MonoDialigPage.aspx را ( که در مسیر نصب برنامه قرار داده شده ) به مسیر ریشه پوشه مجازی برنامه خود کپی کنید. البته توجه داشته باشید که لازم نیست این فایل را به برنامه  خود ملحق کنید
?     کل پوشه MonoResources را به مسیر ریشه IIS یعنی IIS:\inetpub\wwwroot کپی کنید.
?     فایل MonoWCLDialogs.css را که در مسیر CSS Skins مسیر نصب قرار دارد را به مسیر ریشه برنامه کاربردی خود کپی کنید.

بازگشت به پروژه:
حال یک ListBox و دو دکمه از گروه Web Controls به صفحه خود اضافه کنید نام یک دکمه را " افزودن گزینه" جدید و دیگری را "حذف گزینه" گذاشته نام لیست باکس نیاز به تغییر ندارد.

هدف این برنامه آنست که کاربر بتواند گزینه های جدید متن را به لیست افزوده و یا حذف کند.ما از InputBox منودیالوگ برای ورود یک رشته استفاده کرده و بعد برای حذف متن از لیست هم یک پنجره پیام ایجاد نموده و نمایش می دهیم.
ابتدا باید عبارت  MonoSoftware.Web.Dialogs را به لیست uses در قسمت مربوطه به بالای کد پنهان فرم وب خود وارد کنیم.
برای آشنائی بیشتر با کادرهای محاوره و پارامترهای مورد استفاده توسط هرکدام بهتر است به مستنداتی که به همراه برنامه ارائه شده است مراجعه و آنها را مطالعه کنید.

در قدم بعدی  کدهای زیر را به تابع Page_load  اضافه کنید:
procedure TMonoDialogs.Page_Load (sender: System.Object;e: System.EventArgs);
begin
if not Page.IsPostBack then //only first time
begin    ListBox1.Items.Add('http://delphi.about.com');    ListBox1.Items.Add('http://aspxDelphi.net');
ListBox1.Items.Add('http://www.mono-software.com');
end;
NewItem := Dialogs.InputBox(AddItemButton,
'Add an item to ListBox','New item name', 'A new item');
DoRemoveItem := Dialogs.MessageDlg( RemoveItemButton,'Are you sure you want to remove the selected item from the list?' + #13#10 + 'Select [All] to remove all Items!', 'Removing an item',
      TDlgType.mtConfirmation,
      TMsgDlgBtn.mbAll or
      TMsgDlgBtn.mbYes or
      TMsgDlgBtn.mbCancel,
      False);
end;

اجازه بدهید ببینیم در هندلر رویداد page_load چه می گذرد :
ابتدا چند گزینه را به لیست اضافه نموده و اطمینان پیدا می کنیم که این عمل فقط یکبار انجام می شود که آنهم تنها دفعه اول بارگذاری می باشد. به این ترتیب در  پست بک های بعدی این بخش کد اجرا نخواهد شد  :
( if not page.IsPostBack … )

توجه:
شما باید دو متغییر محلی داخل یونیت برای نگهداری مقادیر نتیجه بدست آمده از InputBox و MessageDlg تعریف کنید:
...
implementation
var
  NewItem: string;
  DoRemoveItem : TMsgDlgResult;
...
در قدم بعدی ما یک InputBox اضافه کرده تا برای پاسخ به AddItemButton استفاده شود. هر وقت کاربر کلیدی را فشار دهد ، یک کادر ورود اطلاعات نمایش داده شده و امکان دریافت اطلاعات را فراهم می کند. اگر کاربر کلید انصراف را فشار دهد هیچ اتفاقی رخ نمی دهد ( پست بک رخ نمی دهد ) . اما اگر کلید OK را فشار دهد عمل پست بک رخ داده و کد موجود در کلید AssItemButton اجرا می گردد. متغییر NewItem محتوای متن تایپ شده کاربر را نگهداری می کند.

procedure TMonoDialogs.AddItemButton_Click
(sender: System.Object; e: System.EventArgs);
begin
  ListBox1.Items.Add(NewItem);
end;

برای اینکه به کاربر اجازه بدهیم گزینه مورد نظر خود را از لیست حذف کند از تابع MessageDlg استفاده می کنیم.
متغییر DoRemoveItem را برای نگهداری مقدار برگشتی از فراخوانی MessageDlg استفاده شده  است.  در اینجا ما گفته ایم که سه کلید Cancel, Yes , All وجود داشته باشد. مطابق معمول کلید لغو هیچ واکنشی در بر نخواهد داشت. کلید تایید تنها گزینه مورد نظر کاربر را حدف نموده و گزینه " همه " سبب می شود تا تمام عبارتهای موجود در لیست باکس حذف شوند.

با انتخاب کلید تایید یا " همه " دستورات قرار گرفته در رویداد کلیک اجرا خواهد شد. این همه اتفاقاتی بود که رخ می دهد:
rocedure TMonoDialogs.RemoveItemButton_Click(sender: System.Object; e: System.EventArgs);
begin
  if DoRemoveItem = TmsgDlgResult.mrAll then
  begin
    ListBox1.Items.Clear;
  end
  else
  begin
    if ListBox1.SelectedIndex > 0 then      ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
    else
 Dialogs.ShowMessage(Page,
                     'Nothing was selected',
                     'Operation failed',
                  TDlgType.mtWarning);
  end
end;
دستورات فوق از کادر محاوره سوم برای خبر دادن به کاربر مبنی بر عدم انتخاب گزینه استفاده می کند و تصویر زیر نمایش داده می شود:
مشاهده کردید که به این ترتیب کارها به سادگی برنامه نویسی عادی انجام شد.
به هر صورت چند قاعده وجود دارد که حین برنامه نویسی وب باید مراعات کنید. مثلا شما نمی توانید یک InputBox را در رویداد کلیک یک دکمه  تعریف کنید بلکه باید این کار در جائی بسیار زودتر و جلوتر از این مرحله ، جائی مانند Page_init یا Page_Load  صورت گرفته باشد.  در صورتیکه اقدام به تعریف در رویداد کلیک دکمه بکنید کادر محاوره  پس از عمل پست بک نمایش داده شده که در واقع بسیار دیر است.
شاید این موضوع کمی برای شما ثقیل باشد ما باز هم در فصل های بعدی راجع به آن صحبت خواهیم کرد.
اما ... این دنیای .NET می باشد :

فکر می کنید من فراموش کرده ام که بگویم برنامه منودیالوگ با چه زبانی نوشته شده است؟ خیر فراموش نکرده ام.  ساده است، تنها کافی است بگوئیم با زبان .NET   نوشته شده است. دیگر هیچکس اهمیتی به اینکه برنامه با چه زبانی نوشته شده است نخواهد داد.