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

علاقة : one to one بين كلاسين

مغلق
بدأه Dr.Cisco في 31 ديسمبر 2006 · 11 رد · 1,319 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ..

مساء الخير أعزائي الفضلاء ..

هذا تطبيق لما تعلمته في الـ VB.NET ..

وهو يعني بعلاقة : one to one بين كلاسين ..

بين كلاس الـ Department وبين Employee ..

طبعاً المثال بسيط ، وليس الأصل أن العلاقة بن القسم وبين الموظفين علاقة one to one ، لكن كتجربة فقط.. ومن ثم الإنتقال إلى one to many ..

طبعاً المثال فيه خطاً ( نطقي ) عجزت عن كشفه فهو ينفذ وعند الضغط على button لكي يظهر المعلومات تخرج لي رسالة messagebox تحتوي

على كلمة ( False ) ..

للعلم البرنامج يقوم بتعيين قسم وكذلك إضافة موظفين لذلك القسم ..

أرجو مشركتي أيها الأحبة في إيجاد الحل .. وأتوقع أن الحل بسيط لكني لكثرة البحث والتجربة أصاب رأسي ( الشوشرة :) ) ..

تحيات العطرة لكم ..

Public Class employee
	Private name_e As String
	Private ssn_e As String
	Private salary_e As Double
	Private thedepartment As department

	Public Sub New(ByVal n As String, ByVal s As String, ByVal sa As Double)
		setname_e(n)
		setssn_e(s)
		setsalary_e(sa)
		setthedepartment(Nothing)
	End Sub
	Public Sub setname_e(ByVal na As String)
		name_e = na
	End Sub
	Public Sub setssn_e(ByVal ss As String)
		ssn_e = ss
	End Sub
	Public Sub setsalary_e(ByVal sl As Double)
		salary_e = sl
	End Sub
	Public Sub setthedepartment(ByVal depp As department)
		thedepartment = depp
	End Sub
	Public Function getname_e() As String
		Return name_e
	End Function
	Public Function getssn_e() As String
		Return ssn_e
	End Function
	Public Function getsalary_e() As Double
		Return salary_e
	End Function
	Public Function getthedepartment() As department
		Return thedepartment
	End Function
	Public Function tellaboutself() As String
		Dim info As String

		Return info = "Name : " + getname_e() + " SSN : " + getssn_e() + " Salary : " + Convert.ToString(getsalary_e())

	End Function
End Class

Public Class department
	Private depn As String
	Private theemployee As employee
	Private manger As employee
	Public Sub New(ByVal dd As String)
		setdepn(dd)
		settheemployee(Nothing)
		setmanger(Nothing)
	End Sub
	Public Sub setdepn(ByVal d As String)
		depn = d
	End Sub
	Public Sub settheemployee(ByVal emp As employee)
		theemployee = emp
	End Sub
	Public Sub setmanger(ByVal man As employee)
		manger = man
	End Sub
	Public Function getdepn() As String
		Return depn
	End Function
	Public Function gettheemployee() As employee
		Return theemployee
	End Function
	Public Function getmanger() As employee
		Return manger
	End Function
	Public Function TellAboutSelf() As String
		Dim msg As String
		msg = " Dept Name: " & getdepn()
		Return msg
	End Function
End Class

Public Class Form1
	Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

	Public Sub New()
		MyBase.New()

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

		'Add any initialization after the InitializeComponent() call

	End Sub

	'Form overrides dispose to clean up the component list.
	Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
		If disposing Then
			If Not (components Is Nothing) Then
				components.Dispose()
			End If
		End If
		MyBase.Dispose(disposing)
	End Sub

	'Required by the Windows Form Designer
	Private components As System.ComponentModel.IContainer

	'NOTE: The following procedure is required by the Windows Form Designer
	'It can be modified using the Windows Form Designer.  
	'Do not modify it using the code editor.
	Friend WithEvents Button1 As System.Windows.Forms.Button
	<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
		Me.Button1 = New System.Windows.Forms.Button
		Me.SuspendLayout()
		'
		'Button1
		'
		Me.Button1.Font = New System.Drawing.Font("Segoe UI", 15.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
		Me.Button1.ForeColor = System.Drawing.Color.Maroon
		Me.Button1.Location = New System.Drawing.Point(56, 120)
		Me.Button1.Name = "Button1"
		Me.Button1.Size = New System.Drawing.Size(184, 32)
		Me.Button1.TabIndex = 0
		Me.Button1.Text = "one-2-one"
		'
		'Form1
		'
		Me.AutoScaleBaseSize = New System.Drawing.Size(5, 16)
		Me.ClientSize = New System.Drawing.Size(292, 266)
		Me.Controls.Add(Me.Button1)
		Me.Name = "Form1"
		Me.Text = "Form1"
		Me.ResumeLayout(False)

	End Sub

#End Region

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

	End Sub

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		Dim e1 As employee = New employee("Ahmad", "1002", 18000878)
		Dim e2 As employee = New employee("Ali", "1003", 18000878)
		Dim e3 As employee = New employee("Saeed", "1004", 18000878)
		Dim d As department = New department("Markting")



		e1.setthedepartment(d)
		d.settheemployee(e1)

		e2.setthedepartment(d)
		d.settheemployee(e2)

		e3.setthedepartment(d)
		d.settheemployee(e3)

		MessageBox.Show(d.gettheemployee.tellaboutself())
	End Sub
End Class
#2

الخطأ في الكود في كلاس Employee هو في الدالة

 Public Function tellaboutself() As String
		Dim info As String

		Return info = "Name : " + getname_e() + " SSN : " + getssn_e() + " Salary : " + Convert.ToString(getsalary_e())

	End Function

حيث يمكن أن تكون

	Public Function tellaboutself() As String
		Dim info As String = "Name : " + name_e + " SSN : " + ssn_e + " Salary : " + salary_e.ToString

		Return info

	End Function

أو حتى بشكل مختصر أكثر

	Public Function tellaboutself() As String
		Return "Name : " + name_e + " SSN : " + ssn_e + " Salary : " + salary_e.ToString
	End Function

هناك بعض الملاحظات الأخرى

مثلا العبارة

 Convert.ToString(getsalary_e())

فيها ملاحظتان

أولا- بما أنك تستخدم عنصر داخلي ضمن الكلاس و الدالة getsalary_e فقط تعيد القيمة salary_e يمكنك استخدام القيمة salary_e مباشرة بدون الدالة

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

salary_e.ToString()

و أيضا عندما نريد إعادة قيمة - خاصية - يمكننا استخدام Property عوضا عن Funtion

فمثلا إن أردنا فقط أن نقرأ القيمة نستخدم شيئا شبيها بالتالي

	Public ReadOnly Property ReturnSalary() As Double
		Get
			Return salary_e
		End Get
	End Property

وإن أردنا قراءة القيمة وكذلك تغييرها نستخدم شيئا شبيها بالتالي

	Public Property GetSetSalary() As Double
		Get
			Return salary_e
		End Get
		Set(ByVal value As Double)
			salary_e = value
		End Set
	End Property

وبهذا تصبح دالتك tellaboutself كما يلي

	Public ReadOnly Property TellAboutYourSelf() As String
		Get
			Return "Name : " & name_e & " SSN : " & ssn_e & " Salary : " & salary_e.ToString
		End Get
	End Property

ملاحظة اخيرة عندما نريد أن نربط بين سلسلتين نصيتين يفضل استخدام & وليس +

Dim info As String = "Name : " & name_e & " SSN : " & ssn_e & " Salary : " & salary_e.ToString

تم تعديل هذه المشاركة بواسطة samerselo في 31 ديسمبر 2006 في 15:50

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

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

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

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

#3

عفواً اخواني ولكن لدي سؤال ،

إذا حصل أن العلاقه كلها Mondatory من الطرفين فكيف نقوم بهذه الحاله ، هل يهم الترتيب أم انها تترك للمبرمج

#4
{عيسى} كتب:
عفواً اخواني ولكن لدي سؤال ،

إذا حصل أن العلاقه كلها Mondatory من الطرفين فكيف نقوم بهذه الحاله ، هل يهم الترتيب أم انها تترك للمبرمج

يرجى شرح ما تقصد أخ عيسى لم أفهم سؤالك

تم تعديل هذه المشاركة بواسطة samerselo في 31 ديسمبر 2006 في 16:40

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

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

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

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

#5

شكراً أخي سامر ،

في علاقة one to one نعمل reference في كل كلاس للآخر ،

وتكون دالة assign أوبجكت للآخر في الmondatory class .

مثلا العلاقه بين العميل والطلب ، نفرض جدلاً انها one to one ففي رسم الـuml تكون العلاقه mondatory من جهة العميل حيث بأن كل طلب لابد أن يكون لعميل معين ويستحيل وجود طلب بدون عميل معين .

جميل حتى الآن ؟

لكن لو كانت العلاقه one to one وأيضاً mondatory بين الفئتين .

أنا اتذكر ان لها حل لكنه لايحضرني وراودني السؤال هنا عنه ،

شكراً لك أخي سامر والشكر موصول لصاحب الموضوع وبالتوفيق

#6

أخي الفاضل وأستاذي سامر ..

شاكر ومقدر لك تعاونك ..

لدي استفسار .. في علاقة one to one ..

هل الجمل الآتية صحيحة ؟ .. وماذا توقع أن يظهر في الطباعة ..

لإني أرغب بطباعة القسم وهو Markting ومعه الموظفين ..

شكراً جزيلاً ..

		e1.setthedepartment(d)
		d.settheemployee(e1)

		e2.setthedepartment(d)
		d.settheemployee(e2)

		e3.setthedepartment(d)
		d.settheemployee(e3)

		MessageBox.Show(d.gettheemployee.tellaboutself())

تم تعديل هذه المشاركة بواسطة Dr.Cisco في 31 ديسمبر 2006 في 20:03

#7

لا أعتقد بوجود مشكلة في الجمل المذكورة

وبالنسبة لموضوع الطباعة يمكنك عمل إجرائية الطباعة كما تشاء

ابحث عن PrintDocument في المنتدى

تم تعديل هذه المشاركة بواسطة samerselo في 31 ديسمبر 2006 في 22:38

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

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

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

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

#8

حقيقة >> لإنه حينما يقوم بالطباعة .. يقوم بطباعة آخر موظف مضاف فقط !! ..

#9
Dr.Cisco كتب:
حقيقة >> لإنه حينما يقوم بالطباعة .. يقوم بطباعة آخر موظف مضاف فقط !! ..

ذلك لأن الكلاسات عندك تحتفظ بسجل واحد فقط ويمكن حل ذلك بعدة طرق فمثلا

- جعل الكلاس DEpartment يحمل أكثر من موظف وذلك بجعل المتغير theemployee الذي يحمل اسم الموظف مصفوفة أو List أو Collection

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

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

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

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

#10
samerselo كتب:
ذلك لأن الكلاسات عندك تحتفظ بسجل واحد فقط ويمكن حل ذلك بعدة طرق فمثلا

- جعل الكلاس DEpartment يحمل أكثر من موظف وذلك بجعل المتغير theemployee الذي يحمل اسم الموظف مصفوفة أو List أو Collection

ok .. يعني إذا جعلنا كلاس الـ department يحمل أكثر من موظف وذلك بجعل المتغير theemployee مصفوفة ..

حينها هل تنتقل العلاقة من كونها one to one إلى one to many ؟! ..

شكراً جزيلاً لك ..

dr.cisco

تم تعديل هذه المشاركة بواسطة Dr.Cisco في 1 يناير 2007 في 22:38

#11
Dr.Cisco كتب:
ok .. يعني إذا جعلنا كلاس الـ department يحمل أكثر من موظف وذلك بجعل المتغير theemployee مصفوفة ..

حينها هل تنتقل العلاقة من كونها one to one إلى one to many ؟! ..

شكراً جزيلاً لك ..

dr.cisco

ممكن

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

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

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

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

#12

شكراً جزيلاً .. أستاذنا الفاضل محمد ..

dr.cisco ..

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

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