تعطل الكائن عندما في البرنامج الرئيسي ، ولكن ليس عند نقله إلى الوحدة

StackOverflow https://stackoverflow.com/questions/2147114

  •  23-09-2019
  •  | 
  •  

سؤال

لقد كتبت مجموعة أدوات SDL GUI مخصصة (المصدر قيد التشغيل http://sourceforge.net/projects/lkgui/files/) وأنا أواجه مشكلة مع كائن ورث.

عندما يكون الكائن ضمن البرنامج الرئيسي ، لا يطلق على المُنشئ ، وبالتالي فإن البرنامج لا يقوم بتهيئة الكائن بشكل صحيح ويتعطل بعد بعض الأوامر (على وجه التحديد ، يرث tstartGameButton من وراث GUI_Canvas من GUI_Element وأي شيء لم يتم تعريفه في GUI_ELEMENT البرنامج مع eaccessviolation). عندما يتم وضع الكائن داخل وحدة ، تختفي هذه المشكلة.

أتفهم أنه يمكنني ترك الأمر في الوحدة ، لكنه سيؤدي إلى بعض الكود القبيح الذي نأمل تجنبه.

هل لأي شخص فكرة عن سبب حدوث ذلك وكيف يمكنني تجنب ذلك؟

هل كانت مفيدة؟

المحلول

تم كسر كائنات Delphi القديمة منذ إطلاق Delphi 2 ، ربما في وقت سابق. إنهم لا يفعلون الميراث جيدًا عندما يكون لديهم حقول من الأنواع التي يديرها التحويل البرمجي ، مثل string أو المصفوفات الديناميكية. كان يوجد مناقشة حول هذا الموضوع في عام 2004 على comp.lang.pascal.delphi.misc. هنا كان رمز إعادة إنتاجه:

type
  TBase = object
  public
    s: string;
  end;

  TDerived = object(TBase)
  end;

procedure test;
var
  obj: TDerived; //okay for TBase!
begin
  assert(obj.s = '', 'uninitialized dynamic variable');
end;

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

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

يبدو أن هذا يرجع إلى وجود المتغيرات محلي المتغيرات. يبدو أن متغيرات الوحدة ("العالمية") تعمل بشكل جيد. يتم التعامل مع المتغيرات التي يتم إعلانها في نطاق الوحدة ولكن تستخدم فقط من قبل قسم تهيئة الوحدة ، أو في نطاق البرنامج واستخدامها فقط في كتلة البداية الرئيسية لملف DPR ، من قبل المترجم كمتغيرات محلية ، لذلك لم يتم ضبطها على الجميع -Bits-Zero مثل نظرائهم العالمية. عندما تنقل إعلانك المتغير إلى وحدة ولكن تستمر في استخدامه في ملف DPR الخاص بك ، فإنه مرتفع إلى حالة "عالمية".

لك TGUI_Element النوع لديه string دعا عضو DbgName, ، ويبدو أن هذا هو حقل السلسلة الوحيد الذي لديك في التسلسل الهرمي النوع. أخرج ذلك ، أو قم بتغييره ShortString, ، وسأراهن أن حوادثك تختفي ، على الأقل مؤقتًا.

نصائح أخرى

لماذا تعطي جميع الكائنات المُنشدين المسماة بدلاً من جعلها افتراضية؟

  type   tx = object
                constructor init; virtual;
                end;
         txx = object(tx)
                   constructor init; virtual; // like override in Delphi classes.
                  end;

إذا كنت بحاجة إلى تسلسل هرمي مرئي للنظر إليه ، وإلقاء نظرة على Free Vision ، فإنه يوضح تقريبًا كل جانب من جوانب نموذج كائن TP

أُووبس المُنشئون الظاهريون غير ممكنين في نموذج TP

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top