المشاركات : 749
المواضيع 238
الإنتساب : May 2018
السمعة :
209
الشكر: 740
تم شكره 2214 مرات في 752 مشاركات
السلام عليكم ورحمة الله
الفكرة اننا سوف نصنع برنامج لانشاء الكود اللازم للاتصال بقاعدة البيانات من اضافة وتعديل وحذف
وسوف نستخدم درس الاخ أبو ليلي ورابطه هنا
http://vb4arb.com/vb/showthread.php?tid=19925
انا جعلته ينشي كلاس لاي جدول على طريقة ابو ليلي المطلوب الان احد ينضر في الدرس ويضيف له شيئا
لن اكمل اذا لم يكن العمل جماعي
وبعد ان يكتمل سوف يجربه كل منا على اي قاعدة بيانات يريد
لتحميل المشروع من هنا
PHP كود :
http://www.m5zn.com/d/?16875873
المشاركات : 24
المواضيع 5
الإنتساب : Mar 2018
السمعة :
0
الشكر: 9
تم شكره 12 مرات في 8 مشاركات
(09-05-18, 11:40 PM)viv كتب : السلام عليكم ورحمة الله
الفكرة اننا سوف نصنع برنامج لانشاء الكود اللازم للاتصال بقاعدة البيانات من اضافة وتعديل وحذف
وسوف نستخدم درس الاخ أبو ليلي ورابطه هنا
http://vb4arb.com/vb/showthread.php?tid=19925
انا جعلته ينشي كلاس لاي جدول على طريقة ابو ليلي المطلوب الان احد ينضر في الدرس ويضيف له شيئا
لن اكمل اذا لم يكن العمل جماعي
وبعد ان يكتمل سوف يجربه كل منا على اي قاعدة بيانات يريد
لتحميل المشروع من هنا
PHP كود :
http://www.m5zn.com/d/?16875873
أفكار رائعة وموضوع ابو ليلى اول مرة أشاهده.. يحتاج الأمر مني بعض التركيز لأفهم هكذا أفكار وجاري تحميل المشروع
بارك الله بكم
المشاركات : 749
المواضيع 238
الإنتساب : May 2018
السمعة :
209
الشكر: 740
تم شكره 2214 مرات في 752 مشاركات
10-05-18, 12:07 AM
(آخر تعديل لهذه المشاركة : 10-05-18, 12:18 AM {2} بواسطة viv.)
تم اجرءا بعض التعديل
اولا قتل الكائن DataGrideView بعد الانتهاء فقد كنت مستعجل
PHP كود :
Dim row As DataGridViewRow = New DataGridViewRow Try TextBox1.Text = "Employy" TextBox2.Text = "Id" row.CreateCells(DataGridView1) row.Cells(0).Value = "id" row.Cells(1).Value = "Integer" DataGridView1.Rows.Add(row) row = New DataGridViewRow row.CreateCells(DataGridView1) row.Cells(0).Value = "FirstName" row.Cells(1).Value = "String" DataGridView1.Rows.Add(row) row = New DataGridViewRow row.CreateCells(DataGridView1) row.Cells(0).Value = "Age" row.Cells(1).Value = "Date" DataGridView1.Rows.Add(row) Catch ex As Exception
Finally row.Dispose() End Try
وايضا تغيير الكود الذي في حدث النقر كالتالي :
PHP كود :
Addtext("Public Class TB_" & TextBox1.Text) Addtext("Inherits DbGo") Addtext(" ")
For Each row As DataGridViewRow In DataGridView1.Rows If row.Cells(0).Value <> "" Then Addtext("Private " & "_" & row.Cells(0).Value & " As " & row.Cells(1).Value) End If Next
Addtext(" ")
Addtext("Private ID_Key As String =""" & TextBox2.Text & """") Addtext("Private TableName As String =""" & TextBox1.Text & """")
Addtext(" " & vbCrLf)
For Each row As DataGridViewRow In DataGridView1.Rows If row.Cells(0).Value <> "" Then Addtext("Public Property " & TextBox1.Text & "_" & row.Cells(0).Value & " As " & row.Cells(1).Value) Addtext("Get", True) Addtext(" Return _" & row.Cells(0).Value, True) Addtext("End Get", True) Addtext("Set(value As" & row.Cells(1).Value & ")", True) Addtext(" _" & row.Cells(0).Value & "= value", True) Addtext("End Set", True) Addtext("End Property") Addtext(" ") End If Next RichTextBox1.AppendText("End Class") Panel1.Visible = False
واضافة الاجراء التالي :
PHP كود :
Private Sub Addtext(str As String, Optional tab As Boolean = False) If tab = True Then RichTextBox1.AppendText(vbTab & str & vbCrLf) Else RichTextBox1.AppendText(str & vbCrLf) End If
End Sub
وهذا للاختصار والتقليل من الشوشرة
في الحدث للزر Sample يمكن اضافة الامر التالي
PHP كود :
DataGridView1.Rows.Clear()
المشاركات : 660
المواضيع 39
الإنتساب : Feb 2014
السمعة :
196
الشكر: 1420
تم شكره 1747 مرات في 622 مشاركات
10-05-18, 01:12 AM
(آخر تعديل لهذه المشاركة : 10-05-18, 01:48 AM {2} بواسطة ابو ليلى.)
السلام عليكم و رحمة الله و بركاته
الاخ الكريم,
بما ان المثال لديك اعتمد على الجداول في مثالي السابق , فلن اتكلم كثيراً عنه.
لكن ما الفائدة من كتابة نمط ثابت اقصد طريقة انشاء Properitys عن طريقة كتابتها يدوياً في الكود البرمجي.
ليس من فائدة تذكر لانك تستطيع استخدام زر التاب مرتين و يقوم المحرر بانشاء الخصائص بسرعة لك او عن طريق المؤشر الذكي في المحرر.
ما يهمني صراحة هو استخدام الفئات المتقدمة في قلب اللغة لتقوم هي بانشاء الخصائص و الانواع و كل شيئ احتاجه عن طريق فئة قاعدية انا اقوم ببرمجتها و توريثها و هي تتكفل بباقي العمل (Reflection) هي الحل لهذا الموضوع
بطريقة بسيطة يمكنني اختصار الكثير مما سبق في مثالي وفق مثال ساقدم شرح بسيط عنه هنا.
من جهة اخرى يجب ان تمتلك طريقة لتقوم وحدها بالتعرف على الجدول و حقوله و انواع الحقول فيه و تقوم هي نفسها باجراء عمليات التحويل لتتطابق مع انواع اللغة و ما يقابلها (اعرف انك تملك الطريقة) و انتظر منك ان تقوم بها بالشكل الاوسع في مثالك القادم.
ما رايته في المثال بسيط و هو بمثابة كتابة اسطر و نسخها الى الواجهة (لديك اكثر من ذلك) فقط افرج عنه
----------------------------------------------------------------------
بالنسبة للمثال الذي اقصده تابع معي هذه الكلاسات البسيطة و ستعرف ما اقصده عند دراسته.
مثلاً لدي برنامج لاحد الاخوة و هو يخص عمله (المثال هنا مختصر).
يتالف من 3 جداول (جدول تصنيفات-جدول محتوى - جدول حلقات او اجزاء)
البرنامج لهاوي مسلسلات و افلام بالمختصر
الجداول الثلاثة تنشئ عبر كلاسات بسيطة وفق ما يلي.
PHP كود :
Public Class tblCategory Public id As Integer Public CategoryName As String End Class
PHP كود :
Public Class tblSubVideo Public id As Integer Public SubVideo As String Public LinkVideo As String Public VideoId As Integer End Class
PHP كود :
Public Class tblVideo Public id As Integer Public VideoName As String Public CategoryId As Integer End Class
كما تلاحظ لم ادخل في اي نوع من الخصائص او غيرها مجرد حقول بسيطة.
الان ننتقل الى الفئة القاعدية المسؤولة عن العمل
PHP كود :
Imports System.Reflection Public Class Cls_TableBase(Of Cls_TableBase) Public TableName As String Public Entry As String Public Table As DataTable
Public Sub New() TableName = GetType(Cls_TableBase).Name Entry = TableName.Remove(0, 3) TableFromFileds() End Sub
Private Function TableFromFileds() As DataTable Dim Types() As String = {"Int32", "Int64", "String", "Object", "DateTime", "Date"} Table = New DataTable(GetType(Cls_TableBase).Name)
Dim MyField As FieldInfo() = GetType(Cls_TableBase).GetFields() For i As Integer = 0 To MyField.Length - 1
If Types.Contains(MyField(i).FieldType.Name) Then Dim Column As New DataColumn With {.ColumnName = MyField(i).Name, .DataType = MyField(i).FieldType} If Not Table.Columns.Contains(Column.ColumnName) Then If MyField(i).Name = "id" And MyField(i).FieldType.Name = "Int32" Then With Column .AutoIncrement = True .AutoIncrementSeed = 1 .AutoIncrementStep = 1 .AllowDBNull = False End With End If Table.Columns.Add(Column) End If
End If Next i
Return Table End Function
اضف مديول (Module) كما بالشكل التالي , المديول ليس لها علاقة بعملنا و فكرتنا و لكن ليعمل معك المثال فقط
PHP كود :
Module ML_MyExten Dim Myds As New DataSet() Public Function GenrateDataset(Table As DataTable) As DataSet Myds.Namespace = "AboLayla" If Not (Myds.Tables.Contains(Table.TableName)) Then Myds.Tables.Add(Table) End If Return Myds End Function
<Runtime.CompilerServices.Extension> Public Sub GenrateRelations(DS As DataSet) If Myds.Tables.Count = 3 Then Dim Relation1 As DataRelation = New DataRelation("Re1", Myds.Tables(0).Columns("id"), Myds.Tables(1).Columns(2)) Myds.Relations.Add(Relation1) Dim foreignKey1 As ForeignKeyConstraint = Relation1.ChildKeyConstraint foreignKey1.DeleteRule = Rule.Cascade foreignKey1.UpdateRule = Rule.Cascade foreignKey1.AcceptRejectRule = AcceptRejectRule.Cascade
Dim Relation2 As DataRelation = New DataRelation("Re2", Myds.Tables(1).Columns("id"), Myds.Tables(2).Columns(3)) Myds.Relations.Add(Relation2) Dim foreignKey2 As ForeignKeyConstraint = Relation2.ChildKeyConstraint foreignKey2.DeleteRule = Rule.Cascade foreignKey2.UpdateRule = Rule.Cascade foreignKey2.AcceptRejectRule = AcceptRejectRule.Cascade
End If End Sub
End Module
الان ناتي الى النموذج , ادرج نموذج و ضع عليه 3 كائنات DataGridView
كل واحد يخص جدول محدد
كود النموذج
PHP كود :
Imports System.Xml
Public Class Form1 Dim Catogary As New Cls_TableBase(Of tblCategory) Dim Video As New Cls_TableBase(Of tblVideo) Dim SubVideo As New Cls_TableBase(Of tblSubVideo) Dim Path As String = Application.StartupPath + "\DB.xml" Shared DS As New DataSet Dim BnCat, BnVideo, BnSubvideo As New BindingSource
Private Sub BtnSaveXml_Click(sender As Object, e As EventArgs) Handles BtnSaveXml.Click DS.WriteXml(Path) End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load DS = GenrateDataset(Catogary.Table) DS = GenrateDataset(Video.Table) DS = GenrateDataset(SubVideo.Table) DS.GenrateRelations()
If Not IO.File.Exists(Path) Then DS.WriteXml(Path) End If
BnCat.DataSource = DS.Tables(Catogary.TableName) BnVideo.DataSource = BnCat BnVideo.DataMember = "Re1"
BnSubvideo.DataSource = BnVideo BnSubvideo.DataMember = "Re2"
DataGridView1.DataSource = BnCat DataGridView2.DataSource = BnVideo DataGridView3.DataSource = BnSubvideo
If IO.File.Exists(Path) Then DS.ReadXml(Path) End If
GenrateDataGridViewStyle(DataGridView1, {"id"}) GenrateDataGridViewStyle(DataGridView2, {"id", "CategoryId"}) GenrateDataGridViewStyle(DataGridView3, {"id", "VideoId"})
End Sub
Private Sub CreateDoc() If Not IO.File.Exists(Application.StartupPath + "\DB.xml") Then
Dim Doc As New XmlDocument
Doc.AppendChild(Doc.CreateElement("tblCategory")) For Each column As DataColumn In Catogary.Table.Columns Doc.DocumentElement.AppendChild(Doc.CreateElement(column.ColumnName)) Next Doc.Save(Application.StartupPath + "\DB.xml") Doc = Nothing End If
End Sub
Private Sub GenrateDataGridViewStyle(Dgv As DataGridView, ColumnsToHide() As String) Dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells If Dgv.Columns.Count > 0 Then For Each column As DataGridViewColumn In Dgv.Columns If ColumnsToHide.Contains(column.Name) Then column.Visible = False Else column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill End If Next End If
End Sub
End Class
الكود يتعامل مع قاعدة بيانات Xml لكي لا ندخل في قواعد بيانات
الكود هنا مبسط لغرض انارة حول تقنية Reflection .
ادرس Reflection جيدأ و سترى اكوادك اصبحت قادرة على انجاز اشياء لم تتصورها بهذه السهولة.
من الاضافات الجميلة استخدمتها في احد المشاريع
اذا كنت تحب التجميل
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
المشاركات : 749
المواضيع 238
الإنتساب : May 2018
السمعة :
209
الشكر: 740
تم شكره 2214 مرات في 752 مشاركات
10-05-18, 01:50 AM
(آخر تعديل لهذه المشاركة : 10-05-18, 02:05 AM {2} بواسطة viv.)
إقتباس :لكن ما الفائدة من كتابة نمط ثابت اقصد طريقة انشاء Properitys عن طريقة كتابتها يدوياً في الكود البرمجي.
لا ليست ثابتة انا استخدم نفس طريقتك ولكن باسماء مختلفة للكلاسس والخصائص والحقول يعني على حسب تسمية الجدول والحقل تكون الخصائص .
إقتباس :ليس من فائدة تذكر لانك تستطيع استخدام زر التاب مرتين و يقوم المحرر بانشاء الخصائص بسرعة لك او عن طريق المؤشر الذكي في المحرر.
المشكلة قد يطلب الاخرون كتابة كل شئ حتى هذه
إقتباس :ما يهمني صراحة هو استخدام الفئات المتقدمة في قلب اللغة لتقوم هي بانشاء الخصائص و الانواع و كل شيئ احتاجه عن طريق فئة قاعدية انا اقوم ببرمجتها و توريثها و هي تتكفل بباقي العمل (Reflection) هي الحل لهذا الموضوع
بالشويش علينا لاحظ انني تركت الدوت نت منذ 2005 واسمع فهذا فقط من هنا وهناك ولا اجيدها حتى الان
إقتباس :من جهة اخرى يجب ان تمتلك طريقة لتقوم وحدها بالتعرف على الجدول و حقوله و انواع الحقول
المشكلة هنا تحتاج ان تتصل بقاعدة البيانات فعلا ، وكل شخص يستخدم قاعدة بيانات مختلفة قلت نتركها الان
إقتباس :بالنسبة للمثال الذي اقصده تابع معي هذه الكلاسات البسيطة و ستعرف ما اقصده عند دراسته.
سادرسه الان لافهمه جيدا قبل العودة وسوف ادرس الـ Reflection
من الاضافات الجميلة استخدمتها في احد المشاريع
قلت نترك التجميل حتى انتهاء المشروع .
ما اسم هذه الاداة أذكر انه كان معي اداة تظهر الكود بهذا التنسيق وكانت تقراء ايضا الفرامورك وتظهر حتى الفئات والاجراءت عند النقر على زر Ctrl+spase
اكمال تلقائي يعني .
سوف احتاجها في نهاية المشروع
المشاركات : 660
المواضيع 39
الإنتساب : Feb 2014
السمعة :
196
الشكر: 1420
تم شكره 1747 مرات في 622 مشاركات
اسم الاداة FastColoredTextBox
يمكنك البحث عنها و استخدامها , ليس فيها الكثير من المزايا , لا تدعم العربية , لان مبدئها يعتمد على الرسم كما هو محرر لغتنا الجميلة , غير ان محررنا يدعم العربية و فيه الكثير من المزايا.
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
المشاركات : 749
المواضيع 238
الإنتساب : May 2018
السمعة :
209
الشكر: 740
تم شكره 2214 مرات في 752 مشاركات
10-05-18, 01:14 PM
(آخر تعديل لهذه المشاركة : 10-05-18, 01:16 PM {2} بواسطة viv.)
حسنا كانت هناك بعض المشاكل في الكود
يقول Contains ليس عضو في من ضمن المجموعة او المصفوفة system.Array لقد حلت المشكلة بطريقة اخرى
PHP كود :
If Types.Contains(MyField(i).FieldType.Name) Then
اذا لم تخونني ذاكرتي اعتقد ان هناك كائن ربما commandbuilder بامكانه توليد ايضا كائنات بنفسه بناء على كلاسس موجود او Dataset
المشاركات : 749
المواضيع 238
الإنتساب : May 2018
السمعة :
209
الشكر: 740
تم شكره 2214 مرات في 752 مشاركات
اعتقد عرفت من اين ابداء
PHP كود :
Public Function CreateClass(ByVal className As String, ByVal properties As Dictionary(Of String, Type)) As Type
Dim myDomain As AppDomain = AppDomain.CurrentDomain Dim myAsmName As New AssemblyName("MyAssembly") Dim myAssembly As AssemblyBuilder = myDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.Run)
Dim myModule As ModuleBuilder = myAssembly.DefineDynamicModule("MyModule")
Dim myType As TypeBuilder = myModule.DefineType(className, TypeAttributes.Public)
myType.DefineDefaultConstructor(MethodAttributes.Public)
For Each o In properties
Dim prop As PropertyBuilder = myType.DefineProperty(o.Key, PropertyAttributes.HasDefault, o.Value, Nothing)
Dim field As FieldBuilder = myType.DefineField("_" + o.Key, GetType(Integer), FieldAttributes.[Private])
Dim getter As MethodBuilder = myType.DefineMethod("get_" + o.Key, MethodAttributes.[Public] Or MethodAttributes.SpecialName Or MethodAttributes.HideBySig, o.Value, Type.EmptyTypes) Dim getterIL As ILGenerator = getter.GetILGenerator() getterIL.Emit(OpCodes.Ldarg_0) getterIL.Emit(OpCodes.Ldfld, field) getterIL.Emit(OpCodes.Ret)
Dim setter As MethodBuilder = myType.DefineMethod("set_" + o.Key, MethodAttributes.[Public] Or MethodAttributes.SpecialName Or MethodAttributes.HideBySig, Nothing, New Type() {o.Value}) Dim setterIL As ILGenerator = setter.GetILGenerator() setterIL.Emit(OpCodes.Ldarg_0) setterIL.Emit(OpCodes.Ldarg_1) setterIL.Emit(OpCodes.Stfld, field) setterIL.Emit(OpCodes.Ret)
prop.SetGetMethod(getter) prop.SetSetMethod(setter)
Next
Return myType.CreateType()
End Function
المشاركات : 749
المواضيع 238
الإنتساب : May 2018
السمعة :
209
الشكر: 740
تم شكره 2214 مرات في 752 مشاركات
انا اعجبتني الفكرة وصرت اجربها وتركت المشروع
PHP كود :
http://www.m5zn.com/d/?16876286
المشاركات : 749
المواضيع 238
الإنتساب : May 2018
السمعة :
209
الشكر: 740
تم شكره 2214 مرات في 752 مشاركات
الملف بالمرفقات او الرابط
|