PDA

View Full Version : حرفه ای: کلاس برای ذخیره سازی تنظیمات کاربر



sds1920
پنج شنبه 16 مرداد 1393, 18:42 عصر
سلام به همه دوستان.
مدت های بود دنبال کلاسی می گشتم که بتونم برخی تنظیمات ساده و مورد نیاز کاربر را مدیریت کنم.ولی از اونجا که کار کردن با فایل ها مشکل سازه و از طرفی برای دخیره تنظیمات نیازی به دردسرها دیتابیس نیست پس تصمیم گرفتم خودم کلاسی بنویسم که هم از ساختار xml برای ذخیره تنظیمات استفاده کنه و هم برنامه نویس رو از دردسر کار کردن با فایل ها راحت کنه.برای همین شروع کردم و نتیجه نسبتا خوبی به دست اومد که حیفم اومد با بقیه به اشتراک نذارم.من dll کلاس رو به همراه فایل xml توضیحات اون قرار میدم و در زیر به نحوه استفاده از اون می پردازم.

ساختار ذخیره سازی اطلاعات در فایل به صورت زیر می باشد:

<?xml version="1.0" encoding="utf-8"?>
<SettingsCollection>
<setting name="****">
<attr name="..." type="...">value</attr>
</setting>
<setting name="****">
<attr name="..." type="...">value</attr>
<attr name="..." type="...">value</attr>
</setting>
<setting name="****">
<attr name="..." type="...">value</attr>
<attr name="..." type="...">value</attr>
<attr name="..." type="...">value</attr>
<attr name="..." type="...">value</attr>
<attr name="..." type="...">value</attr>
</setting>
</SettingsCollection>



همانطور که در بالا مشاهده می کنید تمامی تنظیمات در ریشه <SettingsCollection> ذخیره می شود.این ریشه شامل مجموعه ای از نود های <Setting> است که هر Setting یک نام Unique و تعدادی خاصیت دارد که این خاصیت ها در ریشه های <attr> ذخیره می شود.از هر setting می توانید برای یکی از تنظیمات مورد نیاز خود استفاده کنی.برای مثال تنظیمات مربوط به پیام ها یا تنظیمات مربوط به مسیر فایل های مورد نیاز و یا تنظیمات مربوط به نمایش تصویر و یا... . در هر setting تعداد Attribute یا همان خاصیت ها نامحدود است و می تواند به هر تعدادی که نیاز هست وجود داشته باشد.تنها نکته مهم در قسمت setting ها منحصر به فرد بودن نام هر setting است در غیر این صورت با خطای زمان اجرا مواجه خواهید شد.نام setting ها حساس به بزرگ و کوچک بودن حروف نیست.
هر <attr> نشان دهنده یک صفت برای setting مشخص شده می باشد که شامل یک نام برای صفت، یک مقدار و نوع داده ای مقدار می باشد.همانند setting ها attr ها نیز دارای یک نام منحصر به فرد درون setting خود میباشند.برای مثال یک attr با نام aaa تنها یک بار می تواند در setting1 باشد ولی setting2 نیز می تواند خاصیتی با همین نام داشته باشد.

تقریبا تمام انواع داده ای پایه توسط این ساختار قابل ذخیره سازی می باشد.در لیست زیر اسامی تمامی 31 نوع داده آمده است:


1)bool
2)bool[]
3)byte
4)byte[]
5)sbyte
6)sbyte[]
7)double
8)double[]
9)float
10)float[]
11)Int16
12)Int16[]
13)Int32
14)Int32[]
15)Int64
16)Int64[]
17)UInt16
18)UInt16[]
19)UInt32
20)UInt32[]
21)UInt64
22)UInt64[]
23)char
24)string
25)string[]
26)DateTime
27)DateTime[]
28)Font
29)Font[]
30)Color
31)Color[]


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

تا اینجا به بررسی ساختار ذخیره سازی داده پرداختیم.در پست های بعدی نحوه استفاده از کلاس ها را بررسی خواهیم کرد.

در قسمت پایین dll و نمونه برنامه برای استفاده از dll قرار داده شده که می توانید استفاده کنید.
هر گونه استفاده شخصی از این dll رایگان و با ذکر منبع بلامانع می باشد.

sds1920
پنج شنبه 16 مرداد 1393, 18:55 عصر
همانطور که مشاهده می کنید در فایل ضمیمه dll برنامه به همراه فایل xml شامل توضیحات کد برنامه موجود است.این dll شامل 4 کلاس اصلی می باشد.


کلاس SettingsCollection که نشان دهنده مجموعه تمام تنظیمات یه همان setting ها می باشد.
کلاس Setting که نشان دهنده تنظیمات کاربر است.
کلاس SettingAttribute که نشان دهنده یک خاصیت از setting است.
کلاس SettingAttributeCollection که نشان دهنده مجموعه تمام خاصیت های یک setting می باشد.


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


1)یک پروژه جدید بسازید
2)SettingsManagment.dll را به References برنامه اضافه کنید.
3)یک Button با نام btnSave بر روی فرم آن قرار دهید.
4)یک Button با نام btnLoad بر روی فرم آن قرار دهید.
5)رویداد کلیک btnSave ار مشابه کدهای زیر تنظیم نمایید:



private void btnSave_Click(object sender, EventArgs e)
{
string settingFileName = "settings.txt";
SettingsCollection settings = new SettingsCollection(settingFileName);


Setting set1 = new Setting("BackgroundPath");
set1.Attributes.Add(new SettingAttribute("Path", @"E:\Pictures\Eiffel_Tower.jpg"));


Setting set2 = new Setting("LoginInfo");
set2.Attributes.Add(new SettingAttribute("Username", "Sds1920"));
set2.Attributes.Add(new SettingAttribute("Password", 219912));
set2.Attributes.Add(new SettingAttribute("LastLogin", DateTime.Now));


Setting set3 = new Setting("Message");
set3.Attributes.Add(new SettingAttribute("Title", "Warning"));
set3.Attributes.Add(new SettingAttribute("Text", "You do not have permission to open programs."));
set3.Attributes.Add(new SettingAttribute("Font", new Font("Comic Sans MS", 12.25f, FontStyle.Bold, GraphicsUnit.Point)));
set3.Attributes.Add(new SettingAttribute("Color", Color.OrangeRed));


settings.Add(set1);
settings.Add(set2);
settings.Add(set3);


if (settings.Save())
MessageBox.Show("Settings saved successfully.");


}



برنامه را اجرا کنید و کلید Save را فشار دهید تا تنظیمات ذخیره شود.
در کد بالا ابتدا یک شی از کلاس SettingsCollection می سازیم.این کلاس یک رشته به عنوان آدرس فایل تنظیمات دریافت می کند که تنظیمات مورد نظر را در آن فایل می نویسد و یا از آن می خواند.


در ادامه سه setting با نام های BackgroundPath و LoginInfo و Message ایجاد کردیم که به ترتیب دارای 1 و 3 و 4 خاصیت می باشند.برای افزودن خاصیت ها از Property با نام Attributes از شی setting استفاده می کنیم که یک شی از کلاس SettingAttributeCollection است و شامل تمام خاصیت های یک setting می شود.خاصیت های یک setting با استفاده از کلاس SettingAttribute ساخته می شود که دو پارامتر دریافت می کند.اولین پارامتر یک رشته است که نشان دهنده نام خاصیت است و پارامتر بعدی یک object است که نشان دهنده مقدار خاصیت است.
پس از آنکه setting ها و خاصیت ها ی آنها تنظیم شد آنها را با استفاده از متد Add به SettingsCollection اضافه می کنیم و در نهایت تنظیمات را ذخیره می کنیم.
چنانچه تمام مراحل گفته شده به درستی انجام شده باشد یک فایل با نام settings.txt در فولدر برنامه ایجاد شده است که محتوای آن به صورت زیر می باشد:


<?xml version="1.0" encoding="utf-8"?>
<SettingsCollection>
<setting name="BackgroundPath">
<attr name="Path" type="String">E:\Pictures\Eiffel_Tower.jpg</attr>
</setting>
<setting name="LoginInfo">
<attr name="Username" type="String">Sds1920</attr>
<attr name="Password" type="Int32">219912</attr>
<attr name="LastLogin" type="DateTime">635430338790527922</attr>
</setting>
<setting name="Message">
<attr name="Title" type="String">Warning</attr>
<attr name="Text" type="String">You do not have permission to open programs.</attr>
<attr name="Font" type="Font">Comic Sans MS, 12.25pt, style=Bold</attr>
<attr name="Color" type="Color">OrangeRed</attr>
</setting>
</SettingsCollection>

sds1920
پنج شنبه 16 مرداد 1393, 20:57 عصر
برای خواندن تنظیمات کاربر رویداد کلیک btnLoad را به صورت زیر بنویسید:

private void btnLoad_Click(object sender, EventArgs e)
{
string settingFileName = "settings.txt";
SettingsCollection settings = new SettingsCollection(settingFileName);


if (settings.Load())
{
string msg = string.Empty;


msg += settings[0].Name + "\n";
msg += "\t" + settings["BackgroundPath"].Attributes["Path"].ValueAsString + "\n";


msg += settings["LoginInfo"].Name + "\n";
msg += "\t" + settings["LoginInfo"].Attributes["Username"].ValueAsString + "\n";
msg += "\t" + settings["LoginInfo"].Attributes["Password"].ValueAsInt32 + "\n";
msg += "\t" + settings["LoginInfo"].Attributes["LastLogin"].ValueAsDateTime.ToString("yyyy/MM/dd") + "\n";


msg += settings["Message"].Name + "\n";
msg += "\t" + settings["Message"].Attributes["Title"].ValueAsString + "\n";
msg += "\t" + settings["Message"].Attributes["Text"].ValueAsString + "\n";
msg += "\t" + settings["Message"].Attributes["Font"].ValueAsFont + "\n";
msg += "\t" + settings["Message"].Attributes["Color"].ValueAsColor + "\n";


MessageBox.Show(msg);
}
}


برای خواندن تنظیمات کافی است متد Load را فراخوانی کنید تا تمام تنظیمات داخل کلاس SettingsCollection قرار گیرد.
همانگونه که مشاهده می کنید برای دسترسی به شی setting می توانید از اندیس آن یا از نام آن استفاده نمایید.به همین صورت برای دسترسی به
SettingAttribute نیز می توانید از اندیس یا نام آن استفاده نمایید.
برای دسترسی به مقدار هر خاصیت می توانید با توجه به نوع داده آن از Property متناسب با آن استفاده کنید.برای مثال اگر نوع داده long باشد از
ValueAsInt64 ، چنانچه نوع داده DateTime باشد از ValueAsDateTime و ... استفاده نمایید.

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

plus
پنج شنبه 16 مرداد 1393, 22:39 عصر
یک پیشنهاد اینکه این سیستم ذخیره سازی تنظیمات رو به داده های اولیه محدود نکنین.در واقع بهتره طوری باشه که بتونه هر شی ی که ISerializable یا حداقل IXmlSerializable هست رو نگه داری کنه.

sds1920
شنبه 18 مرداد 1393, 10:05 صبح
یک پیشنهاد اینکه این سیستم ذخیره سازی تنظیمات رو به داده های اولیه محدود نکنین.در واقع بهتره طوری باشه که بتونه هر شی ی که ISerializable یا حداقل IXmlSerializable هست رو نگه داری کنه.

بررسی می کنم و در صورت امکان اعمال میکنم.