منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : كيف ندمر او نحذف الكلاس من الذاكرة
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
كل عام و انتم بخير

 Class1 c = new Class1();

c.myform = this;

اريد انهاء هذا الـ c
كل عام وأنت بخير

في السي الشارب إدارة المخلفات يتم تلقائياً
أي بمجرد الانتهاء من عمل المتغير يتم التخلص منه تلقائياً..

هناك حالة استثنائية لا يتم فيها التخلص من المتغيرات تلقائياً وهي عندما تعتمد على مكتبات خارجية غير مبنية بالسي شارب أو الفيجول بيزك دوت نت..
عندها تحتاج التخلص منها من خلال الكود الخاص بالتخلص منها بالعادة يكون (Dispose) ..  
أي : 
كود :
c.Dispose();

الكلاس الذي تبنيه أنت، لا تقلق بشأنه : سيتم التخلص منه تلقائياً بعد الانتهاء من عمله(هذا العرض ساري فقط في السي شارب والفيجول بيزك دوت نت)..
شكر الله لك و بارك فيك
عندي استفسار عن الاسلوب الافضل في مناداة الكلاس في الفورم العادي هل في كل اجراء في كلاس الفورم استدعي الكلاس و مافيه ام الافضل تعريف متغير للكلاس في منطقة التعريفات العامة للفورم واستخدمه؟
لماذا لا يمكن التحرير بملف الاكسل الا بعد انهائه بالكود التالي:
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
بالعادة البعض يصنع كلاس ويضع فيه كل ما لا يريد إظهاره في صفحات أكواد النوافذ ..
ولكن هذا الشيء أيضاً يعقد الأمر وليس يسهله..
الأفضل أن توزع ما تريد وضعه في كلاس على عدة كلاسات..:
مثلا :
- كلاس خاص بالتعامل مع الملفات.
- كلاس يتعامل مع قواعد البيانات.
- كلاس يتعامل مع التشفير وفك التشفير.
- .. إلخ.

وبحسب حاجتك لكل كلاس تعرف أين تعرف هذا الكلاس..
فما تحتاجه مرة واحدة لماذا تستدعيه في بداية كود النافذة ؟؟!!!   فقط استدعيه ضمن الاجراء الذي يريده..
وما تعتمد عليه في كل حين أو أغلب الاحداث بنفس القيمة عرفه في بداية الكلاس أو كود النافذة...
--
لكن أدرك جيداً أن من يحمل هذه الأكواد هو البرنامج ولست أنت..
فهي لن تثقل عليك بالمراجعة(فلا تبسطها لتسهل على نفسك .. بل كي لا يقع البرنامج بأخطاء الكائن الغير معرف أو تعارض البيانات المدخلة على الكائن بحسب تتالي الاجراءات على الكائن).  يعني (لا تبسط ولا تكرر) إلا إذا البرنامج يستدعي ذلك وليس من أجلك..

مثلا بالعادة المبرمج يعرف كائن اتصال بقاعدة البيانات كائن عام  اسمه (Conn)
ولكنه متعود بعد كل عملية يقوم بإغلاق الاتصال ..
فيقوم مثلاً بإٍتخدام الكائن لعمل اتصال بقاعدة البيانات لإدخال بيانات أو التعديل على بيانات محددة.
أثناء الاتصال يقوم بإستدعاء (إجراء يعتمد على نفس كائن الاتصال Conn) ليتحقق من عدم تكرار البيانات
فيقوم سهواً بإغلاق الاتصال للكائن (Conn) بعد التحقق من عدم تكرار البيانات(مثلاً)
ثم يتابع بكوده من أجل إدخال البيانات بما أنها غير مكرر.  فيقع بخطأ أن الكائن غير منشأ (مع العلم أنه أنشأه في بداية الكود).
فيحتار من أين جاء الخطأ وبعد ساعات من البحث ربما يكتشف أن الاجراء الذي استدعاه للتحقق من عدم تكرار البيانات هو من أغلق الاتصال..
فما الحل الآن ؟؟ هل يغير سياسته بجعل قاعدة البيانات مفتوحة دوماً  أم يغلقها بعد كل اتصال ويعلق في كل مرة ينادي إجراء ما من داخل كود آخر..
--  مثل هذه الحالة الحل فيها : هو أن ينشأ كائن اتصال جديد يستخدمه فقط في الاجراءات السريعة التي يناديها من خلال الأكواد الأخرى (مثلا ConnP)..
فهذا الكائن إن أغلقه أو تركه مفتوحاً أو أجرى عليه أي عملية أخرى لن تؤثر على سير البيانات التي سلكها في الكود الأساسي ولن يتعارض معه أبداً..

-- وعلى هذا المثال قس كثيراً من الأمور التي ستتعامل معها في برنامجك..

-- 
لكن لتعرف إن عرفت الكائن في حدث ما فبمجرد الخروج من الحدث يتم التخص من الكائن..
لكن إن عرفته على مستوى كلاس أو نافذة سيبقى الكائن موجود في الذاكرة حتى يتم غلاق الكلاس.. ومن ثم يتم التخلص من الكائن بشكل تلقائي.

أي كلاس تقوم بتعريفه بعبارة (class C; )  لن يتم حجز له مكان أو أي بايت في الذاكرة.. 
ولكن عندما تجعله يساوي شيء ما ،، مثلاً : (class C = new class(); ) فإنه يحجز مكاناً له في الذاكرة وأصبح الان مؤثراً ..
كل محاولاتي لمنع الرسالة التالي فشلت:
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
الاكسل من التطبيقات التي لا تقبل سوى مستخدم وحيد..
لازم بعد كل عملية أن تقوم بإغلاق الملف إن أنتهيت من المتغير الذي تستخدمه للتحرير والتعديل ..
إغلاق الملف ..
exworkbook.Close

ثم إغلاق متغير برنامج التحرير :
exapp.Quit