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

متغير من نوع Control

بدأه Shamel في 3 يوليو 2008 · 12 رد · 1,249 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

لدي متغير من نوع Control فكيف لي أن أعرف نوع الـ Contol الذي يحتويه مثال

Control a;
a = this->ActiveControl;
-

ماهي الأمر الذي أستطيع به أن أعرف به الـ Control الذي يحتويه الـ a

هل هو TextBox أم أداه أخرى

وشكراً

#2

حاول ان توضح اكثر :S

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#3

اذا كان كما تقول انها من النوع textBox اعملها عملية قصر dynamic_cast ترجع true

وإلا فإنها لا تحتوي على الصف الأخير في الحقيقة كل مكتبة لها عمليات القصر المناسبة التي تراها في Qt انا استخدم qobject_cast وهو مكافئ للأخير .

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#4

ما أعنيه هو أريد أن أعرف نوع الكنترول النشط على الفورم قبل أن أجري عمليه برمجية معينة

بمعنى مثلاً لو كنت أريد أن أقوم بعملية تراجع Undo فأريد أن أتأكد أن العضو النشط هو TextBox أو نوع العضو النشط أن كان Combo أو ماذا قبل أن أجري العملية

بالفيجوال بيسك كنا نفعلها بالأمر Typeof مثال

Dim a as Control
a = me.ActiveControl
if Typeof a is TextBox then
a.Undo

أريد أن أنفذ هذا بلغة سي ++ فهل من مرادف للأمر Typeof أو هل هناك طريقة أخرى لتنفيذ التراجع

وشكراً

#5

كما رديت عليك استخدم العملية dynamic_cast اذا كان الصف يحتوي على textBox فإن المؤشر سوف يحتوي قيمة وإلا فإنه يصبح فاضي عموما اخي في سي بلس بلس اي صف يرث من صف آخر لهما نفس النوع ف textBox لها نفس نوع widget لذلك لا تستطيع ان تعرف الا عن طريق عملية القصر اتمنى انك فهمت علي

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#6

هل أطمع في مثال

#7

من حقق أخي تطلب مثالين

اصبر اسويلك مثال

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#8
#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 مثال بسيط جدا وانا في الخدمة

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#9

هذه التقنية اسمها rtti وهي تقنية خطيرة وختلف عن اختها reinterpret_cast و static_cast انها لا تغير في التعريف ابدا

وافضل مترجم يتعامل معها هو الفجوال سي التابع لمايكروسوفت

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#10

يمكنك استخدام المؤشر علي المستوي الأدني في هيكل الوراثة وتتحكم فيه عن طريق الدوال الافتراضية virtual functions وهذه هي الطريقة الأمثل في البرمجة الشيئية.

ويمكن أيضًا أن يكون في الفئة بند يحدد اسم الفئة ، يمكنك علي أساس هذا البند أن تحول المؤشر الي النوع المحدد في بند الاسم ومن ثم استخدامه بطريقة عادية.

#11

البرمجة المرئية لا ترسل الا الأصل ويبقى الأبناء مجهولين مثل Qt فتضر الى استخدما static_cast

اما بالنسبة بند يحدد صفة ال widget يوجد وصف او اختبار وراثة ولكن انا اتكلم في حال عدم توفرها

تم تعديل هذه المشاركة بواسطة مصفوفة في 4 يوليو 2008 في 19:54

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#12

أعتذى عن التأخير نتيجة لسفري

أشكرك أخي مصفوفه على الكود ولكن للأسف ما عرفت أطبقه على الويندوز فورمز

#13

لو كنت تتكلم عن Qt كنت وريتك حركات جدا جميلة :rolleyes:

فلو تعذرني عزيزي.

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…