نسخه 4.1(Ed41) (سورس کد و لایبراری ضمیمه شده اند):
این لودینگ واقعی است! یعنی یک زمان ثابت برای لودش نمیدهم بلکه براساس مدت زمان واقعی مورد نیاز برای لودش منتظر می ماند!
قابلیتها:
1-دارای قابلیت ارسال فرم ، ارسال شی و ارسال آرایه ای از اشیا و یا همزمان باهم که در overload های تابع CreateForm همگی قرار داده شده اند.
2-در این نسخه کد نویسی تا حد ممکن تمیز شده و نام گذاری ها به تناسب کارشان اصلاح شده اند و مستند سازی شدند.
3-دارای قابلیت نمایش Splash Screen همراه با خاصیت TextSplash که می توان متن فرم Splash را تعیین کرد.
4- دارای خاصیتی به نام Text که می توان متن فرم انتظار را تعیین کرد.
5- دارای قابلیتی برای نمایش فرم انتظار برای محاسبات زمانگیر داخل فرم به دو صورت(InForm)
در این نسخه 4.1 قابلت ارسال آبجکت بازگشتی به تابع غیر استاتیک CreateInForm اضافه شد و راهنما به روزرسانی شد.
استفاده از این لایبراری که ضمیمه شده برنامه ی شما را حرفه ای جلوه میدهد.(کدها توسط اینجانب نوشته شده است و با سورس باز که در پروژ دمو قرار دارد)
(خوشتان آمد لایک یادتون نره)
برای استفاده از این لایبراری آنرا از طریق زیر به پروژه تان اضافه کنید
Solution Explorer>References>Add Reference>Browse>WaitingForHeavyForm.dll
هدف ساخت:
ساختن یک فرمی که به کاربر نشان دهد که برای دیدن آن فرم سنگین منتظر بماند.
ضرورت ساخت:
اگر فرم شما خیلی سنگین باشد مثلاً برای لود کردن تصویر ذخیره شده از درون دیتابیس برنامه قدری مکث میکند و کاربر احساس میکند که برنامه هنگ کرده و یا اگر از کریستال ریپورت استفاده میکنید کاربر احساس میکنه که برنامه هنگ کرده(که من از این قسمتش استفاده کردم)
و یا اگر از اینترنت استفاده میکنید ممکن است کاربر احساس کند که برنامه هنگ کرده و یا هر چیزی که زمان بر است...
کامپوننت مورد استفاده:
برای ساخت این لایبراری از BackGroundWorker (کامپوننت مولتی تردینگ)استفاده شده است.
نیازمندی ها:
دات نت فریمورک 3.5
-----------------------------------
آموزش نحوه استفاده از کدها:
-----------------------------------
-------------------------------------------------------
1--نمایش فرم انتظار برای باز شدن یک فرم جدید
-------------------------------------------------------
فرض کنید یک MainForm و چندین ChildForm داریم:
این کد را برای نمایش ChildForm در MainForm (به جای استفاده از Show()) به کار میبریم:
//add this name space
using LoadingForm;
// In Your MainForm
Waiting.CreateForm(typeof(ChildForm1));
و این کد را در ChildForm بعد از پروسه زمان برتان و قبل از لود به کار می بریم:
LoadingForm.Waiting.ReportCompleted();
یعنی به این صورت
public partial class ChildForm1 : Form
{
public ChildForm1()
{
InitializeComponent();
//فرضاً پروسه زمان برتان اینجا قرار دارد که قبل از لود باشد
LoadingForm.Waiting.ReportCompleted();
}
}
در این نسخه Waiting.CreateForm دارای 5 نسخ متفاوت overload برای ایجاد یک فرم جدید با قابلیت انتقال هر تعداد و هر نوع شی می باشد و در فایل ضمیمه به صورت عملی بکار برده شده است و از توضیح آن در اینجا خوداری شده است.
-------------------------------------------------------
2--نمایش فرم انتظار برای انجام عملی زمانبر در داخل فرم اصلی توسط متد غیر استاتیک CreateInForm
-------------------------------------------------------
(این مثال در سورس ضمیمه پیاده سازی شده است)
فرض کنید یک پروسه زمان بر در یک قسمت از کدتان به صورت زیر قرار دارد (که در آن MainForm همان فرمی است که باتن 6 قرار دارد)
برای استفاده از این متد ابتدا باید یک شی از کلاس Waiting تهیه کرد:
LoadingForm.Waiting wt2 = new LoadingForm.Waiting();
و سپس کدهای قسمت قبل را به این صورت درآورید:
private void button6_Click(object sender, EventArgs e)
{
wt2.TextWaiting = "صبر کنید";
wt2.CreateInForm(typeof(MainForm), this, false, false, "DoWork2");
}
public void DoWork2()//این متد در یک نخ دیگر در حال اجراست
{
//Simulate Heavy Processing
System.Threading.Thread.Sleep(4000);
}
تذکر1: هرگز از اشیاء فرمتان(در واقع هر شی که خارج از این متد DoWork تعریف شده باشد )
در این متد DoWork استفاده نکنید، که با خطا مواجه میشوید(چون این متد در یک نخ (Thread)دیگر در حال اجراست)
بهتر است از متد با قابلیت بازگشت شی DoWork که ساختارش در ** ارائه شده است استفاده کرد.
تذکر2: هرگز اشیاء این فرمتان را در این متد DoWork مودیفای (تعیین ) نکنید
یعنی بهشون مقدار ندهید ولی میتوانید آنهارا به صورت زیر در این متد DoWork فراخوانی کنید:
Form1 thisForm=LoadingForm.Waiting.formMain as Form1;
string _str = thisForm.textBox1.Text;
در صورت نیاز برای فراخوانی (و نه مودیفای) اشیاء فرم اصلی در همین تابع DoWork از این کد استفاده کنید.
تذکر3: نام گذاری تابع مهم نیست که چی باشه فقط هرچی که هست همان نام را در تابع CreatInForm قرار دهید.
**: متد MyDoWork1 (البته نام گذاریش مهم نیست) با قابلیت ارسال شی:
private void button6_Click(object sender, EventArgs e)
{
wt2.TextWaiting = "صبر کنید";
object obj=wt2.CreateInForm(typeof(MainForm), this, false, false, "MyDoWork1");
}
public object MyDoWork1()//این متد در یک نخ دیگر در حال اجراست
{
//Simulate Heavy Processing
System.Threading.Thread.Sleep(4000);
}
-------------------------------------------------------
3--نمایش Splash Screen برای ورود به نرم افزار
-------------------------------------------------------
فرض کنید فرمی داریم که دارای لود سنگین می باشد و کدهای فرمش به این صورت می باشد:
برای نمایش فرم splash کدها را به این صورت در آورید:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
LoadingForm.Waiting wt=new LoadingForm.Waiting();
private void Form1_Load(object sender, EventArgs e)
{
wt.TextWaiting = "در حال ورود به سیستم...";
wt.CreateInForm(typeof(Form1), this, true, false, "DoWorkInForm");
}
public void DoWorkInForm()//این متد در یک نخ دیگر در حال اجراست
{
// Simulate Heavy Loading
System.Threading.Thread.Sleep(3000);
}
}
فراموش نشود: در صورتی که از این(و یا هر تغییری از این) کدها در پروژه تان استفاده کردید در قسمت تشکرات برنامه تان تشکر از "فرهاد مهرورزی" فراموش نشود.
توجه: فایل های ضمیمه با ویژوال استودیو 2012 نوشته شده اند برای باز کردن فایلها در نسخه 2010 ویژوال استودیو فایل .sln (سولوشن) را با نوت پد باز کنید و سپس این خط را
Microsoft Visual Studio Solution File, Format Version 12.00
را به این خط تبدیل کنید
Microsoft Visual Studio Solution File, Format Version 11.00
فایلهای ضمیمه شده برای نسخه 4.1:
لایبراری: WaitingForHeavyForm_Ed41.zip
سورس پروژه همراه با دمو: UC_LoadingForm_Ed41.zip