السلام عليكم ورحمة الله
لدي متغير من نوع Control فكيف لي أن أعرف نوع الـ Contol الذي يحتويه مثال
Control a; a = this->ActiveControl; -
ماهي الأمر الذي أستطيع به أن أعرف به الـ Control الذي يحتويه الـ a
هل هو TextBox أم أداه أخرى
وشكراً
السلام عليكم ورحمة الله
لدي متغير من نوع Control فكيف لي أن أعرف نوع الـ Contol الذي يحتويه مثال
Control a; a = this->ActiveControl; -
ماهي الأمر الذي أستطيع به أن أعرف به الـ Control الذي يحتويه الـ a
هل هو TextBox أم أداه أخرى
وشكراً
اذا كان كما تقول انها من النوع textBox اعملها عملية قصر dynamic_cast ترجع true
وإلا فإنها لا تحتوي على الصف الأخير في الحقيقة كل مكتبة لها عمليات القصر المناسبة التي تراها في Qt انا استخدم qobject_cast وهو مكافئ للأخير .
ما أعنيه هو أريد أن أعرف نوع الكنترول النشط على الفورم قبل أن أجري عمليه برمجية معينة
بمعنى مثلاً لو كنت أريد أن أقوم بعملية تراجع Undo فأريد أن أتأكد أن العضو النشط هو TextBox أو نوع العضو النشط أن كان Combo أو ماذا قبل أن أجري العملية
بالفيجوال بيسك كنا نفعلها بالأمر Typeof مثال
Dim a as Control a = me.ActiveControl if Typeof a is TextBox then a.Undo
أريد أن أنفذ هذا بلغة سي ++ فهل من مرادف للأمر Typeof أو هل هناك طريقة أخرى لتنفيذ التراجع
وشكراً
كما رديت عليك استخدم العملية dynamic_cast اذا كان الصف يحتوي على textBox فإن المؤشر سوف يحتوي قيمة وإلا فإنه يصبح فاضي عموما اخي في سي بلس بلس اي صف يرث من صف آخر لهما نفس النوع ف textBox لها نفس نوع widget لذلك لا تستطيع ان تعرف الا عن طريق عملية القصر اتمنى انك فهمت علي
هل أطمع في مثال
#include <iostream>
using namespace std;
struct A {
virtual void f() { cout << "Class A" << endl; }
};
struct B : A {
virtual void f() { cout << "Class B" << endl; }
};
struct C : A {
virtual void f() { cout << "Class C" << endl; }
};
void f(A* arg) {
B* bp = dynamic_cast<B*>(arg);
C* cp = dynamic_cast<C*>(arg);
if (bp)
bp->f();
else if (cp)
cp->f();
else
arg->f();
};
int main() {
A aobj;
C cobj;
A* ap = &cobj;
A* ap2 = &aobj;
f(ap);
f(ap2);
}هذا مثال جاهز شرحها انا الصف A يرث منها B , C في هذه الحال تقدر تصنع مؤشر من النوع A وتضيف لها B او C وتخيل لو ان A هو widget
طيب في هذه الحالة انت تريد ان تعرف على ماذا يحتوي A هل على B or C وهذا ما سخر له الأمر f مثال بسيط جدا وانا في الخدمة
هذه التقنية اسمها rtti وهي تقنية خطيرة وختلف عن اختها reinterpret_cast و static_cast انها لا تغير في التعريف ابدا
وافضل مترجم يتعامل معها هو الفجوال سي التابع لمايكروسوفت
يمكنك استخدام المؤشر علي المستوي الأدني في هيكل الوراثة وتتحكم فيه عن طريق الدوال الافتراضية virtual functions وهذه هي الطريقة الأمثل في البرمجة الشيئية.
ويمكن أيضًا أن يكون في الفئة بند يحدد اسم الفئة ، يمكنك علي أساس هذا البند أن تحول المؤشر الي النوع المحدد في بند الاسم ومن ثم استخدامه بطريقة عادية.
البرمجة المرئية لا ترسل الا الأصل ويبقى الأبناء مجهولين مثل Qt فتضر الى استخدما static_cast
اما بالنسبة بند يحدد صفة ال widget يوجد وصف او اختبار وراثة ولكن انا اتكلم في حال عدم توفرها
تم تعديل هذه المشاركة بواسطة مصفوفة في 4 يوليو 2008 في 19:54
أعتذى عن التأخير نتيجة لسفري
أشكرك أخي مصفوفه على الكود ولكن للأسف ما عرفت أطبقه على الويندوز فورمز
لو كنت تتكلم عن Qt كنت وريتك حركات جدا جميلة :rolleyes:
فلو تعذرني عزيزي.
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…