المشاركات : 662
المواضيع 39
الإنتساب : Feb 2014
السمعة :
195
الشكر: 1474
تم شكره 1740 مرات في 622 مشاركات
11-07-17, 08:50 PM
(آخر تعديل لهذه المشاركة : 11-07-17, 11:28 PM {2} بواسطة ابو ليلى .)
السلام عليكم و رحمة الله و بركاته
الاخ ابو راشد ,
انت لم تقم باقفال الاجراء في حال كانت بعض البيانات فارغة او ناقصة
كذلك سيتم حفظ فواتير بدون تفاصيل بالنظر للكود لديك و بالتالي بيانات بلا معنى
و الافضل ان يكون لديك فحص قبل الادخال
كما يلي
اولاً ليكن لدي مثل هذه الدالة تختبر الاسطر الفارغة
PHP كود :
private bool Checkthis ( int i ) { if ( String . IsNullOrEmpty ( dgv_Orders . Rows [ i ]. Cells [ 1 ]. Value . ToString ()) || String . IsNullOrEmpty ( ID_Orders . Text ) || String . IsNullOrEmpty ( dgv_Orders . Rows [ i ]. Cells [ 3 ]. Value . ToString ()) || String . IsNullOrEmpty ( dgv_Orders . Rows [ i ]. Cells [ 4 ]. Value . ToString ())) { return false ; } else { return true ; } }
و من ثم يمكنني توظيفها في زر الحفظ كما يلي
PHP كود :
private void btn_save_Click ( object sender , EventArgs e ) { if ( ID_Orders . Text == string .Empty || datetim . Text == string .Empty || name_Customer . Text == string .Empty || TOTAL . Text == string .Empty /*|| txt_PAID.Text == string.Empty || txt_SURPLUS.Text == string.Empty */ || dgv_Orders . Rows . Count < 1 ) { MessageBox . Show ( "لايمكن حفظ الفاتورة خالية من المعلومات" , "تنبيه" , MessageBoxButtons . OK , MessageBoxIcon . Warning ); return ; } int p = 0 ; for ( int i = 0 ; i < dgv_Orders . Rows . Count - 1 ; i ++) { if ( Checkthis ( i ) == true ) { p += 1 ; ORD . ADD_ORDERS_DETAILS ( dgv_Orders . Rows [ i ]. Cells [ 1 ]. Value . ToString (), Convert . ToInt32 ( ID_Orders . Text ), Convert . ToInt32 ( dgv_Orders . Rows [ i ]. Cells [ 3 ]. Value ), dgv_Orders . Rows [ i ]. Cells [ 4 ]. Value . ToString ()); } } if ( p > 0 ) { ORD . ADD_ORDERS ( Convert . ToInt32 ( ID_Orders . Text ), datetim . Value , Convert . ToInt32 ( ID_Customer . Text ), note . Text , txtSALESMAN . Text , TOTAL . Text , txt_PAID . Text , txt_SURPLUS . Text ); MessageBox . Show ( "تم حفظ الفاتورة بنجاح" , "الحفظ" ); btnAdd . Enabled = true ; btn_save . Enabled = false ; print . Enabled = true ; note . Enabled = false ; datetim . Enabled = false ; ID_Customer . Enabled = false ; name_Customer . Enabled = false ; comb_type_Customer . Enabled = false ; txtSALESMAN . Enabled = false ; dgv_Orders . Enabled = false ; TOTAL . Enabled = false ; txt_PAID . Enabled = false ; txt_SURPLUS . Enabled = false ; note . Clear (); ID_Customer . Clear (); name_Customer . Clear (); comb_type_Customer . Clear (); ; txtSALESMAN . Clear (); TOTAL . Clear (); txt_PAID . Clear (); txt_SURPLUS . Clear (); Dt . Clear (); } }
لتحصل على عمود الاجمالي
PHP كود :
DataColumn Qt = new DataColumn { Caption = "الكمية" , ColumnName = "Qt" , DataType = Type . GetType ( "System.Decimal" ) }; DataColumn Price = new DataColumn { Caption = "السعر" , ColumnName = "Price" , DataType = Type . GetType ( "System.Decimal" ) }; DataColumn Totals = new DataColumn { Caption = "الاجمالي" , ColumnName = "Totals" , DataType = Type . GetType ( "System.Decimal" ), Expression = "Price * Qt" }; Dt . Columns . Add ( Qt ); Dt . Columns . Add ( Price ); Dt . Columns . Add ( Totals ); dgv_Orders . DataSource = Dt ;
ابتعد عن الاسماء العربية ؟؟؟
بالتوفيق .
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
المشاركات : 30
المواضيع 5
الإنتساب : Jul 2017
السمعة :
0
الشكر: 4
تم شكره 13 مرات في 8 مشاركات
12-07-17, 11:50 PM
(آخر تعديل لهذه المشاركة : 12-07-17, 11:56 PM {2} بواسطة أبو راشد عبدالوهاب .)
أستاذي الكريم أبو ليلى أشكرك وأسأل الله أن يزيدك علماً إلى علمك وفهماً إلى فهمك
السلام عليكم ورحمة الله وبركاته يا أبا ليلى
أستاذي الكريم زادك الله شرفاً ورفعة
أستاذي فيما يخص جمع الأعمدة داخل الداتا قريد فيو فقد جربت الكود الذي وضعتَ في مشاركتك فوجدته سليماً
وكتبت كوداً عندي فوجدته سليماً أيضاً
لكن الأعداد العشرية لا يتم حسابها ولا إظهار قيمتها في عمود الإجمالي
فهل العلة تكون في نفس الجدول؟
أي :هل يجب علي تغيير نوع البيانات في قاعدة البيانات لأني قد وضعته
Varchar(50)
فهل أغيره إلى
float
أو إلى
Real
أم أقوم بتحويله فقط في الكود
أم أقوم بتحويله في الإجراءات المخزنة أيضا
هذا الكود الذي قمت بكتابته
كود :
try
{
C2 = int.Parse(dgv_Orders [2, e.RowIndex].Value.ToString());
C3 = int.Parse(dgv_Orders [3, e.RowIndex].Value.ToString());
total= C2 * C3;
dgv_Orders.Rows[e.RowIndex].Cells[4].Value = total;
}
catch (Exception)
{
}
أما فيما يخص كود الحفظ فإنه يتم تفريغ الداتا قريد فيو قبل الإدخال بمجرد النقر بزر الماوس لتحديد عمود إدخال الباركود
فهل يمكن تحديد موضع الفوكس بعد زر الفتح مباشرة في داخل عمود الباركود
داخل الداتا قريد
معذرة حاولت تكبير الخط ولم يقبل
المشاركات : 662
المواضيع 39
الإنتساب : Feb 2014
السمعة :
195
الشكر: 1474
تم شكره 1740 مرات في 622 مشاركات
13-07-17, 02:54 AM
(آخر تعديل لهذه المشاركة : 13-07-17, 03:02 AM {2} بواسطة ابو ليلى .)
السلام عليكم و رحمة الله و بركاته
الاخ ابو راشد,
لا اعرف ما تقصده تحديداً , الاجمالي يحسب بشكل جيد وفق الكود السابق
بالنسبة لنقل التركيز للخلية المحددة (الباركود) , اضف هذين السطرين اخر زر الاضافة لديك
PHP كود :
dgv_Orders . CurrentCell = dgv_Orders . Rows [ 0 ]. Cells [ 1 ]; dgv_Orders . BeginEdit ( true );
المطلوب
PHP كود :
TOTAL . Text = ( from DataGridViewRow row in dgv_Orders . Rows where row . Cells [ "Totals" ]. FormattedValue . ToString () != string .Empty select Convert . ToDecimal ( row . Cells [ "Totals" ]. FormattedValue )). Sum (). ToString ();
الملفات المرفقة
صورة/صور
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
المشاركات : 30
المواضيع 5
الإنتساب : Jul 2017
السمعة :
0
الشكر: 4
تم شكره 13 مرات في 8 مشاركات
(13-07-17, 02:54 AM) ابو ليلى كتب : السلام عليكم و رحمة الله و بركاته
الاخ ابو راشد,
لا اعرف ما تقصده تحديداً , الاجمالي يحسب بشكل جيد وفق الكود السابق
بالنسبة لنقل التركيز للخلية المحددة (الباركود) , اضف هذين السطرين اخر زر الاضافة لديك
PHP كود :
dgv_Orders . CurrentCell = dgv_Orders . Rows [ 0 ]. Cells [ 1 ]; dgv_Orders . BeginEdit ( true );
المطلوب
PHP كود :
TOTAL . Text = ( from DataGridViewRow row in dgv_Orders . Rows where row . Cells [ "Totals" ]. FormattedValue . ToString () != string .Empty select Convert . ToDecimal ( row . Cells [ "Totals" ]. FormattedValue )). Sum (). ToString ();
بسم الله الرحمن الرحيم
الأستاذ الكريم أبو ليلى
تحية طيبة وبعد
السلام عليكم ورحمة الله وبركاته
أشكرك على هذه الأكواد التي ساعدتني بها تباعاً
ولكن إما لمعرفتي القاصرة بالبرمجة
وإما لخطأ ما في التكويد لم يستبن لي موضعه
لازال البرنامج يرسل لي رسائل الخطأ
فهل يتكرم أستاذي أبو ليلى بمساعدتي في التعديل عبر TeamViewer
إن كان الجواب نعم فما أنسب الأوقات لكم أستاذي بتوقيت مكة المكرمة
لنتواصل معكم للمساعدة
المشاركات : 30
المواضيع 5
الإنتساب : Jul 2017
السمعة :
0
الشكر: 4
تم شكره 13 مرات في 8 مشاركات
(11-07-17, 08:50 PM) ابو ليلى كتب : ابتعد عن الاسماء العربية ؟؟؟
بالتوفيق .
الأستاذ الكريم أبو ليلى
النصيحة مقبولة
لكن أرجوا أن تفسر السر لذلك
حتى يستفيد منه الجميع في المستقبل
هل الأسماء العربية متعبة للبرنامج في المستقبل أم ماذا؟
المشاركات : 662
المواضيع 39
الإنتساب : Feb 2014
السمعة :
195
الشكر: 1474
تم شكره 1740 مرات في 622 مشاركات
ليس هناك مشكلة يا صديقي من استخدام اي لغة في كتابة الحقول سواء بالعربية او بالصينية
و لكن لسلامة قراءة الكود و عدم الوقوع في اخطاء اثناء اجراء عمليات ما فيفضل كتابة الاسماء بلغة الكود الام (الانكليزية) اما من ناحية العرض يمكنك تسمية الحقول بالاسماء العربية.
و من جهة اخرى قد تحتاج الى قراءة الكود على جهاز لا يدعم العربية وقتها لن تجد الا اشارات مشفرة مكان هذه الاسماء
و يغنيك ايضاً عن استخدام الاقواس في حال كانت اسماء الحقول مركبة .
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
المشاركات : 30
المواضيع 5
الإنتساب : Jul 2017
السمعة :
0
الشكر: 4
تم شكره 13 مرات في 8 مشاركات
الإخوة الكرام
السلام عليكم ورحمة الله وبركاته
أولاً أعتذر عن التأخر
ثانياً الكود الذي يضهر فيه الخطأ هو كود
تحديد التركيز داخل عمود معين داخل الداتا قريد فيو
رسالة الخطأ
المشاركات : 662
المواضيع 39
الإنتساب : Feb 2014
السمعة :
195
الشكر: 1474
تم شكره 1740 مرات في 622 مشاركات
السلام عليكم و رحمة الله و بركاته
الاخ ابو راشد لا ادري ما المشكلة لديك و لكن وفق المثال الخاص بك , و التعديل الذ جرى عليه
البرنامج يعمل بشكل سلس دون اي اشارة الى خطأ يذكر
وهذا الكود و مكان وضعه في الاجراء
PHP كود :
private void btnAdd_Click ( object sender , EventArgs e ) { this . ID_Orders . Text = ORD . ADD_ID_ORDERS (). Rows [ 0 ][ 0 ]. ToString (); FRM_CUST_N_ORD frm = new FRM_CUST_N_ORD (); frm . ShowDialog (); this . ID_Customer . Text = frm . DGV_ORD_PRNT . CurrentRow . Cells [ 0 ]. Value . ToString (); this . name_Customer . Text = frm . DGV_ORD_PRNT . CurrentRow . Cells [ 1 ]. Value . ToString (); this . comb_type_Customer . Text = frm . DGV_ORD_PRNT . CurrentRow . Cells [ 3 ]. Value . ToString (); dgv_Orders . Focus (); btnAdd . Enabled = false ; btn_save . Enabled = true ; print . Enabled = true ; note . Enabled = true ; datetim . Enabled = true ; ID_Customer . Enabled = false ; name_Customer . Enabled = false ; comb_type_Customer . Enabled = false ; txtSALESMAN . Enabled = false ; dgv_Orders . Enabled = true ; TOTAL . Enabled = true ; txt_PAID . Enabled = true ; txt_SURPLUS . Enabled = true ; dgv_Orders . CurrentCell = dgv_Orders . Rows [ 0 ]. Cells [ 1 ]; dgv_Orders . BeginEdit ( true ); }
و هذا كود النموذج لديك
PHP كود :
using System ; using System . Collections . Generic ; using System . ComponentModel ; using System . Data ; using System . Drawing ; using System . Linq ; using System . Text ; using System . Threading . Tasks ; using System . Windows . Forms ; using System . Globalization ; namespace test_orders . PL { public partial class FRM_ORDERS : Form { private static FRM_ORDERS frm ; static void frm_FormClosed ( object sender , FormClosedEventArgs e ) { frm = null ; } public static FRM_ORDERS getMainForm { get { if ( frm == null ) { frm = new FRM_ORDERS (); frm . FormClosed += new FormClosedEventHandler ( frm_FormClosed ); } return frm ; } } BL . CLS_ORDERS ORD = new BL . CLS_ORDERS (); void calculateAmount () { try { if ( txt_PAID . Text != string .Empty || TOTAL . Text != string .Empty) { double SURPLUS = Convert . ToDouble ( txt_PAID . Text ) - Convert . ToDouble ( TOTAL . Text ); txt_SURPLUS . Text = SURPLUS . ToString (); } } catch { MessageBox . Show ( "لايمكن ترك الحقل فارغا" , "تنبيه" , MessageBoxButtons . OK , MessageBoxIcon . Error ); } return ; } void ResizDGV () { this . dgv_Orders . RowHeadersWidth = 4 ; this . dgv_Orders . Columns [ 0 ]. Width = 50 ; this . dgv_Orders . Columns [ 1 ]. Width = 140 ; this . dgv_Orders . Columns [ 2 ]. Width = 345 ; this . dgv_Orders . Columns [ 3 ]. Width = 95 ; this . dgv_Orders . Columns [ 4 ]. Width = 95 ; this . dgv_Orders . Columns [ 5 ]. Width = 95 ; // this.dgv_Orders.Columns[6].Width = 95; } DataTable Dt = new DataTable (); void createDataTable () { Dt . Columns . Add ( "تسلسل" ); Dt . Columns . Add ( "الباركود" ); Dt . Columns . Add ( "اسم الصنف" ); DataColumn Qt = new DataColumn { Caption = "الكمية" , ColumnName = "Qt" , DataType = Type . GetType ( "System.Decimal" ) }; DataColumn Price = new DataColumn { Caption = "السعر" , ColumnName = "Price" , DataType = Type . GetType ( "System.Decimal" ) }; DataColumn Totals = new DataColumn { Caption = "الاجمالي" , ColumnName = "Totals" , DataType = Type . GetType ( "System.Decimal" ), Expression = "Price * Qt" }; Dt . Columns . Add ( Qt ); Dt . Columns . Add ( Price ); Dt . Columns . Add ( Totals ); dgv_Orders . DataSource = Dt ; } public FRM_ORDERS () { InitializeComponent (); if ( frm == null ) frm = this ; createDataTable (); ResizDGV (); } private void btnAdd_Click ( object sender , EventArgs e ) { this . ID_Orders . Text = ORD . ADD_ID_ORDERS (). Rows [ 0 ][ 0 ]. ToString (); FRM_CUST_N_ORD frm = new FRM_CUST_N_ORD (); frm . ShowDialog (); this . ID_Customer . Text = frm . DGV_ORD_PRNT . CurrentRow . Cells [ 0 ]. Value . ToString (); this . name_Customer . Text = frm . DGV_ORD_PRNT . CurrentRow . Cells [ 1 ]. Value . ToString (); this . comb_type_Customer . Text = frm . DGV_ORD_PRNT . CurrentRow . Cells [ 3 ]. Value . ToString (); dgv_Orders . Focus (); btnAdd . Enabled = false ; btn_save . Enabled = true ; print . Enabled = true ; note . Enabled = true ; datetim . Enabled = true ; ID_Customer . Enabled = false ; name_Customer . Enabled = false ; comb_type_Customer . Enabled = false ; txtSALESMAN . Enabled = false ; dgv_Orders . Enabled = true ; TOTAL . Enabled = true ; txt_PAID . Enabled = true ; txt_SURPLUS . Enabled = true ; dgv_Orders . CurrentCell = dgv_Orders . Rows [ 0 ]. Cells [ 1 ]; dgv_Orders . BeginEdit ( true ); } private void btn_save_Click ( object sender , EventArgs e ) { if ( ID_Orders . Text == string .Empty || datetim . Text == string .Empty || name_Customer . Text == string .Empty || TOTAL . Text == string .Empty /*|| txt_PAID.Text == string.Empty || txt_SURPLUS.Text == string.Empty */ || dgv_Orders . Rows . Count < 1 ) { MessageBox . Show ( "لايمكن حفظ الفاتورة خالية من المعلومات" , "تنبيه" , MessageBoxButtons . OK , MessageBoxIcon . Warning ); return ; } int p = 0 ; for ( int i = 0 ; i < dgv_Orders . Rows . Count - 1 ; i ++) { if ( Checkthis ( i ) == true ) { p += 1 ; ORD . ADD_ORDERS_DETAILS ( dgv_Orders . Rows [ i ]. Cells [ 1 ]. Value . ToString (), Convert . ToInt32 ( ID_Orders . Text ), Convert . ToInt32 ( dgv_Orders . Rows [ i ]. Cells [ 3 ]. Value ), dgv_Orders . Rows [ i ]. Cells [ 4 ]. Value . ToString ()); } } if ( p > 0 ) { ORD . ADD_ORDERS ( Convert . ToInt32 ( ID_Orders . Text ), datetim . Value , Convert . ToInt32 ( ID_Customer . Text ), note . Text , txtSALESMAN . Text , TOTAL . Text , txt_PAID . Text , txt_SURPLUS . Text ); MessageBox . Show ( "تم حفظ الفاتورة بنجاح" , "الحفظ" ); btnAdd . Enabled = true ; btn_save . Enabled = false ; print . Enabled = true ; note . Enabled = false ; datetim . Enabled = false ; ID_Customer . Enabled = false ; name_Customer . Enabled = false ; comb_type_Customer . Enabled = false ; txtSALESMAN . Enabled = false ; dgv_Orders . Enabled = false ; TOTAL . Enabled = false ; txt_PAID . Enabled = false ; txt_SURPLUS . Enabled = false ; note . Clear (); ID_Customer . Clear (); name_Customer . Clear (); comb_type_Customer . Clear (); ; txtSALESMAN . Clear (); TOTAL . Clear (); txt_PAID . Clear (); txt_SURPLUS . Clear (); Dt . Clear (); } } private bool Checkthis ( int i ) { if ( String . IsNullOrEmpty ( dgv_Orders . Rows [ i ]. Cells [ 1 ]. Value . ToString ()) || String . IsNullOrEmpty ( ID_Orders . Text ) || String . IsNullOrEmpty ( dgv_Orders . Rows [ i ]. Cells [ 3 ]. Value . ToString ()) || String . IsNullOrEmpty ( dgv_Orders . Rows [ i ]. Cells [ 4 ]. Value . ToString ())) { return false ; } else { return true ; } } private bool Check ( int i ) { if ( String . IsNullOrEmpty ( dgv_Orders . Rows [ i ]. Cells [ 1 ]. Value . ToString ()) || String . IsNullOrEmpty ( ID_Orders . Text ) || String . IsNullOrEmpty ( dgv_Orders . Rows [ i ]. Cells [ 3 ]. Value . ToString ()) || String . IsNullOrEmpty ( dgv_Orders . Rows [ i ]. Cells [ 4 ]. Value . ToString ())) { return false ; } else { return true ; } } private void dgv_Orders_CellEndEdit ( object sender , DataGridViewCellEventArgs e ) { } private void dgv_Orders_CellEnter ( object sender , DataGridViewCellEventArgs e ) { dgv_Orders . Rows [ e . RowIndex ]. Cells [ 0 ]. Value = e . RowIndex + 1 ; if ( dgv_Orders . CurrentCell . ColumnIndex == 1 ) { if ( dgv_Orders . CurrentRow . Index > 0 ) { BL . CLS_ORDERS order = new BL . CLS_ORDERS (); DataTable dt = order . LIST_BARCODE ( dgv_Orders . Rows [ dgv_Orders . CurrentRow . Index - 1 ]. Cells [ 1 ]. Value . ToString ()); if ( dt . Rows . Count > 0 ) { dgv_Orders . Rows [ dgv_Orders . CurrentRow . Index - 1 ]. Cells [ 2 ]. Value = dt . Rows [ 0 ][ 2 ]. ToString (); dgv_Orders . Rows [ dgv_Orders . CurrentRow . Index - 1 ]. Cells [ 3 ]. Value = "1" ; dgv_Orders . Rows [ dgv_Orders . CurrentRow . Index - 1 ]. Cells [ 4 ]. Value = dt . Rows [ 0 ][ 4 ]. ToString (); } else { try { dgv_Orders . Rows [ dgv_Orders . CurrentRow . Index - 1 ]. Cells [ 1 ]. Value . ToString (); MessageBox . Show ( " هذا الصنف لم يتم تسجيله" , "تنبيه" , MessageBoxButtons . OK , MessageBoxIcon . Stop ); } catch { dgv_Orders . CurrentRow . Cells [ 1 ] = null ; } } } } TOTAL . Text = ( from DataGridViewRow row in dgv_Orders . Rows where row . Cells [ "Totals" ]. FormattedValue . ToString () != string .Empty select Convert . ToDecimal ( row . Cells [ "Totals" ]. FormattedValue )). Sum (). ToString (); } private void print_Click ( object sender , EventArgs e ) { this . Cursor = Cursors . WaitCursor ; int ID_ORDER = Convert . ToInt32 ( ORD . get_lest_orders_for_prnt (). Rows [ 0 ][ 0 ]); RPT . CrystalReport1 REPORT = new RPT . CrystalReport1 (); RPT . FRM_RPT_PRUNT frm = new RPT . FRM_RPT_PRUNT (); REPORT . SetDataSource ( ORD . PRINT_ORDERS ( ID_ORDER )); frm . crystalReportViewer1 . ReportSource = REPORT ; frm . ShowDialog (); this . Cursor = Cursors .Default; } private void button1_Click ( object sender , EventArgs e ) { FRM_ORDERS_LIST frm = new FRM_ORDERS_LIST (); frm . ShowDialog (); } private void FRM_ORDERS_Load ( object sender , EventArgs e ) { } } }
بالتوفيق
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
المشاركات : 30
المواضيع 5
الإنتساب : Jul 2017
السمعة :
0
الشكر: 4
تم شكره 13 مرات في 8 مشاركات
وعليكم السلام ورحمة الله وبركاته
أخي العزيز
الملاحظ أنكم تقومون بالإدخال يدوياً
لكن تصميم البرنامج عندي يتم الإدخال فيه عن طريق الماسح الضوئي
(قارئ الباركود)
فإذا لم يكن هذا هو السبب
فبرأيك أخي الكريم أين تكمن العلة
أسأل الله أن لايحرمك أجر اجتهادك معي
المشاركات : 30
المواضيع 5
الإنتساب : Jul 2017
السمعة :
0
الشكر: 4
تم شكره 13 مرات في 8 مشاركات
21-08-17, 11:55 AM
(آخر تعديل لهذه المشاركة : 21-08-17, 12:06 PM {2} بواسطة أبو راشد عبدالوهاب .)
أعتذر إليكم إخواني عن إنقطاعي الطويل
وذلك لظروف والدتي الصحية
دعائكم لوالدتي بالشفاء العاجل
أخي أبو ليلى هل اطلعت على آخر ماكتبت بخصوص مايظهر لي
أشكرك جزيل الشكر
وكذلك أعضاء المنتدى