الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إعدادات التطبيق وإعدادات المستخدم

مغلق
بدأه محمد سامر أبو سلو في 18 مارس 2006 · 6 رد · 5,556 مشاهدة · في قسم الدروس والمواضيع المتميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

العديد من التطبيقات تحتاج لتخزين إعدادات محددة لمتابعتها بين الجلسات. ولكن كيف ستقوم بتخزين هذه الإعدادات ضمن التطبيقات المكتوبة ضمن الفريموورك.؟ ليس من السهل دوما الاجابة الصحيحة عن هذا السؤال وستجد مجالا متنوعا من الحلول لهذه المسألة من العديد من المصادر ولكن قليلا منها يمثل الطريقة المثلى لمعالجة هذه الحاجة دعنا أولا نعرف نوعين رئيسيين لهذه الإعدادات: إعدادات خاصة بالتطبيق وإعدادات خاصة بالمستخدم فإعدادات التطبيق يتم توزيعها مع البرنامج وهي تؤثر على جميع المستخدمين ويكون المسؤول عن تغييرها في العادة مدراء الأنظمة عندما نريد تغيير التصرف العام للتطبيق. فمثلا برنامج لتنظيم الأيدي العاملة عندما يتم تطبيقه في مؤسسة ما سيتم ضبط إعداداته العامة مثل إعداد مخدم قاعدة البيانات التي سيتصل بها المستخدمون وإضافة شعار الشركة لواجهة البرنامج وهكذا. إعدادات التطبيق هذه لاعلاقة لها بالمستخدم ويمكن أن يتم إعدادها في نفس المجلد الذي سيتم تثبيت التطبيق فيه وبشكل يكون فقط مدير النظام له صلاحيات التعديل والحذف على هذه الإعدادات وفي الحالات العامة سيحتاج التطبيق لقراءة هذه الإعدادات دون الحاجة لتعديلها وإعدادات المستخدم تكون خاصة بكل مستخدم على حدة ويجب أن تكون قابلة للتحرير من داخل الكود فمن أجل تطبيق ما يمكن أن تضم إعدادات المستخدم حجم ومكان نافذة التطبيق وحالة البدء للتطبيق وتغيير هذه المعلومات بسرعة. كل هذه المعلومات يجب استعادتها عند بدء جلسة التطبيق وتحريرها عند الضرورة أثناء تشغيل التطبيق وحفظها للقرص لتكون متوفرة في المرة القادمة التي يقوم المستخدم بتشغيل التطبيق.

ضبط واستعادة إعدادات المستخدم

إنشاء ملف الإعداد للتطبيق موثق جيدا في وثائق الفريموورك ولكن أحببت أن أقدم لك عرضا سريعا لها. أول خطوة هي إنشاء ملف إعداد داخل تطبيقك باختيار Add New Item من قائمة Project و اختيار Application Configuration File و اترك الاسم الافتراضي للملف App.Config كما هو دون تغيير حيث سيتم نقله وإعادة تسميته تلقائيا بالشكل المناسب عند قيامك ببناء التطبيق ففي الملف الجديد يمكنك تحديد إعدادات مخصصة أو إضافة إعداداتك الخاصة ضمن القسم appSettings حيث تكون عبارة عن أزواج اسم/قيمة وتخزين بعض المعلومات البسيطة قد ينتج ملفا شبيها بالتالي

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="Company Name" value="Java Jitters" />
        <add key="Database Server" value="BigSQLServer" />
    </appSettings>    
</configuration>

ومن السهل استعادة هذه القيم عند الحاجة من خلال الفئات والإجراءات الموجودة ضمن النطاق System.Configuration وحتى أنك لن تحتاج لتحميل الملف بنفسك حيث سيتم اكتشافه وتحميله تلقائيا إن كان يحمل الاسم المناسب وموضوعا في المكان المناسب

Dim companyName As String _
    = ConfigurationSettings.AppSettings("Company Name")

لماذا لاتستخدم App.Config؟

كثيرا ما نرى السؤال كيف أعمل ملف App.Config الخاص بي بعد أن استخدموا ملف التعريف ورأو عملية البرمجة السهلة المتعلقة به لماذا لايمكنهم استخدام نفس الملف لتخزين إعدادات المستخدجم الخاصة بهم لماذا يوجد طريقتين مختلفتين للإعدادات وذلك بعد اكتشافهم أن المجال System.Configuration لايقدم طريقة لكتابة الملف app.config والتي تعتبر بمثابة تحذير ولكنها لن تقف عائقا أمام المبرمج المصمم وبعد البحث في العادة يقومون باستخدام ملف عادي أو XmlDocument وهذه تعتبر فكرة غير جيدة ولايجب على تطبيقك كتابة هذه الملفات لعدة أسباب منها الصلاحيات، عدم عزل المستخدمين وكون الملف app.config جزءا من ملفات إعداد التطبيق لهذه الأسباب وأسابا أخرى لايجب عليك استخدام الملف app.config لغرض تخزين إعدادات المستخدم ولكن لاتقلق فتخزين إعدادات المستخدم ليس بتلك الصعوبة

إنشاء فئة إعدادات وتخزينها على القرص

المفتاح لإنشاء إعداات المستخدم الخاصة بك هو إنشاء فئة Class تمثل جميع البيانات حيث سيكون واجهتك لإعدادات المستخدم الخاصة بك وهي أول شئ يجب عليك بناؤه عندما تريد تخزين أية معلومات كالفئة التالية مثلا

Imports System.Drawing
Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Environment
Imports System.Collections.Specialized

Public Class Settings

    Private m_BackgroundColor As String
    Private m_RecentFiles As New StringCollection
    Private m_LastWindowBounds As Rectangle _
        = New Rectangle(0, 0, 200, 200)
    Private m_LastWindowState As Windows.Forms.FormWindowState _
        = FormWindowState.Normal

    <Xml.Serialization.XmlIgnore()> _
    Public Property LastWindowBounds() As Rectangle
        Get
            Return m_LastWindowBounds
        End Get
        Set(ByVal Value As Rectangle)
            m_LastWindowBounds = Value
        End Set
    End Property

    Public Property LastWindowPos() As Point
        Get
            Return m_LastWindowBounds.Location
        End Get
        Set(ByVal Value As Point)
            m_LastWindowBounds.Location = Value
        End Set
    End Property

    Public Property LastWindowSize() As Size
        Get
            Return m_LastWindowBounds.Size
        End Get
        Set(ByVal Value As Size)
            m_LastWindowBounds.Size = Value
        End Set
    End Property

    Public Property LastWindowState() As Windows.Forms.FormWindowState
        Get
            Return m_LastWindowState
        End Get
        Set(ByVal Value As Windows.Forms.FormWindowState)
            m_LastWindowState = Value
        End Set
    End Property

    Public Property RecentFiles() As StringCollection
        Get
            If m_RecentFiles Is Nothing Then
                m_RecentFiles = New StringCollection
            End If
            Return m_RecentFiles
        End Get
        Set(ByVal Value As StringCollection)
            If Value Is Nothing Then
                m_RecentFiles = New StringCollection
            Else
                M_RecentFiles = Value
            End If
        End Set
    End Property

    Public Property BackgroundColor() As String
        Get
            Dim colorToReturn As String

            If m_BackgroundColor Is Nothing OrElse _
                m_BackgroundColor = String.Empty Then
                colorToReturn = ColorTranslator.ToHtml( _
                    Color.FromKnownColor(KnownColor.Control))
            Else
                colorToReturn = m_BackgroundColor
            End If
            Return colorToReturn
        End Get
        Set(ByVal Value As String)
            If Not ColorTranslator.FromHtml(Value).IsEmpty Then
                m_BackgroundColor = Value
            Else
                m_BackgroundColor = String.Empty
            End If

        End Set
    End Property

End Class

بعد انتهاؤك من كتابة الفئة المناسبة لإعداداتك المطلوبة ستكون الخطوة التالية هي كتابتها وقرائتها من ملف على القرص وإحدى الطرق المناسبة هي الفئتينSystem.Xml.XmlReader و System.Xml.XmlWriter ولكنه يكون من الأسهل استخدام تسلسل إكس إم إل XML Serialization حيث يكفل جميع الضروريات لإنشاء تواجد للفئة في ملف XML و استعادتها منه وهو قوي بحيث يستطيع التعامل مع المعلومات المنقوصة وحتى الخصائص الإضافية التي يمكن أن يتم إضافتها مستقبلا وبهذا يتضح أنه خيار جيد ويمكنك تخزين تواجد للفئة على القرص باستخدام الفئة System.Xml.Serialization.XmlSerializer كما يمكنك استخدام نفس الفئة للاستعادة لاحقا انظر المثال

Public Sub SaveSettings()
    Dim xs As New XmlSerializer(GetType(Settings))

    Dim sw As New IO.StreamWriter("C:\settings.xml")
    xs.Serialize(sw, currentSettings)
    sw.Close()

    Dim sr As New IO.StreamReader("C:\settings.xml")
    currentSettings = CType(xs.Deserialize(sr), Settings)
    sr.Close()

End Sub

في هذا المثال البسيط نريد وضع كود فعلي في فئة الإعدادات الخاصة بنا كدمج بين العديد من الإجراءات والطرق المختلفة وقد زودت بعض الخيارات المختلفة ليتم تقديمها ضمن التدفق stream حيث سيهتم بحفظها على القرص وعملية التسلسل/الغاء التسلسل serializing or deserializing تتطلب أولا انشاء تواجد للفئة XmlSerializer

Dim xs As New XmlSerializer(GetType(Settings))

وستحتاج أيضا إلى تواجد لـ TextWriter, or XmlWriter أو TextReader, or XmlReader لتمثل عملية الحفظ والتحميل

Dim sw As New IO.StreamWriter("C:\settings.xml")

ومكان تخزين الملف على القرص يعتبر من النقاشات الهامة وأقترح مجلد بيانات التطبيق للمستخدم أو أي مكان معزول آخر ويعتبر الخيار الأول هو الأفضل حيث يمكنك الحصول على مساره الكامل باستخدام Application.UserAppDataPath أو System.Environment.GetFolderPath حيث يمكن الحصول على المسار المطلوب بالعديد من الطرق ولكني أعتقد أن هذه الطريقة تعمل بشكل جيد كفاية

Dim filePath As String
filePath = Path.Combine(GetFolderPath( _
        SpecialFolder.ApplicationData), Application.CompanyName)
filePath = Path.Combine(filePath, Application.ProductName)
filePath = Path.Combine(filePath, FILENAME)
Dim settingsFile As New FileStream(filePath, FileMode.Create)

التخزين المنفصل

و المكان المثالي الآخر هو التخزين المنفصل حيث يكون له مكان خاص ضمن مجلد بيانات التطبيق للمستخدم الذي يوفر ملفات فريدا مربوط بالمستخدم وببعض المعلومات حول التطبيق حيث يمكنك استخدام الفئات الموجودة ضمن System.IO.IsolatedStorage لإنشاء ملف أو فتح آخر موجود في تلك المنطقة

Dim ifs As IsolatedStorageFile
ifs = IsolatedStorageFile.GetUserStoreForAssembly()
Dim settingsFile As New IsolatedStorageFileStream( _
    FILENAME, FileMode.Create, ifs)
Return settingsFile

الحفظ والتحميل من داخل التطبيق

في النموذج الرئيسي لتطبيقك ستحتاج لتحميل ملف الإعدادات من القرص عند بدء تطبيقك وحفظها عند نهايته وكل الإجرائيات التي ستحتاجها موجودة في فئتك وسيتطلب ذلك العمل مع تلك الاجرائيات في الفئة لتحرير الإعدادات التي تريدها ففي تطبيق بسيط بنافذة واحدة سيكون من السهل انجاز هذا ببضعة سطور من الكود ومن أجل تحميل الاعدادات عند بدء التطبيق يمكنك النظر إلى المثال

Dim currentSettings As Settings

Public Sub LoadSettings()
    Try
        Me.currentSettings = Settings.Load()
        With Me.currentSettings
            Me.Bounds = .LastWindowBounds
            Me.BackColor = ColorTranslator.FromHtml(.BackgroundColor)
            Me.WindowState = .LastWindowState
        End With
        UpdateRecentFileMenu()
    Catch ex As Exception
        Me.currentSettings = New Settings
    End Try
End Sub

Public Sub New()
    MyBase.New()

    'This call is required by the Windows Form Designer.
    InitializeComponent()

    'Add any initialization after the InitializeComponent() call
    LoadSettings()

End Sub

ولتحميلها يمكنك النظر للمثال

Protected Overrides Sub OnClosing(ByVal e As _
    System.ComponentModel.CancelEventArgs)
    SaveSettings()
End Sub

Private Sub SaveSettings()
    With Me.currentSettings
        .LastWindowBounds = Me.Bounds
        .BackgroundColor = ColorTranslator.ToHtml(Me.BackColor)
        .LastWindowState = Me.WindowState
        .PersistMe()
    End With
End Sub

ماذا عن فيجول بايزيك 2005

ناقشنا في هذا الموضوع كيف وأين تقوم بتخزين إعداداتك ولكن في VB2005 كثير من هذه المسائل تمت معالجتها من أجلك حيث تمت إضافة محرر للإعدادات في خصائص التطبيق يمكنك استخدامها بسهولة لضبط كلا من إعدادات المستخدم و إعدادات التطبيق بكل سهولة وبعد قيامك بضبطها بالشكل المناسب يمكنك قراءتها بكل سهولة

Me.Text = My.Settings.CompanyName
If My.Settings.StartMaximized Then
    Me.WindowState = FormWindowState.Maximized
End If

تم تعديل هذه المشاركة بواسطة samerselo في 18 مارس 2006 في 21:13

1

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

يمكنكم متابعة مناقشة هذه الإعدادات من منظور Vb2005 في الموضوع الإعدادات في VB 2005

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#3

الله يعطيك العافية

معلومات جدا قيمة بس متقدمة يعني مو الكل راح يفهم عليك :)

هي نفس فكرة web.config في لغة asp.net

بس مع 2005 زي ماقلت استخدام setting يعوض كثير حتى صرت افكر استخدمه زي cascade style sheet

:)

<span style='color:green'>سؤل ابن عباس عن علمه كيف جمعه فقال :( أوتيت لسانا سؤولا وقلبا عقولا)</span>

#4

الله يكرمك ويزدك من العلم وقليل جدا من يتكلم فى هذا الموضوع

وتواصل الكثير من التقدم والعطاء

#5

شرح جميل

جزيل الشكر والإمتنان .

[ CISCO + IT + VB.NET ]

#6

مو واضحه

#7
Nadooe كتب:
مو واضحه

رد غير مقبول إطلاقا ويفتقر إلى اللباقة

لماذا لا تسأل عن الأمور الغامضة بدلا من هذا الرد

مع الشكر لصاحب الموضوع على الموضوع الرائع

هذا الموضوع مغلق.

مواضيع مشابهة