المتابعون للمدونة

الثلاثاء، 29 يناير 2019

شاب الصبي


DataRow Class Methods

وسائل فئة صف البيانات DataRow Class:
 
له نسخة HasVersion:
تعيد true، إذا كان السجل الحالي يمتلك نسخة البيانات الموضحة في المعامل المرسل إلي هذه الوسيلة، وهو من نوع المرقم DataRowVersion الذي تعرفنا عليه من قبل.
والمثال التالي يعرض قيمة الخانة الأولى في نسخة السجل المقترحة إن وجدت:
if (Row.HasVersion(DataRowVersion.Proposed))
    MessageBox.Show(Row[0,
                  DataRowVersion.Proposed].ToString( ));
 
تغيير الحالة إلى مضاف SetAdded:
تغير قيمة الخاصية RowState إلى Addded.. وتسبب هذه الوسيلة خطأ في البرنامج إذا كان كانت حالة السجل تشير إلى أنه معدل.. ولحل هذه المشكلة، عليك استدعاء الوسيلة AcceptChanges أولا.
 
تغيير الحالة إلى معدل SetModified:
تغير قيمة الخاصية RowState إلى Modified.. وتسبب هذه الوسيلة خطأ في البرنامج إذا كان كانت حالة السجل تشير إلى أنه معدل.. ولحل هذه المشكلة، عليك استدعاء الوسيلة AcceptChanges أولا.
 
قبول التغييرات AcceptChanges:
يؤدّي استدعاء هذه الوسيلة إلى قبول التغييرات التي حدثت على الصف الحالي منذ أن تمّ تحميله من قاعدة البيانات، أو منذ آخر مرّة تمّ فيها استدعاء الوسيلة AcceptChanges.. ليس معنى هذا أنّ هذه التغييرات سيتمّ حفظها في قاعدة البيانات، ولكن سيتمّ النظر إليها على أنها البيانات الأصليّة للسجل، ولن يمكنك التراجع عنها.. لاحظ أن هذه الوسيلة تفعل ما يلي:

تكلمي


DataRow Class Properties

خصائص فئة صف البيانات DataRow Class:
 
الجدول Table:
تعيد كائن الجدول DataTable الذي يحتوي على السجلّ الحالي.. تذكر أنك لا تستطيع إنشاء سجل جديد بدون استخدام الوسيلة NewRow من أحد الجداول، لهذا حتى لو لم يكن السجل مضافا إلى مجموعة صفوف الجدول Rows، فإن هذه الخاصية ستظل تشير دائما إلى الجدول الذي تم إنشاء السجل الحالي منه.
 
المفهرس Indexer:
يقرأ أو يغير القيمة المحفوظة في إحدى خانات السجل الحالي.. والقيمة العائدة من النوع Object، ليمكنك التعامل مع مختلف أنواع الأعمدة.. وللمفهرس الصيغ التالية:
1- بعض الصيغ لها معامل واحد، يستقبل اسم العمود أو رقمه، أو كائن العمود DataColumn الذي يمثله.. والمثال التالي يقرأ اسم المؤلف الموجود في الصفّ الثالث في جدول المؤلفين (الصفّ الأوّل هو الصف رقم صفر):
var R = Ds.Tables["Authors"].Rows[2];
var X = R["Author"];
وهو ما يمكنك فعله في سطر واحد كالتالي:
var X = Ds.Tables["Authors"].Rows[2]["Author"];
حيث يبدو أننا نتعامل مع مجموعة الصفوف Rows كأنها مصفوفة مصفوفات.
أما لو كنت تتعامل مع مجموعة بيانات محددة النوع، فسيختصر الكود السابق إلى:
var X = Ds.Authors[2]["Author"];
أو بصورة أفضل:

لبان


كل الحاجات الحلوة ليه زي اللبان؟
والدنيا زي القـُلة طرشة بجوز ودان
وانت اللي متعشم واتاريك من زمان
فارس حلاوة وتحته في المولد حصان
محمد حمدي غانم

ارتجالة في محاولة لمجاراة خفة ظل صديقي معتز، لكنها قلبت بغم :D :D :D

DataRow Class


 فئة صفّ البيانات DataRow Class 

تتعامل هذه الفئة مع أحد صفوف الجدول، وهي لا تمتلك حدث إنشاء عاما Public Constructor، لهذا لا تستطيع إنشاء نسخة جديدة منها مباشرة، وبدلا من هذا عليك استخدام الوسيلة DataTable.NewRow للحصول على كائن صف جديد.. الحكمة من هذا، هي أن الوسيلة NewRow تستخدم مخطط الجدول لإنشاء صف له نفس الأعمدة بنفس أنواع البيانات ونفس الترتيب.. والكود التالي يعرّف صفّا جديدا ويضيفه إلى جدول الكتب:
var TblBooks = Ds.Tables["Books"];
DataRow BooksRow = TblBooks.NewRow( );
TblBooks.Rows.Add(BooksRow); 

 
من كتاب من الصفر إلى الاحتراف: برمجة قواعد البيانات بتقنية ADO.NET

 

الأحد، 27 يناير 2019

With me

عندما تكونين معي يا عزيزتي
لا يوجدُ ما أخشاه
إلا أن أفقدَك!
حينما أنظرُ في عينِك
أسقطُ باتجاهِ السماء
أهي عميقةٌ جدا، أم عاليةٌ بعيدة المنال؟
لا أدري
لا أتشبثُ بأي شيءٍ إلا حبِّك
محمد حمدي غانم، 2018

أنا ودراجتي والشعر


أنا ودراجتي والشعر
 

منذ يومين تداعت إلى ذهني ذكريات كثيرة جميلة عن عشقي لركوب الدراجات.. ففي مثل هذه الأيام منذ 26 عاما خرجت إلى الشوارع بأول دراجة كبيرة أمتلكها.

طبعا وأنا طفل اشتري لي أبي رحمه الله أكثر من دراجة صغيرة، لكن كنت ألعب بها على سطح المنزل لدواعي الأمان.

بعد ذلك في المرحلة الإعدادية كنت أستأجر دراجة كل يوم خميس لمدة ساعة أو اثنتين بعد انتهاء اليوم الدراسي أنا وصديقي أ. محمد عبد الواحد، ونستمتع بجولة في مدينتنا وما يحيط بها من أراض زراعية، قبل أن أذهب للعب كرة القدم في الملعب.. وطبعا كنت في بداية تعلمي لركوب الدراجات الكبيرة في تلك الفترة، وأخذت عدة سقطات ممتازة مزقت بعض ملابسي، وفي مرة صدمت طفلا صدمة خفيفة، وبسبب الارتباك صدمت أخاه بعده على بعد ثلاثة أمتار ولا أدري كيف نجوت من جدتهما في ذلك اليوم :D.. الحمد لله طبعا لم يصابا بأذى.. ظل محمد عبد الواحد يذكرني بهذا اليوم بعدها لسنوات :D.

وبمثل هذه التدريبات (الرائعة) طوال ثلاث سنوات، صرت محترفا في ركوب الدراجات، وأستطيع أن أحافظ على توازني حتى بدون أن أمسك مقود الدراجة بأي من يديّ.. وهذا شجعني على أن أطلب من أبي رحمه الله شراء دراجة لي، وقد وعدني إن حصلت على مجموع كبير في الشهادة الإعدادية فسيشتريها لي، وهو أمر بسيط فقد كان ترتيبي الأول على المدرسة بالفعل كل شهر وفي نصف عام وفي نهاية العام طوال المرحلة الإعدادية بفضل الله، لكن يبدو أنني تحمست جدا بسبب عشقي للدراجات، وحصلت في ذلك العام على المركز الثاني على مستوى محافظة دمياط، وصار أبي ملزما بشراء هذه الدراجة لي، مع ملاحظة أن ثمنها كان يقترب من نصف راتبه الحكومي حينها!

وقد بر أبي بوعده رغم هذا، لكن بعد عدة شهور، حينما سنحت الفرصة واشتراها بالتقسيط من معرض للسلع أقامته التربية والتعليم، وفوجئت به يناديني لأحملها في الفصل الدراسي الأول من الصف الأول الثانوي (في نهاية عام 1992)، حيث وضعتها في صالون الشقة، مع قاعدة صارمة بعدم نزولها الشارع إلا في إجازة نصف العام!

ربما كانت هذه أكثر هدية مبهجة أهداها لي أبي في حياته، ولم يتفوق عليها بعد ذلك إلا شراؤه أول حاسوب لي بعد ذلك بسنوات، وثمنه حينها كان أكبر من ضعف راتبه.. لكن أبي رحمه الله لم يعتد أن يحرمنا من شيء، وقد سافر مرتين في حياته لينفق علينا ويعلمنا، المرة الثانية كانت وهو في الأربعينات وأنا في الصف الثاني الثانوي، وكانت سنوات صعبة عليه في الغربة بسبب سنه ومرض السكري المصاب به، وصعبة علينا بسبب افتقاد دوره الأبوي في سن المراهقة في عصر لم يكن فيه انترنت ومحادثات فديو ووسائل تواصل اجتماعي تقرّب البعيد، ما عدا بعض مكالمات الهاتف الدولية كل حين وآخر، أو بعض الخطابات وأشرطة التسجيل.

للأسف: الاختيارات أمام الأب في مصر قاسية، خاصة حينما يكون موظفا حكوميا ليس له مصدر دخل آخر غير الراتب الحكومي.. فإما أن يحرم أبناءه من بعض ما يريدونه، وإما أن يحرمهم منه هو نفسه ليسافر ويحقق متطلباتهم!.. ووجهة نظري التي ترسخت بعد هذه التجربة، أن تدريب الأبناء على العمل في الإجازة الصيفية للمساهمة في أعباء الأسرة - أو على الأقل لشراء بعض ما يحتاجونه - أفضل لشخصيتهم، مع الإقرار بصعوبة إيجاد بيئة عمل محترمة في مصر لا تفسد فيها أخلاق الطفل أو المراهق، وهو ما قرر أبي ألا يعرضنا له.. كلها اختيارات صعبة، وكل منها له ثمن يجب أن يدفع!

نعود إلى دراجتي الجديدة التي حصلت عليها، والتي ظلت حبيسة في الصالون بغلافها لشهرين، ولكم أن تتخيلوا كيف كنت أجلس بجانبها كل يوم وأستنشق عبيرها المطاطي في انتظار اليوم الموعود لقص الشريط، وتدشين نورماندي تو :D

حتى أخيرا جاء هذا اليوم، وأخذت إجازة نصف العام، وألقيت كتب المدرسة في سلة المهملات وهرعت لإخراج دراجتي إلى الشوارع لأول مرة في يناير 1993، وذهبت لتربيط صواميلها جيدا عند المعلم طاهر عبد الواحد صديقي الزجّال المبدع وأمهر عجلاتي في الروضة.

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

ومن حينها إلى اليوم وأنا لا أتوقف عن ركوب دراجتي، خاصة أنني أكره ركوب الدرجات النارية لأنها غير آمنة، كما أنني لا أحب قيادة السيارات وليس لدي أي نية ولا رغبة في امتلاك واحدة.

طبعا الآن أركب الدراجة الثالثة بعد سرقة دراجتين سابقتين :(.

الدراجة الثانية اشتراها أخي محسن لنفسه واستوليت أنا عليها بعد أن سافر وركنت الدراجة الأولى في مخزن البيت، حتى جاء أبي يستأذنني أن يعطيها لأحد أقاربه فوافقت لأنه من اشتراها لي في الأساس وخاصة أني لم أكن أستخدمها، وللأسف سُرقت هذه الدراجة ممن أعطاها له بعد فترة وجيزة، وسُرقت دراجة أخي محسن بعدها بعدة أشهر!

والدراجة الثالثة اشتريتها بأجري في كتابة دليل استخدام حفص لشركة RDI بعد سرقة الدراجة الثانية، والحمد لله ما زالت حية ترزق، لكن طبعا غيرت كثيرا من أجزائها مرة أو أكثر مع السنين.. الدراجة في النهاية هي الهيكل المعدني، وكل ما عداه يتم تغييره مع الاستهلاك والتلف، لهذا تظل الدراجة ما دام الهيكل نفسه سليما، وما لم يسرقها لص أثيم!

الطريف أنني في الجمعة قبل الماضية قررت أن أعمل كعجلاتي، واشتريت كرسيا جديدا وقلبا للترس الأمامي (محور دوران البدالين) وركبتهما بنفسي، وهي عملية استغرقت مني عدة ساعات بسبب عدم الخبرة ونقص الأدوات.. فمثلا: صواميل الكرسي كانت كلها مقاس 13، ولم يكن لدي مفتاح بهذا المقاس، لكني استفدت من فديو مر علي على الفيسبوك سابقا، تعلمت منه استخدام أي قطعة معدنية (كجنيه فضي مثلا) لوضعها بين المفتاح الأكبر والصامولة الأصغر حتى يمكن فكها.. وقد استمتعت بتطبيق هذه الفكرة عمليا ونجحت في فك الصواميل رقم 13 بمفتاح رقم 15 بتخشينه بقطعة معدنية!.. هذا قبل أن أذهب لشراء مفتاح 13 لمواصلة العمل كعجلاتي مستقبلا :D.

أما فك قلب الترس القديم فقد عذبني في البداية، لأنني لم أجد أي أداة مناسبة لذلك، واضطررت إلى البحث على يوتيوب عن طريقة الفك، فوجدت قناة مصرية يشرح فيها صاحبها فديوهات لإصلاح الدراجة في المنزل، فشاهدت الحلقة الخاصة بتركيب محور الترس الأمامي، واتضح أنه يحتاج مفتاحا مقاسه كبير لم أره في حياتي (تقريبا مفتاح 42)، لكن بديله الممكن هو المفتاح الانجليزي، وهو موجود عندي، فاستخدمته، وتمت العملية بنجاح بحمد الله :)

أنا أستمتع بالأعمال اليدوية فعلا، ولولا عشقي للحاسوب لكنت مهندس ميكانيكا وليس اتصالات!

ما علينا.. نترك إصلاح الدراجات ونعود إلى عشقي لركوبها:

يمكن القول إنني صرت شاعرا بسبب ركوب الدراجة، فقد جُبت معظم محافظة دمياط بدراجتي، بمفردي أو مع صديق أو آخر.. فذهبت إلى القرى المحيطة لزيارة الأصدقاء، وذهبت إلى ترعة السلام وبحيرة المنزلة، وذهبت إلى فارسكور وكفر سعد ودمياط، بل ذهبت حتى إلى رأس البر على بعد 25 كم.. أي حوالي 50 كم ذهابا وعودة.. ومعظم هذه الطرق تخترق الأراضي الزراعية (التي للأسف تتقلص رقعتها كل عام باستمرار!)، وهو جو مبهج يثير الشاعرية.

وقد كنت معتادا كل يوم خميس في شهور الدراسة على ركوب الدراجة بعد المدرسة، قبل أن أذهب للعب الكرة.. وقد ظلت هذه العادة مقدسة معي طوال المرحلتين الإعدادية والثانوية، وانتهت إجباريا بذهابي إلى الجامعة في القاهرة.. وفي الصف الثالث الثانوي كنت أخرج بدراجتي يوم الخميس وآخذ معي كراسة وقلما وأكتب الشعر بين الحقول، أو على ضفة الترعة.

طبعا السير على هذه الطرق الإسفلتية بدراجة كان مخاطرة لم أعد أرتكبها الآن.. المخاطرة اليوم أكبر طبعا لأن الطرق ما زالت كما هي لم تتسع للعدد الذي تضاعف من السيارات وما أضيف إليه من دراجات نارية وتكاتك انتشرت كالجراد!.. الطريق الوحيد الهادئ الذي ما زلت أسير عليه حتى الآن بصحبة الصديق أ. مصطفى الهواري هو الواصل بين مدينة الروضة وبحيرة المنزلة، لكن باقي طرق المحافظة خطيرة جدا، ولم أعد أجرؤ على ارتيادها بالدراجة!.. بل إن السير بالدراجة حتى داخل المدينة اليوم صار خطرا، بسبب التكاتك والدراجات النارية التي يركبها شباب طائش!.. والله خير حافظا.

الحقيقة أنني أقدّر اليوم القلق الذي كان يصيب أبي وأمي كلما خرجت من المنزل بالدراجة على هذه الطرق، ولو أنني كنت مكانهما لم أكن سأسمح أصلا بهذا الأمر!.. إنه أحد الاختيارات الصعبة في التربية: هل تحمي ابنك على حساب استمتاعه بالحياة وتجاربها، أم تتركه يخاطر ويتعلم وهو ونصيبه؟!.. المؤكد أن الحياة كلها مخاطرة، لكن من العقل أن تكون المخاطر محسوبة وفي أقل الاحتمالات.. لعلي لهذا كنت مزعجا جدا لمحمد ابن أخي محسن في الصيف الماضي حينما اصطحبته بجولة بدراجته بين الحقول، فقد تجنبت تماما كل طرق السيارات، وسرنا في طرق زراعية ترابية، إلى أن يتعلم الركوب جيدا.. وقد أزعجته بالأوامر والنواهي طوال الرحلة، لأني كنت قلقا جدا عليه.. المسئولية صعبة!

وأذكر أنني في مرة ذهبت بالدراجة عصرا إلى صديقي عبد الله بدر في مدينة الرحامنة، وتركتها في بيته وركبنا سيارة إلى قرية إسكندرية الجديدة لمقابلة د. طاهر بطة، فتأخرنا هناك بعد العشاء، ولم نجد مواصلات للعودة، وظللنا ننتظر سيارة، إلى أن فوجئت بأبي قادما بسيارة أجرة للبحث عنا.. طبعا لم يكن هناك هاتف محمول في تلك الفترة ومعظم المنازل لم يكن فيها هواتف أرضية أيضا، وبالتالي لم يكن يستطيع الاتصال بي، ولم يكن يعلم أنني تركت الدراجة وذهبت بالمواصلات، لهذا خشي هو وأمي أن يكون أصابني مكروه وجاء يبحث عني!

تربية الأبناء قلق لا ينتهي، مهما كان عمرهم.. أعان الله كل أب وأم.. ورحم الله أبي وجزاه وأمي عنا كل خير.. ما زالت أمي تدعو لنا في كل صلاة، وتظل تدعو لي كلما خرجت من البيت حتى أعود.. فلعل ما ينجينا من المهالك دعوة أم.. حفظها الله وبارك في عمرها.

ما زلت أعشق ركوب الدراجة حتى اليوم.. لكن ليس للمتعة فقط، فهي مهمة جدا لي في هذه السن، لأنها نوع من الرياضة والحركة التي أقاوم بها زيادة وزني، خاصة مع قلة الحركة بسبب العمل خلف الحاسوب منذ سنوات.. كما أنني أركب الدراجة حينما أكون متضايقا أو أحتاج لتصفية ذهني والتفكير في أمر ما.. يمكن القول إن بيني وبين دراجتي صداقة عمر وشعر ومغامرات.. فاللهم ارزقني خيرها وجنبي شرها واحفظني من كل مكروه.

 

القط


DataRowCollection Class


 فئة مجموعة الصفوف DataRowCollection Class 

هذه الفئة ترث المجموعة InternalDataCollectionBase، وهي تحتوي على عناصر من نوع فئة صف البيانات DataRow Class.

وبخلاف ما ترثه من الفئة الأم، تمتلك هذه المجموعة الوسائل الجديدة التالية: 

إضافة Add:
تضيف صفا إلى مجموعة الصفوف، ولها صيغتان:
- الصيغة الأولى تستقبل كائن الصف DataRow الذي تريد إضافته.
- الصيغة الثانية تستقبل مصفوفة كائنات Object Array تحتوي على القيم التي تريد وضعها في خانات السجل.. لاحظ أنك تتعامل مع مجموعة الصفوف من خلال كائن الجدول DataTable، لهذا فإن هذه المجموعة تعرف تركيب السجلات التي ستضيفها إليها، وعليك مراعاة ترتيب الأعمدة وأنواع بياناتها عند وضعها في المصفوفة حتى لا يحدث خطأ، وعليك كذلك ترك خانة المصفوفة المناظرة لخانة الترقيم التلقائي فارغة.
وتنشئ هذه الصيغة كائن صف جديد وتضع القيم به وتضيفه إلى مجموعة الصفوف، وتعيد إليك كائن صف DataRow يشير إلى الصف الذي تمت إضافته إلى المجموعة. 

تحتوي على Contains:
تعيد true إذا كانت مجموعة الصفوف تحتوي على السجل الذي له المفتاح الأساسي Primary Key المرسل كمعامل.. ولهذا الوسيلة صيغتان:
- الصيغة الأولى تستقبل كائنا Object يحتوي على قيمة المفتاح الأساسي للسجل الذي تريد البحث عنه.
- الصيغة الثانية تستقبل مصفوفة كائنات Objects، تحتوي على قيم المفتاح الأساسي، وذلك إذا كان المفتاح الأساسي للجدول يتكون من أكثر من عمود. 

البحث عن Find:
مماثلة للوسيلة السابقة في صيغتيها، إلا أنها تعيد كائن الصف DataRow الذي يملك مفتاحا أساسيا مساويا للقيمة المرسلة كمعامل، وتعيد null إذا لم تعثر على الصف.
وتسبب هذه الوسيلة خطأ في البرنامج إذا لم يكن الجدول الذي تبحث فيه يحتوي على مفتاح أساسي.. يمكن أن يحدث هذا رغم ان الجدول الأصلي في قاعدة البيانات يحتوي على مفتاح أساسي، وذلك إذا استخدمت الوسيلة Fill لملء مجموعة البيانات، دون استخدام الوسيلة FillSchema أولا، فهي التي تنشيء المفتاح الأساسي في جداول مجموعة البيانات. 

الإدراج في موضع InsertAt:
أرسل إلى هذه الوسيلة كائن الصف DataRow والموضع الذي تريد إدراجه فيه في مجموعة الصفوف. 

من كتاب من الصفر إلى الاحتراف: برمجة قواعد البيانات بتقنية ADO.NET

 

الخميس، 24 يناير 2019

الرموش الجارحة


ميكروسوفت تقر بالهزيمة وتعلن استسلامها!


ميكروسوفت تقر بالهزيمة وتعلن استسلامها!

 
في خبر حزين، قررت ميكروسوفت إنهاء الدعم الفني لويندوز 10 للأجهزة المحمولة Win 10 mobile بنهاية عام 2019، بعد فشل خطتها في أن يستحوذ نظام تشغيلها على حصة كبيرة من سوق الأجهزة المحمولة، الذي يسيطر عليه أندرويد وأي أو إس.

هذا القرار سيؤثر بالتأكيد على مبرمجي دوت نت، لأنني الآن لا أعرف مصير UWP المصمم أصلا لإنتاج برامج تعمل على كل أجهزة الويندوز بما فيها أجهزة ويندوز 10 للأجهزة المحمولة.. فهل سيتم إهمال تطبيقات UWP والعودة للتركيز على WPF أم سيتم تعديل مسار UWP بشكل ما؟.. وهل سيتغير شيء في Win 10 نفسه بعد أن أزيلت منه ميزات كثيرة كانت موجودة في إصدارات الويندوز السابقة ليصير أخف ويشبه واجهة الأجهزة المحمولة؟

من وجهة نظري، لم تعالج ميكروسوفت المشكلة بشكل صحيح.. فقد تأخرت منذ البداية عن غزو سوق الأجهزة الكفية، وبالتالي انتشرت نظم التشغيل الأخرى على أجهزة مختلفة بأسعار تنافسية وصارت لها ثروة هائلة من التطبيقات تجذب مليارات المستخدمين.. لكي تدخل ميكروسوفت هذا السوق فجأة فستصطدم بالمشاكل التالية مهما كانت قوة نظام تشغيلها:
1- لن يتخلص معظم الناس من أجهزتهم لشراء أجهزة ميكروسوفت.
2- أجهزة ميكروسوفت أغلى من أجهزة الأندرويد، وليست فيها تقنيات غير مسبوقة تغري المشتري بالمغامرة.
3- لن يكتب المبرمجون والشركات الكبيرة تطبيقات تتكلف آلاف الدولارات لنظام تشغيل لا يستخدمه إلا عدد قليل.. وبالتالي سينتظر المبرمج أن يشتري العملاء أجهزة ويندوز 10 لكن العملاء سينتظرون أن توجد تطبيقاتهم المفضلة على نظام ويندوز 10 أولا، ونظل ندور في دائرة البيضة أم الدجاجة!

لو ركزت ميكروسوفت على حل هذه المشكلات، فستقتحم سوق الأجهزة المحمولة بقوة.. والحلول من وجهة نظري كالتالي:
1- يجب أن يتمتع ويندوز 10 للأجهزة المحمولة بالميزة الأقوى في نظام الويندوز، وهي قدرته على التعرف الذاتي على مكونات أي جهاز وإعداد محركات تشغيلها Drivers.. هذا يتطلب أن تكتب ميكروسوفت بنفسها محركات التشغيل لكل مكونات الأنواع الشهيرة من أجهزة المحمول والأجهزة اللوحية (أو تدفع لكل الشركات المصنعة لكتابة هذه المحركات)، بحيث يستطيع أي مستخدم أن يوصل جهازه بالحاسوب ويتصل بالإنترنت وينزل نسخة ويندوز فون ويعدها مباشرة على جهازه أيا كان، ليحوله إلى جهاز ويندز فون مجانا!
2- أن تبيع ميكروسوفت أجهزة ويندوز 10 فون متطورة بميزات غير مسبوقة وبأسعار مغرية، تجذب المستخدمين الجدد.
3- أن توفر ميكروسوفت على متجر الويندوز كل التطبيقات الشهيرة التي يتعامل معها المستخدمون على نظم التشغيل الأخرى، حتى لو تطلب هذا أن تدفع ميكرسوفت نقودا للشركات الكبيرة لتنتج نسخا من تطبيقاتها لويندوز 10.. هذا سيغري المستخدمين بالانتقال إلى ويندوز 10 للأجهزة المحمولة، ومن ثم يجد المبرمجون الفرصة لكتابة تطبيقاتهم وتدور العجلة.

طبعا كل هذه خطوات مكلفة جدا وتحتاج جهدا كبيرا، والعائد المنتظر منها سيكون بعد سنوات، لكن هذا هو الثمن الذي يجب أن تدفعه ميكروسوفت لتدخل هذا المجال متأخرة، بدلا من أن تعلم استسلامها النهائي واكتفاءها بدعم نظم التشغيل المنافسة!

أما بالنسبة لنا نحن مبرمجي دوت نت، فليس أمامنا حاليا سوى استخدام Xamarin لكتابة التطبيقات لأندرويد و أي أو إس.

الثلاثاء، 22 يناير 2019

الحب منتجع من الأقمار


الحب منتجع من الأقمار 

أهديكِ أجملَ سوسني فاختاري
فالحسنُ حسنُكِ والهَوَى أشعاري
سيري على عطرِ الدروبِ، الحبُّ مَنتجعٌ من الأقمارِ
كُوني كما أهواكِ.. أو لا!
إنّني أهواكِ.. ليسَ قراري!
***

كلُّ الزهورِ جميلةٌ،
والعطرُ لي كم باحَ بالأسرارِ
لكنَّ في عينيَّ حسنَكِ أجملُ الأزهارِ
يا زهرةً دُرّيّةَ الأنوارِ
أرجوكِ لا تَتخوّفي وتَغاري
***

وفَراشةٌ أنهكَتِني بفرارِ
ما باحَ قلبُكِ لي
ما لُحتِ في أسماري
يا أقربَ النجماتِ في إبحاري
يا أبعدَ الأحلامِ في أقداري
أسعى إلى عينيكِ،
قولي: هل بقلبِكِ داري؟
أم كانَ عني لاهيا ما داري؟
***

يا نورَ فجرٍ باسمٍ في أُفْـقِهِ
غنّاكِ طيرٌ ذائبٌ من شوقِهِ
أُهديكِ قلبًا غارقًا في عشقِهِ
أُهديكِ كلَّ قصائدي فاختاري
محمد حمدي غانم
18/11/2018 

أحدث الفئة DataTable


أحدث الفئة DataTable

تمتلك فئة جدول البيانات DataTable Class الأحداث التالية: 

العمود تغير ColumnChanged:
ينطلق بعد أن تتغيّر إحدى القيم في أحد أعمدة الجدول.. والمعامل الثاني e لهذا الحدث من النوع DataColumnChangeEventArgs، وهو يمتلك الخصائص التالية: 

Column
تعيد كائن العمود DataColumn الذي حدث به التغيير.
Row
تعيد كائن الصفّ DataRow، الذي توجد به الخانة التي تغيرت.
ProposedValue
تقرأ أو تغير القيمة المقترحة (التي تغيرت).. هذا يتيح لك ـ لو أردت ـ تعديل القيمة التي تغيرت.

العمود يتغير ColumnChanging:
مماثل للحدث السابق، ولكنه ينطلق عند محاولة إجراء التغيير في أحد أعمدة الجدول (أي قبل حدوث التغيير بالفعل).. ويمكنك استخدام الكود التالي لإلغاء تغيير قيمة الخانة:
e.ProposedValue = e.Row[e.Column];
لكن عليك استخدام هذه الجملة داخل شرط، فلو استخدمتها هكذا بمفردها فستمنع المستخدم من تغيير أي خانة في أي عمود في الجدول.. لهذا فالعملي أن تستخدمها لمنع بعض القيم الخاطئة، مثل ترك عمود اسم المؤلف فارغا لأن هذا غير مقبول في قاعدة البيانات.. وستجد هذا الكود في الفئة الجزئية لجدول المؤلفين في مجموعة البيانات محددة النوع في المشروع TableAdapter:
if (e.Column == AuthorColumn && e.ProposedValue == "")
    e.ProposedValue = e.Row[e.Column];
ويمكنك بنفس الطريقة، إضافة أي شروط أخرى للتأكد من صلاحية القيم التي يدخلها المستخدم في باقي الأعمدة. 

الصف تغير RowChanged:
ينطلق بعد أن تتغيّر إحدى القيم في أحد سجلات الجدول.. والمعامل الثاني e لهذا الحدث من النوع DataRowChangeEventArgs، وهو يمتلك الخاصيتين التاليتين: 

صفحة الشاعر