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

مالفرق بين ... ؟ ، أدخل وشوف .

مغلق
بدأه prof_1982 في 16 أكتوبر 2004 · 8 رد · 2,747 مشاهدة · في المواضيع و الدروس القيّمة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

يا جماعة الان عندي صندوق نص وارت ان اكتب فيه نص من خلال الكود توصلت لذلك ولكن بطريقتين وهما :

الطريقة الاولي :

m_myname = "test"  ;
	UpdateData (false );

والطريقة الثانية :

UpdateData(false);
CStatic * pStatic = ( (CStatic *) (GetDlgItem(IDC_MYNAME)));
pStatic->SetWindowText("test");

فما الفرق بينهما ، مع العلم يجب عمل متغير للنص في الطريقة الاولى أما الثانية لا .

هل يوجد فروقات لم اعرفها غير تلك ، وما هي فائدة كا طريقة ؟

تحياتي لكم

الإنسان الذي يقول بأنه لا يمكن عمل شيء يجب ألا يعيق مطلقاً الإنسان الذي يقوم بعمل ذلك الشيء.

إن تخطئ فأنت إنسان ... أما أن تلوم جهازك الكمبيوتر على خطأك فهذا أكثر إنسانية.

#2

السلام عليكم,

الطريقتان معا تعطيا نفس النتيجة.

الطريقة الأولى هي تسهيل من الفجوا س++ حيث إ\ا استعملت خصاءص الوزارد ستتمكن من قراءة وطبع جمل باستعمال المتغير الدي قد تعطي للصندوق أو النافدة عموما. وهده الطريق ستشتغل في الفجوال س++.

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

إلى اللقاء.

#3

كما وضح chik الطريقة الثانية شاملة , حيث تستخدم دالة ال API وهي GetDlgItem ,, ويمكن أستخدامها مباشرة بلكود التالي ,, شرط استدعاءها من دالة في FORM معين كالتالي :

GetDlgItem(IDC_MYNAME)->SetWindowText("Every thing you want ");

حيث ستكون استدعيت الدالة من فئة أنت داخلها حاليا ,, وفي هذه الحال تكون استخدمت الدالة GetDlgItem المغلفة من قبل ال MFC وليست دالة ال API الأصلية ,, حيث أن الفرق غالبا بين دوال ال API المغلفة في ال MFC ودوال ال API الأصلية ,, هي وجود بارمتر اضافي للدالة في ال API لتحل محل ال Object الذي استدعى الدالة ,, حيث بنية ال MFC هرمية فئات ,,,

بالمناسبة لو كنت تحب الوراثة والفئات والدوال الوهمية والصديقة ,, ستتعجب من روعة الفيجوال سي++ ,, وستفهمها بالطريقة الصحيحة ,, وأنا لم أفهمها جيدا الا بعد فترة طويلة لأنني بدأت بطريقة خاطئة ,, وكان هدفي وقتها انشاء البرامج بغض النظر عن التعرف الصحيح على البنية التحتية لل MFC ,,

أخيرا أقول الدالة UpdateData(flase) هدفها كما تعرف تحويل البيانات لل Object المرتبط بمتغير معين ,, يعني ليس كالفيجوال بيسك ,, تظهر البيانات مباشرة فور تغيرها في مربع Text Box ,, لكننا هنا نظهرها عندما نكون قد استعدينا لذلك بالدالة UpdateData() ,,

ولنفرض مثلا أنك كنت تريد أن تقوم بعملية حسابية ثم تظهر النتيجة في ال TextBox ولا تريد اظهارها كل مايتم تغيير شيء في المتغير ,, لكن فقط عندما تنتهي ,, بالطبع توجد طريقة لذلك في ال VB ,, ولاأعرف ماهي لأنني لم أتعامل مع ال VB كثيرا أبدا :)

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#4

فعلا كل الطرق تؤدي إلى نفس النتيجة ..

في النهاية يقوم النظام بتنفيذ كل الدوال بدالة واحدة !

بهذا الشكل :

إذا كانت النافذة في ملف المصادر

SendDlgItemMessage(hWnd,IDC_MYNAME,WM_SETTEXT ,0,(LPARAM)(LPCTSTR)"مرحبا");

إذا كانت النافذة أنشأت بواسطة الدالة CreateWindow

SendMessage(hWnd,WM_SETTEXT ,0,(LPARAM)(LPCTSTR)"مرحبا");

لماذا لا تكتب الدوال في برنامجك بهذة الطريقة ؟

لأن البرنامج سيتعامل مع رسائل النظام بشكل مباشر .. فيصبح البرنامج أسرع بكثير

وفي هذة الحالة يكون برنامج بلغة السي :) بدون أي إضافات

http://www.jaascois.com

*************************************************

مجموعة مواضيع - إحتراف البرمجة -

ّ~~~~~~~~~~~~~~~~~~~~~~

البرمجة المتقدمة & الهندسة العكسية & برمجة وأمن الأنظمة

/index.php?showtopic=45002

آخر المواضيع :

+- تحليل جرائم الكمبيوتر -+

أنظمة اليونكس(Solaris,HP, AIX,SCO)وانواع المعالجات

ثغرة SMS لأجهزة الجوال Siemens 3568i !

أخطاء وثغرات البرامج العربية !!!

سلسلة مواضيع - أمن وحماية مواقع الويب -

E البرمجة المتقدمة X للملفات التنفيذية E

سلسلة مواضيع ثغرات الأنظمة وإختراق الأجهزة

**************************************************

<span style='font-size:14pt;line-height:100%'>الإرادة تحـــقق السيـــادة</span>

**************************************************

#5

السلام عليكم

اشكر الاخوة الاعزاء علي هذا الرد الشامل والمفيد ، وجعله الله في ميزان حسناتكم .

سؤال اخر اسمحوا لي ، اعرف انني ضيف ثقيل ، ولكن اريد ان افهم بعض الامور في السي.

الان ما هي ابسط طريقة لربط البرنامج بقاعدة بيانات SQL SERVER عن طريق الـADO أو OLEDB . مع مثال بسيط لاضافة سجل ، والاستعلام عن سجل معين .

بالفيجوال سي ++ 6

تحياتي لكم .

الإنسان الذي يقول بأنه لا يمكن عمل شيء يجب ألا يعيق مطلقاً الإنسان الذي يقوم بعمل ذلك الشيء.

إن تخطئ فأنت إنسان ... أما أن تلوم جهازك الكمبيوتر على خطأك فهذا أكثر إنسانية.

#6
الحفظ والاسترجاع في C++, كيف استطيع التسجيل من dialog فى سى ++ ال

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#7

بالمناسبة ال ado وال OleDB في السي++ هي نفس التقنية كما أعرف ,, لكن في الفيجوال بيسك تم تغليف ال ADO بصورة تعامل سهلة ,, لكن اليك المفاجأه !! ال OleDB عبارة عن com وأنت تعرف تعقيدات هذه ال com ,,

المهم لايوجد تغليف لل OleDB كما تغليف ال ADO في الفيجوال بيسك ,, لذا ستضطر للتعامل على مستوى com ,, لكن التحكم سيكون عظيم للغاية ,, وستلاحظ أن أسماء الدوال تشابه اسماء دوال ال ADO في الفيجوال بيسك بشكل كبير ,, لكن طريقة الاستخدام مختلفة ,,

خذ الرابطين فيهما كود للتعامل مع قواعد بيانات بال ODBC API ,, وكود لل MFC ODBC ,, ولايوجد كود ADO فيهما مع أني أذكر أنني أرفقت واحدا في مكان ما !!

/index.php?showtopic=41569

/index.php?showtopic=46633

سأوافيك بكود ADO أو OLEDB اليوم مساء باذن الله ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#8

بالنسبة لل OleDB هي موجودة أصلا في ملف dll هو msado15.dll ,, وهو عبارة عن مكون COM به أكثر من واجهة ,, منها

_ConnectionPtr
_RecordsetPtr

ويوجد غيرها الكثير ,, ومع كل فئة من الفئات المشتقة من الواجهات توجد عدة دوال أو Methods كما تسمى في لغة ال COM وهي تقريبا بنفس أسماء دوال ADO في ال VB :

بداية عليك استصدار ملف رأس يعرف ويصرح لهذه الدوال والواجهات من ملف ال dll كالتالي :

#import "C:\Program Files\Common Files\System\ado\msado15.dll" \
	no_namespace rename("EOF","adoEOF")

بعد ذلك يمكن أن تستخدم الفئات الجديدة

_ConnectionPtr
_RecordsetPtr

بشكل مباشر لكن بعد أن تبتديء خدمات COM أولا كالتالي :

CoInitialize(NULL);

ثم بعد ذلك تنشيء كائن ال connection كالتالي :

_ConnectionPtr conptr(__uuidof(Connection));
conptr->Open(_T("Provider=SQLOLEDB.1; Data Source=SQLServer; Initial Catalog=Customer"),_T("user1"),_T(""),adOpenUnspecified);

حيث ال data source هي user1 ,,,

بعده باستخدام ال Execute أو باستخدام كائن واجهة آخر وهو

_CommandPtr كالتالي :

_CommandPtr cmd(__uuidof(Command));
cmd->ActiveConnection=conptr;

cmd->CommandText="<select * From table1>"

بعد ذلك يمكن انشاء كائن ال Recordset مباشرة لتعبئة نتيجة الاستعلام فيها كالتالي :

_RecordsetPtr rst(__uuidof(Recordset));
rst->PutRefSource(cmd);
_variant_v vNull;

rst->Open(vNull,vNull,adOpenDynamic,adLockOptimistic,adCmdText);

وفي النهاية لاتنسى أن تغلق مكتبات COM كالتالي :

::CoUninitialize();

,, كما ترى الموضوع قد يبدو صعبا في البداية ,, لكن تأكد من أنك تتعامل بأقصى مستوى مرونة ممكن مع قواعد البيانات ,, واذا أردت التأكد فاكتب مثلا :

_ConnectionPtr conptr(__uuidof(Connection));
conptr->

وانظر الى الدوال وال methods الموجودة ,, وستجدها كثيرة للغاية ,, مقارنة مع تلكالمدعومة في كائن ADODB في ال VB ,,

عموما الله يعيننك ,, ولو أردت المزيد فنحن موجودون ان شاء الله ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#9

السلام عليكم

والله يا اخي HGB انك غاية في الروعة ،، صدقني كل كلمات الشكر لا توفيك حقك العظيم .

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

تحية لك علي هذا المجهود العظيم .

وتحياتي للجميع .

تم تعديل هذه المشاركة بواسطة prof_1982 في 18 أكتوبر 2004 في 01:17

الإنسان الذي يقول بأنه لا يمكن عمل شيء يجب ألا يعيق مطلقاً الإنسان الذي يقوم بعمل ذلك الشيء.

إن تخطئ فأنت إنسان ... أما أن تلوم جهازك الكمبيوتر على خطأك فهذا أكثر إنسانية.

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

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