10-04-24, 05:25 AM
10-04-24, 07:06 AM
كل عام وأنت بخير
في السي الشارب إدارة المخلفات يتم تلقائياً
أي بمجرد الانتهاء من عمل المتغير يتم التخلص منه تلقائياً..
هناك حالة استثنائية لا يتم فيها التخلص من المتغيرات تلقائياً وهي عندما تعتمد على مكتبات خارجية غير مبنية بالسي شارب أو الفيجول بيزك دوت نت..
عندها تحتاج التخلص منها من خلال الكود الخاص بالتخلص منها بالعادة يكون (Dispose) ..
أي :
الكلاس الذي تبنيه أنت، لا تقلق بشأنه : سيتم التخلص منه تلقائياً بعد الانتهاء من عمله(هذا العرض ساري فقط في السي شارب والفيجول بيزك دوت نت)..
في السي الشارب إدارة المخلفات يتم تلقائياً
أي بمجرد الانتهاء من عمل المتغير يتم التخلص منه تلقائياً..
هناك حالة استثنائية لا يتم فيها التخلص من المتغيرات تلقائياً وهي عندما تعتمد على مكتبات خارجية غير مبنية بالسي شارب أو الفيجول بيزك دوت نت..
عندها تحتاج التخلص منها من خلال الكود الخاص بالتخلص منها بالعادة يكون (Dispose) ..
أي :
كود :
c.Dispose();الكلاس الذي تبنيه أنت، لا تقلق بشأنه : سيتم التخلص منه تلقائياً بعد الانتهاء من عمله(هذا العرض ساري فقط في السي شارب والفيجول بيزك دوت نت)..
11-04-24, 10:59 AM
شكر الله لك و بارك فيك
عندي استفسار عن الاسلوب الافضل في مناداة الكلاس في الفورم العادي هل في كل اجراء في كلاس الفورم استدعي الكلاس و مافيه ام الافضل تعريف متغير للكلاس في منطقة التعريفات العامة للفورم واستخدمه؟
عندي استفسار عن الاسلوب الافضل في مناداة الكلاس في الفورم العادي هل في كل اجراء في كلاس الفورم استدعي الكلاس و مافيه ام الافضل تعريف متغير للكلاس في منطقة التعريفات العامة للفورم واستخدمه؟
11-04-24, 05:36 PM
لماذا لا يمكن التحرير بملف الاكسل الا بعد انهائه بالكود التالي:
أي المتغيرات التالي يجب ان يغلق أولا:؟
PHP كود :
foreach (Process pro in Process.GetProcessesByName("EXCEL"))
{
pro.Kill();
}
PHP كود :
public Excel.Excel.Application exapp;
public Excel.Excel.Workbook exworkbook;
public Excel.Excel.Worksheet exw;
public Excel.Excel.Range xlrange;
11-04-24, 05:55 PM
بالعادة البعض يصنع كلاس ويضع فيه كل ما لا يريد إظهاره في صفحات أكواد النوافذ ..
ولكن هذا الشيء أيضاً يعقد الأمر وليس يسهله..
الأفضل أن توزع ما تريد وضعه في كلاس على عدة كلاسات..:
مثلا :
- كلاس خاص بالتعامل مع الملفات.
- كلاس يتعامل مع قواعد البيانات.
- كلاس يتعامل مع التشفير وفك التشفير.
- .. إلخ.
وبحسب حاجتك لكل كلاس تعرف أين تعرف هذا الكلاس..
فما تحتاجه مرة واحدة لماذا تستدعيه في بداية كود النافذة ؟؟!!! فقط استدعيه ضمن الاجراء الذي يريده..
وما تعتمد عليه في كل حين أو أغلب الاحداث بنفس القيمة عرفه في بداية الكلاس أو كود النافذة...
--
لكن أدرك جيداً أن من يحمل هذه الأكواد هو البرنامج ولست أنت..
فهي لن تثقل عليك بالمراجعة(فلا تبسطها لتسهل على نفسك .. بل كي لا يقع البرنامج بأخطاء الكائن الغير معرف أو تعارض البيانات المدخلة على الكائن بحسب تتالي الاجراءات على الكائن). يعني (لا تبسط ولا تكرر) إلا إذا البرنامج يستدعي ذلك وليس من أجلك..
مثلا بالعادة المبرمج يعرف كائن اتصال بقاعدة البيانات كائن عام اسمه (Conn)
ولكنه متعود بعد كل عملية يقوم بإغلاق الاتصال ..
فيقوم مثلاً بإٍتخدام الكائن لعمل اتصال بقاعدة البيانات لإدخال بيانات أو التعديل على بيانات محددة.
أثناء الاتصال يقوم بإستدعاء (إجراء يعتمد على نفس كائن الاتصال Conn) ليتحقق من عدم تكرار البيانات
فيقوم سهواً بإغلاق الاتصال للكائن (Conn) بعد التحقق من عدم تكرار البيانات(مثلاً)
ثم يتابع بكوده من أجل إدخال البيانات بما أنها غير مكرر. فيقع بخطأ أن الكائن غير منشأ (مع العلم أنه أنشأه في بداية الكود).
فيحتار من أين جاء الخطأ وبعد ساعات من البحث ربما يكتشف أن الاجراء الذي استدعاه للتحقق من عدم تكرار البيانات هو من أغلق الاتصال..
فما الحل الآن ؟؟ هل يغير سياسته بجعل قاعدة البيانات مفتوحة دوماً أم يغلقها بعد كل اتصال ويعلق في كل مرة ينادي إجراء ما من داخل كود آخر..
-- مثل هذه الحالة الحل فيها : هو أن ينشأ كائن اتصال جديد يستخدمه فقط في الاجراءات السريعة التي يناديها من خلال الأكواد الأخرى (مثلا ConnP)..
فهذا الكائن إن أغلقه أو تركه مفتوحاً أو أجرى عليه أي عملية أخرى لن تؤثر على سير البيانات التي سلكها في الكود الأساسي ولن يتعارض معه أبداً..
-- وعلى هذا المثال قس كثيراً من الأمور التي ستتعامل معها في برنامجك..
--
لكن لتعرف إن عرفت الكائن في حدث ما فبمجرد الخروج من الحدث يتم التخص من الكائن..
لكن إن عرفته على مستوى كلاس أو نافذة سيبقى الكائن موجود في الذاكرة حتى يتم غلاق الكلاس.. ومن ثم يتم التخلص من الكائن بشكل تلقائي.
أي كلاس تقوم بتعريفه بعبارة (class C; ) لن يتم حجز له مكان أو أي بايت في الذاكرة..
ولكن عندما تجعله يساوي شيء ما ،، مثلاً : (class C = new class(); ) فإنه يحجز مكاناً له في الذاكرة وأصبح الان مؤثراً ..
ولكن هذا الشيء أيضاً يعقد الأمر وليس يسهله..
الأفضل أن توزع ما تريد وضعه في كلاس على عدة كلاسات..:
مثلا :
- كلاس خاص بالتعامل مع الملفات.
- كلاس يتعامل مع قواعد البيانات.
- كلاس يتعامل مع التشفير وفك التشفير.
- .. إلخ.
وبحسب حاجتك لكل كلاس تعرف أين تعرف هذا الكلاس..
فما تحتاجه مرة واحدة لماذا تستدعيه في بداية كود النافذة ؟؟!!! فقط استدعيه ضمن الاجراء الذي يريده..
وما تعتمد عليه في كل حين أو أغلب الاحداث بنفس القيمة عرفه في بداية الكلاس أو كود النافذة...
--
لكن أدرك جيداً أن من يحمل هذه الأكواد هو البرنامج ولست أنت..
فهي لن تثقل عليك بالمراجعة(فلا تبسطها لتسهل على نفسك .. بل كي لا يقع البرنامج بأخطاء الكائن الغير معرف أو تعارض البيانات المدخلة على الكائن بحسب تتالي الاجراءات على الكائن). يعني (لا تبسط ولا تكرر) إلا إذا البرنامج يستدعي ذلك وليس من أجلك..
مثلا بالعادة المبرمج يعرف كائن اتصال بقاعدة البيانات كائن عام اسمه (Conn)
ولكنه متعود بعد كل عملية يقوم بإغلاق الاتصال ..
فيقوم مثلاً بإٍتخدام الكائن لعمل اتصال بقاعدة البيانات لإدخال بيانات أو التعديل على بيانات محددة.
أثناء الاتصال يقوم بإستدعاء (إجراء يعتمد على نفس كائن الاتصال Conn) ليتحقق من عدم تكرار البيانات
فيقوم سهواً بإغلاق الاتصال للكائن (Conn) بعد التحقق من عدم تكرار البيانات(مثلاً)
ثم يتابع بكوده من أجل إدخال البيانات بما أنها غير مكرر. فيقع بخطأ أن الكائن غير منشأ (مع العلم أنه أنشأه في بداية الكود).
فيحتار من أين جاء الخطأ وبعد ساعات من البحث ربما يكتشف أن الاجراء الذي استدعاه للتحقق من عدم تكرار البيانات هو من أغلق الاتصال..
فما الحل الآن ؟؟ هل يغير سياسته بجعل قاعدة البيانات مفتوحة دوماً أم يغلقها بعد كل اتصال ويعلق في كل مرة ينادي إجراء ما من داخل كود آخر..
-- مثل هذه الحالة الحل فيها : هو أن ينشأ كائن اتصال جديد يستخدمه فقط في الاجراءات السريعة التي يناديها من خلال الأكواد الأخرى (مثلا ConnP)..
فهذا الكائن إن أغلقه أو تركه مفتوحاً أو أجرى عليه أي عملية أخرى لن تؤثر على سير البيانات التي سلكها في الكود الأساسي ولن يتعارض معه أبداً..
-- وعلى هذا المثال قس كثيراً من الأمور التي ستتعامل معها في برنامجك..
--
لكن لتعرف إن عرفت الكائن في حدث ما فبمجرد الخروج من الحدث يتم التخص من الكائن..
لكن إن عرفته على مستوى كلاس أو نافذة سيبقى الكائن موجود في الذاكرة حتى يتم غلاق الكلاس.. ومن ثم يتم التخلص من الكائن بشكل تلقائي.
أي كلاس تقوم بتعريفه بعبارة (class C; ) لن يتم حجز له مكان أو أي بايت في الذاكرة..
ولكن عندما تجعله يساوي شيء ما ،، مثلاً : (class C = new class(); ) فإنه يحجز مكاناً له في الذاكرة وأصبح الان مؤثراً ..
11-04-24, 08:09 PM
كل محاولاتي لمنع الرسالة التالي فشلت:
System.Runtime.InteropServices.COMException: 'تعذر حفظ 'db.xlsx' لأن الملف للقراءة فقط.
System.Runtime.InteropServices.COMException: 'تعذر حفظ 'db.xlsx' لأن الملف للقراءة فقط.
(11-04-24, 05:36 PM)justforit كتب : [ -> ]لماذا لا يمكن التحرير بملف الاكسل الا بعد انهائه بالكود التالي:
أي المتغيرات التالي يجب ان يغلق أولا:؟PHP كود :
foreach (Process pro in Process.GetProcessesByName("EXCEL"))
{
pro.Kill();
}
PHP كود :
public Excel.Excel.Application exapp;
public Excel.Excel.Workbook exworkbook;
public Excel.Excel.Worksheet exw;
public Excel.Excel.Range xlrange;
11-04-24, 10:52 PM
الاكسل من التطبيقات التي لا تقبل سوى مستخدم وحيد..
لازم بعد كل عملية أن تقوم بإغلاق الملف إن أنتهيت من المتغير الذي تستخدمه للتحرير والتعديل ..
إغلاق الملف ..
exworkbook.Close
ثم إغلاق متغير برنامج التحرير :
exapp.Quit
لازم بعد كل عملية أن تقوم بإغلاق الملف إن أنتهيت من المتغير الذي تستخدمه للتحرير والتعديل ..
إغلاق الملف ..
exworkbook.Close
ثم إغلاق متغير برنامج التحرير :
exapp.Quit