تقييم الموضوع :
  • 2 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
العلاقات بين الجداول-الاضافة و الحذف و التعديل-برنامج لحفظ مصادر الموقع
#6
الان ناتي الى النموذج الثاني Form2 و هو قلب برنامجنا الذي سيقوم بحفظ صفحات الموقع لدينا

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










بعد التوكل على الله نبدأ
سنقوم باستيراد بعض مجالات الاسماء للتعامل معها خلال الكود
كود :
Imports System.Data.OleDb
Imports System.Net
Imports System.IO
Imports System.Text.RegularExpressions
Imports System.Text
Imports System.Runtime
Imports System.Runtime.InteropServices

و بعض المتغيرات في بداية النموذج سنعرف الحاجة منها من خلال الشرح
كود :
Public Class Form2
   Dim A, B, C, D As Integer
   Dim sourceString As String
   Dim cookies As New CookieContainer()
   Dim Dt As New DataTable
   Dim PathStr As String
   Dim result As String = String.Empty

حدث تحميل النموذج
كود :
   Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
       Try

           Me.KindBindingSource.DataSource = LoadDataSet()
           Me.KindBindingSource.DataMember = "Kind"
           '
           Me.PostBindingSource.DataSource = KindBindingSource
           Me.PostBindingSource.DataMember = "Kind_post"
           '
           Me.InfoBindingSource.DataSource = PostBindingSource
           Me.InfoBindingSource.DataMember = "Kind_Info"
           '
           Me.AttachBindingSource.DataSource = InfoBindingSource
           Me.AttachBindingSource.DataMember = "Info_Attach"

           '
           BindingFileds()
           '
           CreaeDt()
           BindingNavigatorAddNewItem3.Enabled = False

       Catch ex As Exception
           MsgBox(ex.ToString)
       End Try

   End Sub

تم شرحه سابقا عند التعامل مع النموذج Form1 مع زيادة طفيفة تتعلق بالجزئية CreaeDt 
و هو اجراء بسيط  لانشاء جدول سنحتاجه خلال العمل كما يلي
كود :
   ''' <summary>
   ''' اجراء بناء جدول خاص لتحميل المرفقات
   ''' </summary>
   ''' <remarks></remarks>
   Private Sub CreaeDt()
       Dt = New DataTable
       Dt.Clear()
       Dim Urlcol As New DataColumn("Urlcol", System.Type.GetType("System.String"))
       Dim Namecol As New DataColumn("Namecol", System.Type.GetType("System.String"))
       Dt.Columns.Add(Urlcol)
       Dt.Columns.Add(Namecol)
   End Sub

اجراء ربط الكائنات BindingFileds

كود :
   'ربط الكائنات
   Private Sub BindingFileds()
       Try
           Me.KindTextBox.DataBindings.Add(New Binding("Text", KindBindingSource, "Kind"))
           Me.Not1TextBox.DataBindings.Add(New Binding("Text", KindBindingSource, "Not1"))
           '
           Me.ponameTextBox.DataBindings.Add(New Binding("Text", PostBindingSource, "poname"))
           '
           Me.InfonameTextBox.DataBindings.Add(New Binding("Text", InfoBindingSource, "Infoname"))
           Me.UrlInfoTextBox.DataBindings.Add(New Binding("Text", InfoBindingSource, "UrlInfo"))

           '
           ComboBox1.DataSource = KindBindingSource
           ComboBox1.DisplayMember = "kind"
           ComboBox1.ValueMember = "Id"
           '
           ComboBox2.DataSource = PostBindingSource
           ComboBox2.DisplayMember = "poname"
           ComboBox2.ValueMember = "id_k"
           '
           ComboBox3.DataSource = InfoBindingSource
           ComboBox3.DisplayMember = "Infoname"
           ComboBox3.ValueMember = "IdInfo"
           '
           ListBox2.DataSource = AttachBindingSource
           ListBox2.DisplayMember = "AttachName"
           ListBox2.ValueMember = "AttachPath"


       Catch ex As Exception
           MsgBox(ex.ToString)
       End Try

   End Sub


السيناريو المتبع في العمل سيكون كالتالي
بعد تحميل النموذج سنكون امام عمليات اضافة للاصناف و الفروع المشتقة منها و كذلك المقالات المشتقة من كل فرع 
وهي عملية روتينية ناقشناها في البند السابق عند التعامل مع Form1 
الجديد في الموضوع اننا سنكون امام صفحات HTML سنقوم بتخزينها في قاعدة البيانات من صفحة المستعرض مباشرة
و سنقوم ايضا بتخزين المرفقات المرتبطة بالمقال المعروض في المتصفح
طبعا التخزين ليس ضمن القاعدة بل في مجلد ضمن مسار البرنامج و اسمه AttachMents 
بينما سيتم تخزين اسم الملف و مساره فقط في جدول في القاعدة 
سيتم الدخول تلقائيا للموقع وفق اعدادات مسبقة انت تقوم بادخالها في نموذج خاص سنناقشه لاحقا
على اي حال لن اسهب كثيرا في الشرح هنا لانني ساقوم بالشرح مع كل خطوة تستلزم الشرح
ساضع الاكواد الخاصة بالادوات (الحذف و الحفظ و التعديل) بشكل عادي دون شرحها لاننا اصبحنا نعرف شرحها كما سبق

كود :
   'زر اضافة نوع
   Private Sub BindingNavigatorAddNewItem_Click(sender As System.Object, e As System.EventArgs) Handles BindingNavigatorAddNewItem.Click
       Try
           KindBindingSource.CancelEdit()
           KindBindingSource.AddNew()
           A = KindBindingSource.Position
           KindTextBox.Focus()
       Catch ex As OleDb.OleDbException
           MsgBox(ex.ToString)
       End Try
   End Sub

كود :
   'عند اضافة فرع
   Private Sub InfoBindingSource_AddingNew(sender As Object, e As System.ComponentModel.AddingNewEventArgs) Handles InfoBindingSource.AddingNew
       Try
           KindBindingSource.EndEdit()
       Catch ex As OleDb.OleDbException
           MsgBox(ex.ToString)
       End Try
   End Sub

كود :
   'زر اضافة فرع
   Private Sub BindingNavigatorAddNewItem1_Click(sender As System.Object, e As System.EventArgs) Handles BindingNavigatorAddNewItem1.Click
       Try
           PostBindingSource.CancelEdit()
           PostBindingSource.AddNew()
           B = PostBindingSource.Position
           ponameTextBox.Focus()
       Catch ex As OleDb.OleDbException
           MsgBox(ex.ToString)
       End Try
   End Sub

كود :
   'عند اضافة مقال
   Private Sub PostBindingSource_AddingNew(sender As Object, e As System.ComponentModel.AddingNewEventArgs) Handles PostBindingSource.AddingNew
       Try
           Me.KindBindingSource.EndEdit()
           ponameTextBox.Focus()
       Catch ex As OleDb.OleDbException
           MsgBox(ex.ToString)
       End Try
   End Sub



كود :
   'زر اضافة مقال
   Private Sub BindingNavigatorAddNewItem3_Click(sender As System.Object, e As System.EventArgs) Handles BindingNavigatorAddNewItem3.Click
       Try
           If sourceString = String.Empty Then
               MsgBox("لا يوجد مقالات محملة")
               Exit Sub
           End If
           InfoBindingSource.CancelEdit()
           InfoBindingSource.AddNew()

           InfonameTextBox.Text = WebBrowser1.DocumentTitle
           UrlInfoTextBox.Text = WebBrowser1.Url.AbsoluteUri
           '
           BindingNavigatorAddNewItem3.Enabled = False

           '===================
           Dim w1 As Integer = 0
           Using Con
               Dim sw1 As String = "Select Count(IdInfo) AS IdCount From Info Where UrlInfo Like '" & UrlInfoTextBox.Text & "'  "

               Dim MatchCommand As New OleDbCommand(sw1, Con)

               If Con.ConnectionString = Nothing Then Con.ConnectionString = ConnectionString
               Con.Open()
               '
               w1 = MatchCommand.ExecuteScalar
               '
           End Using
           '
           If w1 >= 1 Then
               MsgBox(" هذه المقالة موجودة و متوفرة في القاعدة لن يتم حفظها  ", MsgBoxStyle.Exclamation + MsgBoxStyle.MsgBoxRight + MsgBoxStyle.OkOnly, "تخزين المقال ")
               InfoBindingSource.CancelEdit()
               Exit Sub
           End If

           '==================
           C = InfoBindingSource.Position
       Catch ex As OleDb.OleDbException
           MsgBox(ex.ToString)
       End Try
   End Sub

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

سانتقل الان الى حدث اكتمال تحميل الصفحة في المستعرض لارتباطه بالكود السابق
عند اكتمال تحميل الصفحة انا قمت بوضع كود يقوم بنسخ محتويات الصفحة الى المتغير النصي sourceString
وهو مشمول في الاجراء التالي
كود :
   'اكتمال تحميل الصفحة
   Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
       Try
           sourceString = WebBrowser1.DocumentText
           '
           TxtUrl.Text = e.Url.ToString
           ToolStripStatusLabel2.Text = "    /    " & WebBrowser1.DocumentTitle
           Me.Text = WebBrowser1.DocumentTitle
           CollectAttachments(ListBox1)


           If sourceString = String.Empty Or sourceString.Length <= 14 Then
               BindingNavigatorAddNewItem3.Enabled = False
           Else
               BindingNavigatorAddNewItem3.Enabled = True
               Exit Sub
           End If


       Catch ex As Exception
           MsgBox(ex.ToString)
       End Try
   End Sub

اعرف انني سادخل في متاهة شرح لاننا سنتفرع من اجراء الى اخر و كلها ترتبط ببعضها لذا وجب عليك ان تركز معي و ان تعذرني ان فاتني شرح جزئية معينة.
كما تلاحظ انا قمت بنسخ محتويات الصفحة الى المتغير sourceString 
مع بعض الاسطر التي تخص المستعرض مثل عرض اسم الموضوع الحالي في اسفل البرنامج  و اعلاه 
ثم اختبرت طول المتغير النصي لاقوم بتمكين عملية الاضافة من عدمها
للمعلومات ان طول النص الافتراضي للمستعرض هو 13 على ما اعتقد لانه يحتوي على Tag 
<\HTML><HTML> فارغ بدون محتويات و يبدأ بالتوسع مع وجود معلومات فعلية داخله
الكود ايضا يحتوي على دالة اخرى  CollectAttachments باختصار مهمتها جلب المرفقات عند اكتمال تحميل الصفحة ساشرحه عند وروده

نكمل باقي عمليات الاضافة


كود :
   'عند اضافة مرفق
   Private Sub AttachBindingSource_AddingNew(sender As Object, e As System.ComponentModel.AddingNewEventArgs) Handles AttachBindingSource.AddingNew
       Try
           InfoBindingSource.EndEdit()
       Catch ex As OleDb.OleDbException
           MsgBox(ex.ToString)
       End Try
   End Sub

اما عملية اضافة معلومات المرفقات الى جدول المرفقات في القاعدة فهي عملية متزامنه مع تحميل المرفق الى مجلد التخزين سناتي اليها لاحقا

عمليات الحذف سنؤجل الحديث عنها الان لانها عمليه طويله تجري باتجاهين القاعدة من جهة و الملفات المخزنة من جهة اخرى

نكمل مع باقي الاكواد 

كود :
   'تصفح
   Private Sub BtnBrowse_Click(sender As System.Object, e As System.EventArgs) Handles BtnBrowse.Click

       Try

           If Not Regex.IsMatch(TxtUrl.Text, "^((ht|f)tp(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.[\w]{3,4})?((\?\w+=\w+)?(&\w+=\w+)*)?") Then
               MessageBox.Show("موقع غير صحيح")
               Exit Sub
           Else
               SiteLogin(TxtUrl.Text.Trim)

           End If

       Catch ex As Exception
           Return
       End Try


   End Sub

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


كود :
   Private Sub SiteLogin(ByVal Url As String)
       'رابط الدخول من الاعدادت
       Dim LoginUrl As String = My.Settings.LoginUrl
       'حاوية الكوكيز
       Dim cookieContainer As New CookieContainer()
       'انشاء طلب للدخول
       Dim LoginRequest As HttpWebRequest = DirectCast(WebRequest.Create(LoginUrl), HttpWebRequest)
       LoginRequest.CookieContainer = New CookieContainer
       LoginRequest.ContentType = "application/x-www-form-urlencoded"
       LoginRequest.Method = "POST"
       LoginRequest.KeepAlive = True
       LoginRequest.AllowAutoRedirect = True
       LoginRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1"
       'البارمترات من الاعدادت
       Dim formParams As String = My.Settings.Parmms

       Dim bytes As Byte() = Encoding.UTF8.GetBytes(formParams)
       'كتابة البيانات
       LoginRequest.ContentLength = bytes.Length
       Using os As Stream = LoginRequest.GetRequestStream()
           os.Write(bytes, 0, bytes.Length)
       End Using
       'تحصيل الكوكيز من الموقع و تخزينه في الحاوية
       cookieContainer = GetUriCookieContainer(New Uri(LoginUrl))
       'جعل حاوية الطلب تحتضن الكوكيز
       LoginRequest.CookieContainer = cookieContainer
       'حاوية عامة للكوكيز على مستوى كل الطلبات
       cookies = New CookieContainer
       cookies = cookieContainer


       'استقبال الرد و تخزين الكوكيز
       Dim cookdisc As String
       Using httpWebResponse = DirectCast(LoginRequest.GetResponse(), HttpWebResponse)
           cookies.Add(httpWebResponse.Cookies)
           For Each cook As Cookie In httpWebResponse.Cookies
               result += cook.Name + "=" + cook.Value & ";"
               cookdisc = cook.Name + "=" + cook.Value & ";"

               InternetSetCookie(Url, cookdisc, cook.Expires)

           Next

       End Using
       WebBrowser1.Navigate(Url)

   End Sub

الشرح
  • متغير نصي يحمل رابط صفحة الدخول من الاعدادات
  • انشاء حاوية كوكيز تقوم باحتضان الكوكيز اثناء عملية الطلب و الرد
  • انشاء طلب مع اعطائه رابط صفحة الدخول
  • تفريغ حاوية الكوكيز الخاصة بالطلب
  • بعض المعلومات المطلوب ارسالها مع الطلب و هي تعلميات قياسية خاصة بصفحات الويب يمكنك ايجاد هذه المعلومات عند فتح مصدر اي صفحة ويب و هي كثيرة ليس المكان لشرحها
  • طريقة الطلب هي ادخال معلومات Post
  • المحافظة على الطلب حي يرزق مع تفعيل الارتداد و اعادة التوجيه وفق رد الملقم
  • معلومات قياسية اخرى تتعلق بالمتصفحات يمكنك الاستغناء عنها في بعض المواقع UserAgent
  • FormsParms متغير نصي يحمل معلومات الادخال الضرورية في الموقع و ناخذها من الاعدادات
  • مصفوفة من النوع Byte ستحمل بيانات الدخول وفق الترميز Utf8 الى الموقع
  • بدأ عملية كتابة بيانات المصفوفة في الموقع
  • GetUriCookieContainer هي دالة خاصة ستقوم بجلب الكوكيز من الموقع بعد استقبال رد المصادقة على الدخول و هي تستخدم مكاتب API .
  • ملئ حاوية الكوكيز الخاصة بالطلب بالكوكيز التي حصلنا عليها وفق الدالة السابقة و كذلك ملئ الحاوية العامة التي على مستوى البرنامج بالكوكيز اللازمة cookies
  • الاكواد اللاحقة يمكنك الاستغناء عنها اذ انني احببت ابقائها لتعرف طريقة الحصول على كل قيم الكوكيز و تستفيد منها كأن تخزنها او تعرضها؟
  • اخيرا التوجه الى الصفحة المطلوبة بعد ان تمت المصادقة على دخولنا
طبعا هناك سطر مسؤول عن توريث الكوكيز للمستعرض و هو السطر التالي
كود :
               InternetSetCookie(Url, cookdisc, cook.Expires)

كود :
   ''' <summary>
   ''' اجراء استخدمه عند الحاجة و هو للحصول على الكوكيز من الرابط
   ''' </summary>
   ''' <param name="uri">الرابط</param>
   ''' <returns>يعود بحاوية الكوكيز</returns>
   ''' <remarks>APi الدالة تستخدم مكاتب</remarks>
   Public Shared Function GetUriCookieContainer(uri As Uri) As CookieContainer
       Dim cookies As CookieContainer = Nothing
       Dim datasize As Integer = 8192 * 16
       Dim cookieData As New StringBuilder(datasize)
       '
       If Not InternetGetCookieEx(uri.ToString(), Nothing, cookieData, datasize, InternetCookieHttponly, IntPtr.Zero) Then
           If datasize < 0 Then
               Return Nothing
           End If

           cookieData = New StringBuilder(datasize)
           If Not InternetGetCookieEx(uri.ToString(), Nothing, cookieData, datasize, InternetCookieHttponly, IntPtr.Zero) Then
               Return Nothing
           End If
       End If
       If cookieData.Length > 0 Then
           cookies = New CookieContainer()
           cookies.SetCookies(uri, cookieData.ToString().Replace(";"c, ","c))
       End If
       Return cookies

الكود السابق يسيتخدم مكاتب API ساضعها هنا 
كود :
#Region "Get Set Cookies By APi"
   <DllImport("wininet.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
   Private Shared Function InternetSetCookie(lpszUrlName As String, lpszCookieName As String, lpszCookieData As String) As Boolean
   End Function

   Private Const InternetCookieHttponly As Int32 = &H2000
   <DllImport("wininet.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
   Private Shared Function InternetGetCookieEx(pchURL As String, pchCookieName As String, pchCookieData As StringBuilder, ByRef pcchCookieData As UInteger, dwFlags As Integer, lpReserved As IntPtr) As Boolean
   End Function

#End Region

بعد دخولنا و عرض الصفحة اصبحنا الان امام صفحة معروضه في المتصفح
سنقوم الان بالتقاط المرفقات وفق الاجراء التالي
كود :
   ''' <summary>
   ''' اجراء تحصيل المرفقات من الصفحة و تجميعها في اللست بوكس
   ''' </summary>
   ''' <param name="list"></param>
   ''' <remarks></remarks>
   Private Sub CollectAttachments(ByVal list As ListBox)
       Try
           Dt.Rows.Clear()
           ProgressBar1.Value = 0
           If (WebBrowser1.Document IsNot Nothing) Then
               Dim Elems As HtmlElementCollection
               Dim WebOC As WebBrowser = WebBrowser1
               '
               '
               Elems = WebOC.Document.GetElementsByTagName("a")
               For Each elem As HtmlElement In Elems
                   Dim NameStr As String = elem.GetAttribute("href")

                   If ((NameStr IsNot Nothing) And (NameStr.Length <> 0)) Then

                       '(.zip/.rar/.pdf) This Only For CodeProject Now
                       If NameStr.ToLower().Contains("attachment.php?") Or
                           NameStr.ToLower().Contains(".zip") Or
                           NameStr.ToLower().Contains(".rar") Or
                           NameStr.ToLower().Contains(".doc") Or
                           NameStr.ToLower().Contains(".docx") Or
                           NameStr.ToLower().Contains(".pdf") Then

                           Dim siteUri As New Uri(NameStr)
                           Dim ContentStr As String = elem.InnerText
                           '===========
                           If siteUri.AbsoluteUri.LastIndexOf("/") And Not (NameStr.ToLower().Contains("attachment.php?")) Then
                               ContentStr = siteUri.AbsoluteUri.Substring(siteUri.AbsoluteUri.LastIndexOf("/") + 1)
                           End If

                           Dim row As DataRow = Dt.NewRow
                           row("Urlcol") = siteUri
                           row("Namecol") = ContentStr
                           Dt.Rows.Add(row)
                           '
                           list.DataSource = Dt
                           list.DisplayMember = "Namecol"
                           list.ValueMember = "Urlcol"

                       End If
                   End If
               Next
           End If

       Catch ex As WebException
           MsgBox(ex.ToString)
       End Try

   End Sub
و هو اجراء عادي يستخدم المكتبة RegularExpressions للبحث في مستند HTML عن العناصر التي تحتوي على المرفقات و من ثم الحصول على اسم المرفق ان امكن ؟؟؟؟ و كذلك الرابط
و بعدها ندخل اسم المرفق و رابطه في جدول خاص لنستخدمه لاحقا.
اسم المرفق؟؟؟؟ العملية كثيرا شاقة مع اختلاف بنية المواقع و كثرة استخدام السكربتات من كل شكل و لون و الكثير الكثير جعلني اعيد صياغة الكود عشرات المرات هنا و مازالت المفاجئات تتكرر  
بعد تعبئة الجدول سنقوم باضافة عناصره الى ListBox1 ليصبح لدينا شكل سهل و بسيط للتعامل مع الملفات و تحميلها فقط من خلال تحديدها من ListBox1 و من ثم زر Download .

ماذا بعد ذلك 
الان سندخل الى كود اضافة المرفقات في القاعدة و تحميل الملف و تخزينه في مجلد التخزين
يتبع.....  Sleepy
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
تم الشكر بواسطة: الوادي , Amir_Alzubidy , Hzar


الردود في هذا الموضوع
RE: العلاقات بين الجداول-الاضافة و الحذف و التعديل-برنامج لحفظ مصادر الموقع - بواسطة ابو ليلى - 20-06-16, 06:26 AM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  نظرة على DropBox SDK و التعامل معها +برنامج رفع و تحميل ملفات ابو ليلى 5 5,962 16-08-24, 04:39 PM
آخر رد: ackore
  كيف تتعامل مع برنامج الإكسيل من برنامجك rinawi 7 7,221 12-11-22, 12:11 AM
آخر رد: خالد العصاوي
  برنامج مبيعات ومشتريات وإدارة أعمال ( الفاتورة الإلكترونية ) yassoo1985 2 2,818 04-06-22, 01:14 PM
آخر رد: yassoo1985
Heart طلب برنامج Advanced Installer أبو خالد الشكري 0 1,713 16-05-22, 09:12 PM
آخر رد: أبو خالد الشكري
  أهم طرق إدارة المخازن وتطبيقها على برنامج مخازن وارد ومنصرف Menna ahmeed 0 2,815 27-04-22, 12:52 PM
آخر رد: Menna ahmeed
  طريقة إنشاء برنامج طباعة ملصقات الباركود ملهمـ 1 5,018 22-12-21, 05:09 PM
آخر رد: alessam4pro
Heart [VB.NET] برنامج ادارة المطاعم و الكافيهات mgr21002100 6 7,398 14-01-21, 07:59 PM
آخر رد: abarrak
  مثال للتعامل مع الجداول المرتبطة - عن طريق الكلاسات ابو ليلى 24 16,412 04-10-20, 06:16 PM
آخر رد: محمد بن عطية
  لفهم كيفية الربط الذي يتم بين الجداول viv 4 5,404 03-10-20, 05:34 PM
آخر رد: Arfat007
  تفعيل برنامج Visual Studio 2019 Adilo idabdellah 4 12,556 20-05-20, 11:48 AM
آخر رد: الفاضي

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


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