تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
صمم الكلاس الخاص بك - كلاس للتعامل مع SQL SERVER
#5
الان مع جملة التحديد ,سنبدأ الاستفادة من كل المعلومات التي قمنا بتخزينها سابقا
سنقوم بعمل جملة تحديد بسيطة نعبئ فيها الحقول من مصفوفة الحقول التي انشأناها سابقا وفق حلقة تكرارية 
و سنفحص اذا ما كان الحقل هو مفتاح رئيسي في قائمة الحقول لنضيفه الى جملة التحديد ايضا
و كذلك سنضيف قائمة البارمترات المرافقة للحقول من المصفوفة الموافقة الى كائن SQL COMMAND
توقف اخي ؟؟؟ لماذا ساضيف بارمترات مع جملة التحديد
ربما تحتاجها مستقبلا اذا ما نويت التوسع في الكلاس كان تجري عمليات بحث و فلترة و غيرها من الامور المعتمدة على البارمترات
الكود التالي يوضح العملية مع الشرح
PHP كود :
   ''' <summary>
    ''' 
اجراء يقوم بانشاء جملة تحديد لبيانات الجدول المحدد
    
''' يمكنك تحديد كل حقول الجدول بواسطة 
    ''' 
علامة في مصفوفة الحقول
    
''' او تحديد الحقول التي تريدها
    ''' 
</summary>
 
   ''' <param name="Command">كائن الكوماند</param>
    ''' 
<param name="Columns">مصفوفة نصية تحتوي على الحقول</param>
 
   ''' <returns>يعود بكائن كوماند يحمل جملة التحديد</returns>
    ''' 
<remarks></remarks>
 
   Private Function Create_Select_For_Command(ByVal Command As SqlCommandByVal ParamArray Columns() As String) As SqlCommand

        If _TableName 
"" Or _TableName Is Nothing Then
            MsgBox
("حدد اسم الجدول اولا", , "From Create_Select_For_Command")
 
           Return Nothing
            Exit 
Function
 
       End If
 
       '**********************************************

        Dim SelectColumns As String = "Select " '
"("
 
       Dim filed As String ""
 
       Dim sa As Integer 0
        Dim qf 
As Integer 0
        Dim qfiled 
As String ""
 
       '-----------------------------------
        Command.Connection = GetSqlConnection
        '
 
       If Columns(0) = "*" Then

            For ic 
0 To InsUpSel.GetLength(1) - 1
                If qf 
InsUpSel.GetLength(1) - 1 Then
                    qfiled 
+= InsUpSel(0ic)
 
               Else
                    qfiled 
+= InsUpSel(0ic) & ","
 
               End If
 
               qf += 1
            Next
            SelectColumns 
+= qfiled " From " _TableName
            qfiled 
""
 
           qf 0


        ElseIf Columns
(0) <> "*" And Columns.Length >= 0 Then
            Columns 
Columns
            If checkfileds
(Columns) = True Then
                Return Nothing
                Exit 
Function
 
           End If

 
           For Each Str As String In Columns
                For ic 
0 To InsUpSel.GetLength(1) - 1
                    If Str 
InsUpSel(0icThen
                        If qf 
Columns.Length 1 Then
                            qfiled 
+= InsUpSel(0ic)
 
                       Else
                            qfiled 
+= InsUpSel(0ic) & ","
 
                       End If
 
                   End If
 
               Next
                qf 
+= 1
            Next
            SelectColumns 
+= qfiled " From " _TableName
        End 
If
 
       '
        Command.CommandText = SelectColumns
        Return Command
    End Function 

اذا دققت في الكود السابق ستجد ان لديك الاجراء checkfileds
هذا الاجراء مهمته تفحص تواجد الحقول المدخلة من قبل المستخدم و مطابقتها مع مصفوفة الحقول لدينا
لكي لا يدخل المستخدم اسم حقل غير موجود لدينا
PHP كود :
   ''' <summary>
    ''' ''
اجراء يقوم بفحص الحقول الممرة وفق مصفوفة الحقول
    
''' ويختبر تواجدها في الجدول
    ''' 
</summary>
 
   ''' <param name="ColCheck">البارميتر هو مصفوفة من الحقول </param>
    Private Function checkfileds(ByVal ParamArray ColCheck() As String) As Boolean
        Dim flds(0) As String
        Dim check As Boolean
        For m = 0 To InsUpSel.GetLength(1) - 1
            ReDim Preserve flds(m)
            flds.SetValue(InsUpSel(0, m), m)

        Next

        For Each t As String In ColCheck
            If Not (flds.Contains(t)) Then
                MsgBox("لا يوجد حقل بالاسم(" & t & ") في الجدول(" & _TableName & ")", , "الرسالة قادمة من الاجراء  checkfileds")
                Return check = True
                Exit Function
            End If
        Next
        Return check
    End Function 

الان ننتقل الى UPDATE
عملية تحديث البيانات في القاعدة تعتمد على شيئ اساسي الا و هو عمود المفتاح الرئيسي اذا ان جملة التحديث تبقى عمياء بدون هذا الحقل ولا تعرف اي حقل تريد ان تحدث لذا وجب ان يكون البارميتر الخاص بهذا الحقل اساسي يعني يحمل القيمة الحقيقة 
عملية تحديد الحقول كما سابقها في جملة SELECT 
PHP كود :
   ''' <summary>
    ''' 'يقوم هذا الاجراء بانشاء جملة تحديث للجدول المحدد
    ''' 
و يقوم باسنادها الى الكوماند المطلوب
    
''' يحتاج الى بارميترين الاول هو كائن الكوماند
    ''' 
و الثاني هو مصفوفة الحقول بامكانك تمرير علامة في الاشارة الى كافة الحقول
    
''' او تمرير الحقول حسب الرغبة كما يلي
    ''' 
</summary>
 
   ''' <param name="Command">
    ''' 
كائن الكوماند
    
''' </param>
    ''' 
<param name="Columns">مصفوفة نصية تحتوي على اسماء الحقول</param>
 
   ''' <returns>يعود بكائن كوماند يحمل جملة التحديث</returns>
    ''' 
<remarks
 
   ''' </remarks>
    Private Function Create_update_For_Command(ByVal Command As SqlCommand, ByVal ParamArray Columns() As String) As SqlCommand
        If _TableName = "" Or _TableName Is Nothing Then
            MsgBox("حدد اسم الجدول اولا", , "From Create_update_For_Command ")
            Return Nothing
            Exit Function
        End If
        '
----------------------------------------------------------------
 
       Dim Updatest As String ""

 
       Dim qfiled As String ""
 
       Dim CurrentKey As String ""
 
       Dim OrginalKey As String ""
 
       Dim qf As Integer 0
        Dim qparm 
As New SqlParameter
        
'***********************************************
        Command.Connection = GetSqlConnection
        Command.Parameters.Clear()
        '
---------------------------------------------------------------------------------------
 
       '''''''''

        If Columns(0) = "*" Then
            For ic = 0 To InsUpSel.GetLength(1) - 1
                qparm = New SqlParameter
                If Not (InsUpSel(3, ic) = "prim") Then
                    If qf = InsUpSel.GetLength(1) - 1 Then
                        qfiled += InsUpSel(0, ic) & "=" & InsUpSel(2, ic)
                        qparm.ParameterName = InsUpSel(2, ic)
                        qparm.SqlDbType = InsUpSel(1, ic)
                        qparm.SourceColumn = InsUpSel(0, ic)
                        Command.Parameters.Add(qparm)
                    Else
                        qfiled += InsUpSel(0, ic) & "=" & InsUpSel(2, ic) & ","
                        qparm.ParameterName = InsUpSel(2, ic)
                        qparm.SqlDbType = InsUpSel(1, ic)
                        qparm.SourceColumn = InsUpSel(0, ic)
                        Command.Parameters.Add(qparm)


                    End If
                Else

                    CurrentKey = InsUpSel(0, ic)
                    OrginalKey = InsUpSel(2, ic)
                    qparm.ParameterName = InsUpSel(2, ic)
                    qparm.SqlDbType = InsUpSel(1, ic)
                    qparm.SourceColumn = InsUpSel(0, ic)
                    Command.Parameters.Add(qparm)
                    '''''''
 
                   qparm = New SqlParameter
                    qparm
.ParameterName "@Orginal_" InsUpSel(0ic)
 
                   qparm.SqlDbType InsUpSel(1ic)
 
                   qparm.SourceColumn InsUpSel(0ic)
 
                   qparm.SourceVersion DataRowVersion.Original
                    Command
.Parameters.Add(qparm)
 
               End If

 
               qf += 1
            Next
            Updatest 
"Update " _TableName " Set " qfiled "  Where " CurrentKey " = " OrginalKey
            
'
            qfiled = ""
            CurrentKey = ""
            OrginalKey = ""
            qf = 0
            '

 
       ElseIf Columns(0) <> "*" And Columns.Length >= 1 Then
            Columns 
Columns
            
'
            If checkfileds(Columns) = True Then
                Return Nothing
                Exit Function
            End If
            '
 
           For Each Str As String In Columns



                For ic 
0 To InsUpSel.GetLength(1) - 1
                    If Not 
(InsUpSel(3ic) = "prim"Then

                        If Str 
InsUpSel(0icThen
                            qparm 
= New SqlParameter
                            If qf 
Columns.Length 1 Then
                                qfiled 
+= InsUpSel(0ic) & "=" InsUpSel(2ic)
 
                               qparm.ParameterName InsUpSel(2ic)
 
                               qparm.SqlDbType InsUpSel(1ic)
 
                               qparm.SourceColumn InsUpSel(0ic)
 
                               Command.Parameters.Add(qparm)
 
                           Else
                                qfiled 
+= InsUpSel(0ic) & "=" InsUpSel(2ic) & ","
 
                               qparm.ParameterName InsUpSel(2ic)
 
                               qparm.SqlDbType InsUpSel(1ic)
 
                               qparm.SourceColumn InsUpSel(0ic)
 
                               Command.Parameters.Add(qparm)

 
                           End If

 
                       End If

 
                   ElseIf InsUpSel(3ic) = "prim" And Not (Command.Parameters.Contains(OrginalKey)) Then
                        CurrentKey 
""
 
                       OrginalKey ""
 
                       CurrentKey InsUpSel(0ic)
 
                       OrginalKey InsUpSel(2ic)
 
                       qparm.ParameterName InsUpSel(2ic)
 
                       qparm.SqlDbType InsUpSel(1ic)
 
                       Command.Parameters.Add(qparm)
 
                       ''''''''''
 
                       If Not (Command.Parameters.Contains("@Orginal_" CurrentKey)) Then

                            qparm 
= New SqlParameter
                            qparm
.ParameterName "@Orginal_" CurrentKey
                            qparm
.SqlDbType InsUpSel(1ic)
 
                           qparm.SourceColumn InsUpSel(0ic)
 
                           qparm.SourceVersion DataRowVersion.Original
                            qparm
.Direction ParameterDirection.Output
                            Command
.Parameters.Add(qparm)
 
                       End If
 
                   End If
 
               Next
                qf 
+= 1
            Next

            Updatest 
"Update " _TableName " Set " qfiled "  Where " CurrentKey " = " OrginalKey
            
' MsgBox(Updatest)


        End If
        Command.CommandText = Updatest

        Return Command
    End Function 

الادخال INSERT 
لا شيئ جديد حددنا الحقول كما سابقه و قمنا فقط باستثناء البارميتر الخاص بالمفتاح الرئيسي اذا كان الحقل الذي تتعامل معه من النوع ترقيم تلقائي او قم باضافته اذا كنت تستخدم حقل خاص بك لكن تذكر ان تفحص قيمة الحقل قبل الارسال لكي لا تنشئ لديك قيم مكررة
PHP كود :
   ''' <summary>
    ''' 
اجراء يقوم بانشاء جملة ادخال للكوماند المحدد
    
''' يتم استخدام اسم الجدول المحدد
    ''' 
يتم من خلاله انشاء بارميترات للكوماند المحدد
    
''' توافق اسماء الحقول في الجدول
    ''' 
</summary>
 
   ''' <param name="Command">مرر اسم الكوماند فقط</param>
    ''' 
<param name="Columns">مرر مصفوفة نصية تحتوي على اسماء الحقول بامكانك استخدام علامة للاشارة الى كل الحقول</param>
 
   ''' <returns>يعيد كائن كوماند يحمل جملة الادخال</returns>
    ''' 
<remarks>
 
   ''' ان اي خطأ في اسماء الحقول لن يعمل الاجراء بشكل صحيح
    ''' 
<example>
 
   ''' <code>
    ''' 
Dim Cols() As String = {"name","phone"}
 
   ''' </code>
    ''' 
</example>
 
   ''' </remarks>
    Private Function Create_Insert_For_Command8(ByVal Command As SqlCommand, ByVal ParamArray Columns() As String) As SqlCommand
        If _TableName = "" Or _TableName Is Nothing Then
            MsgBox("حدد اسم الجدول اولا", , "from Create_Insert_For_Command ")
            Return Nothing
            Exit Function
        End If
        '
-----------------------------------------------------------------
 
       Command Command
        Command
.Connection GetSqlConnection
        Command
.Parameters.Clear()
 
       '=============================================================
        Dim insertall As String = ""
        Dim select1 As String = "Select "
        Dim qfiled As String = ""
        Dim qvalue As String = ""
        Dim qf As Integer = 0
        Dim qparm As New SqlParameter
        If Columns(0) = "*" Then

            For ic = 0 To InsUpSel.GetLength(1) - 1
                qparm = New SqlParameter
                If Not (InsUpSel(3, ic) = "prim") Then
                    If qf = InsUpSel.GetLength(1) - 1 Then
                        qfiled += InsUpSel(0, ic)
                        qvalue += InsUpSel(2, ic)
                        qparm.ParameterName = InsUpSel(2, ic)
                        qparm.SqlDbType = InsUpSel(1, ic)
                        qparm.SourceColumn = InsUpSel(0, ic)
                        Command.Parameters.Add(qparm)
                    Else
                        qfiled += InsUpSel(0, ic) & ","
                        qvalue += InsUpSel(2, ic) & ","
                        qparm.ParameterName = InsUpSel(2, ic)
                        qparm.SqlDbType = InsUpSel(1, ic)
                        qparm.SourceColumn = InsUpSel(0, ic)
                        Command.Parameters.Add(qparm)

                    End If

                End If

                qf += 1
            Next



            If InsUpSel(3, 0) = "prim" Then
                Dim keyorginal As String
                keyorginal = InsUpSel(0, 0)
                select1 += keyorginal & "," & qfiled & " from " & _TableName & " Where " & keyorginal & " = " & " SCOPE_IDENTITY()"
            Else
                select1 += qfiled & " from " & _TableName
            End If

            insertall = "INSERT INTO " & _TableName & vbCrLf & " (" & qfiled & ")" & vbCrLf & "Values " & vbCrLf & "(" & qvalue & ")" & vbCrLf & select1

            Command.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
            qfiled = ""
            qf = 0

        ElseIf Columns(0) <> "*" And Columns.Length >= 1 Then
            Columns = Columns
            If checkfileds(Columns) = True Then
                Return Nothing
                Exit Function
            End If


            For Each Str As String In Columns
                For ic = 0 To InsUpSel.GetLength(1) - 1
                    If Not (InsUpSel(3, ic) = "prim") Then
                        If Str = InsUpSel(0, ic) Then
                            qparm = New SqlParameter
                            If qf = Columns.Length - 1 Then
                                qfiled += InsUpSel(0, ic)
                                qvalue += InsUpSel(2, ic)
                                qparm.ParameterName = InsUpSel(2, ic)
                                qparm.SqlDbType = InsUpSel(1, ic)
                                qparm.SourceColumn = InsUpSel(0, ic)
                                Command.Parameters.Add(qparm)
                                ' 
Exit For
 
                           Else
                                qfiled 
+= InsUpSel(0ic) & ","
 
                               qvalue += InsUpSel(2ic) & ","
 
                               qparm.ParameterName InsUpSel(2ic)
 
                               qparm.SqlDbType InsUpSel(1ic)
 
                               qparm.SourceColumn InsUpSel(0ic)
 
                               Command.Parameters.Add(qparm)

 
                           End If
 
                       Else

                        End 
If
 
                   End If



 
               Next
                qf 
+= 1
            Next
            insertall 
"INSERT INTO " _TableName vbCrLf " (" qfiled ")" vbCrLf "Values " vbCrLf "(" qvalue ")"


 
       End If



 
       Command.CommandText insertall
        Return Command

    End 
Function 

عملية الحذف DELETE
الحذف يجري بطريقة معتادة وفق قيمة المفتاح الرئيسي و هو معروف لديكم جميعا
كما انني اردت ان اعمل طريقة اخرى لحذف كل محتويات الجدول
الحذف وفق معيار محدد
PHP كود :
   ''' <summary>
    ''' 
اجراء يقوم بانشاء جملة استعلام لعملية حذف صف محدد
    
''' وفق قيمة المفتاح الرئيسي
    ''' 
</summary>
 
   ''' <param name="Command">كائن الكوماند</param>
    ''' 
<returns>يعود بكائن الكوماند المرسل</returns>
 
   ''' <remarks></remarks>
    Private Function Create_Delete_For_Command(ByVal Command As SqlCommand) As SqlCommand
        If _TableName = "" Or _TableName Is Nothing Then
            MsgBox("حدد اسم الجدول اولا", , "From Create_Delete_For_Command ")
            Return Nothing
            Exit Function
        End If
        '
-----------------------------------------------------------------------
 
       Command Command
        Command
.Connection GetSqlConnection
        Command
.Parameters.Clear()

 
       Dim Deletest As String "Delete From " _TableName " Where "
 
       Dim parm As New SqlParameter
        
'

        Dim OrginalKye As String = ""
        For ic = 0 To InsUpSel.GetLength(1) - 1
            If InsUpSel(3, ic) = "prim" Then
                OrginalKye = InsUpSel(0, ic)
                parm.ParameterName = InsUpSel(2, ic)
                parm.SqlDbType = InsUpSel(1, ic)
                parm.SourceColumn = InsUpSel(0, ic)
                parm.SourceVersion = DataRowVersion.Original
                Command.Parameters.Add(parm)

            End If
        Next
        Deletest += "(" & OrginalKye & "=" & "@" & OrginalKye & ")"

        '

 
       Command.CommandText Deletest
        Return Command
    End 
Function 

حذف كامل الصفوف في الجدول المحدد
PHP كود :
   ''' <summary>
    ''' 
اجراء يقوم بانشاء جملة استعلام لعملية حذف
    
''' كل الصفوف في الجدول المحدد
    ''' 
</summary>
 
   ''' <param name="Command">كائن كوماند</param>
    ''' 
<returns>يعود بكائن الكوماند المرسل</returns>
 
   ''' <remarks></remarks>
    Private Function Create_DeleteAll_For_Command(ByVal Command As SqlCommand) As SqlCommand
        If _TableName = "" Or _TableName Is Nothing Then
            MsgBox("From Create_DeleteAll_For_Command " & "حدد اسم الجدول اولا")
            Return Nothing
            Exit Function
        End If

        '
-----------------------------------------------------------------------
 
       Command Command
        Command
.Connection GetSqlConnection
        
'--------------------------------------------------------------------------
        Dim Deletest As String = "Delete  From " & _TableName

        Command.CommandText = Deletest
        Return Command
    End Function 

ماذا بعد ذلك 
احببت ان اضمن كل عملنا السابق و اضافة كل كائنات SQL COMMANDS الى كائن SQL DATA ADAPTER
ليتكفل هو بالعملية كاملة يمكنك تخطيها اذا احببت
PHP كود :
   ''' <summary>
    ''' 
اجراء يقوم بتمهيد كائن الادبتر وفق الجدول المحدد
    
''' و يقوم بتجهيز كائنات الكوماند المناسبة مع البارمترات اللازمة
    ''' 
</summary>
 
   ''' <param name="Columns"> * مصفوفة الحقول يمكنك استخدام علامة  </param>
    ''' 
<returns>يعيد كائن ادبتر </returns>
 
   ''' <remarks></remarks>
    Public Function Creat_Adapter(ByVal ParamArray Columns() As String) As SqlDataAdapter

        Dim table1 As String = TableName
        LoadTxtFiled()
        '
----------------
 
       Me._adapter = New SqlClient.SqlDataAdapter()
 
       Dim tableMapping As DataTableMapping = New DataTableMapping()
 
       tableMapping.SourceTable table1 ' "Table"
        tableMapping.DataSetTable = table1 '"class"
 
       '------------------------------------------------------------------
        If Dt.Columns.Count > 0 Then
            For Each dc As DataColumn In Dt.Columns
                tableMapping.ColumnMappings.Add(dc.ColumnName, dc.ColumnName)
            Next
            Me._adapter.TableMappings.Add(tableMapping)
        End If
        '
---------------------------------------------------------------------------
 
       Dim SelCommand As New SqlClient.SqlCommand
        Dim UpCommand 
As New SqlClient.SqlCommand
        Dim InsCommand 
As New SqlClient.SqlCommand
        Dim DelCommand 
As New SqlClient.SqlCommand
        
'--------------------
        SelCommand = Me.Create_Select_For_Command(SelCommand, Columns)
        '
-------------------
 
       UpCommand Me.Create_update_For_Command(UpCommandColumns)
 
       '-------------------
        InsCommand = Me.Create_Insert_For_Command8(InsCommand, Columns)
        '
-----------------
 
       DelCommand Me.Create_Delete_For_Command(DelCommand)
 
       '----------------------
        Me._adapter.SelectCommand = SelCommand
        Me._adapter.InsertCommand = InsCommand
        Me._adapter.UpdateCommand = UpCommand
        Me._adapter.DeleteCommand = DelCommand
        Me._adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
        Return Me._adapter
    End Function 

(25-06-16, 04:29 AM)khodor1985 كتب : بتصور فينا نكتب الكلاس بطريقة أسهل من هيك، هيدا رأيي طبعا.
مشكور على جهودك

مشكور اخي خضر على المشاركة اكيد فيك تكتبه بطرق سهلة اكثر و حسب مزاجك
الموضوع برمته كان على عجالة و الكلاس سيتم تجريبه اكثر للتاكد من عمله
و يمكن الاستفادة من الالية لتطويرها بما يتناسب مع تصورك للهدف

بعد ذلك لم يتبقى لدينا الى عملية تخريج الكلاس BUILD لنحصل على ملف Dll نستخدمه في مشروعنا
ساقوم بوضع تجريب بسيط للتعامل مع الكلاس لاحقا
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}


الردود في هذا الموضوع
RE: صمم الكلاس الخاص بك - كلاس للتعامل مع SQL SERVER - بواسطة ابو ليلى - 25-06-16, 04:48 AM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
Rainbow [VB.NET] كلاس ResizeControls وطريقة جديد ومميزة لتكبير وتصغير ادوات الفورم تلقائيا الماجيك مسعد 9 10,547 19-07-25, 05:59 PM
آخر رد: Mostafa25
Star حماية السورس كود الخاص بك من الكسر مجانا YousefOkasha 7 6,920 03-07-24, 09:20 AM
آخر رد: أبو جودة
  دمج قاعدة بيانات SQL Server 2008 مع المشروع بالـ VBNET snipercoder 4 8,643 12-11-20, 06:01 PM
آخر رد: lion4
  مثال للتعامل مع الجداول المرتبطة - عن طريق الكلاسات ابو ليلى 24 16,436 04-10-20, 06:16 PM
آخر رد: محمد بن عطية
  [درس فيديو] السماح بالاتصالات البعيدة بـ SQL Server Expr aljzazy 0 2,248 13-04-20, 02:30 PM
آخر رد: aljzazy
  [SQL] تحسين أداء وسرعة قاعدة البيانات SQL SERVER اسامه الهرماوي 0 4,111 28-10-19, 03:12 AM
آخر رد: اسامه الهرماوي
  [مشروع] تعلم كيف تصنع برنامج لنشر منشورات لحساب الفيس بوك الخاص بك Basil Abdallah 8 6,971 01-07-18, 01:21 AM
آخر رد: YousefOkasha
  كيفية قراءة ملف باستخدام IntPtr الخاص بالملف silverlight 3 3,962 24-12-16, 03:13 AM
آخر رد: silverlight
  الاستفادة من بارمترات الاخراج من SQL Server داخل برنامجك ابو ليلى 1 3,566 20-08-16, 02:16 AM
آخر رد: الوادي
  [VB.NET] تشغيل Twain الخاص بسحب الصور من السكنر في حالة net framework4 ahmed saleh 4 4,783 25-10-15, 07:20 PM
آخر رد: عدنان الشمري

التنقل السريع :


يقوم بقرائة الموضوع: