سؤال

كيف يمكنني تنفيذ التعدادات الآمنة في دلفي في سيناريو COM؟في الأساس، أود استبدال مجموعة من الثوابت البدائية للتعداد بمجموعة من مراجع الكائنات النهائية الثابتة المغلفة في فئة؟.في جافا، يمكننا أن نفعل شيئا مثل:

public final class Enum
{
    public static final Enum ENUMITEM1 = new Enum ();
    public static final Enum ENUMITEM2 = new Enum ();
    //...
    private Enum () {}
} 

وإجراء المقارنات باستخدام نوع التعداد المخصص:

if (anObject != Enum.ENUMITEM1) ...

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

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

المحلول

لقد زودتنا الآن ببعض الأدلة الإضافية حول طبيعة سؤالك، وبالتحديد ذكر COM، وأعتقد أنني أفهم ما تقصده.يمكن لـ COM تنظيم مجموعة فرعية فقط من الأنواع التي تعرفها دلفي بين خادم COM والعميل.يمكنك تعريف التعدادات في محرر TLB، ولكن هذه كلها من النوع TOleEnum وهو في الأساس نوع عدد صحيح (LongWord).يمكنك الحصول على متغير من النوع TOleEnum بأي قيمة عددية تريدها وتعيين قيم من أنواع التعداد المختلفة لبعضها البعض.لا اكتب حقًا آمنًا.

لا أستطيع التفكير في سبب لعدم قدرة COM في دلفي على استخدام النوع الآمن للتعدادات بدلاً من ذلك، لكنه لا يفعل ذلك.وأخشى أنه لا يمكن فعل الكثير حيال ذلك.ربما التغييرات في محرر TLB في إصدار دلفي 2009 القادم قد تغير ذلك.

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

نصائح أخرى

تعدادات دلفي الأصلية آمنة للنوع بالفعل.كانت تعدادات Java ابتكارًا لتلك اللغة، لأنه قبل ذلك لم تكن تحتوي على تعدادات على الإطلاق.ومع ذلك، ربما تقصد ميزة مختلفة - قيم التعداد مسبوقة باسم نوعها.

يدعم إصدار دلفي 2009 القادم، والإصدار الأخير من منتج دلفي لـ .NET، توجيهًا جديدًا يسمى التعدادات النطاقية.تبدو هكذا:

{$APPTYPE CONSOLE}
{$SCOPEDENUMS ON}
type
  TFoo = (One, Two, Three);
{$SCOPEDENUMS OFF}

var
  x: TFoo;
begin
  x := TFoo.One;
  if not (x in [TFoo.Two, TFoo.Three]) then
    Writeln('OK');
end.

ما هو الخطأ في التعدادات دلفي الأصلية؟هم نوع آمن.

type
  TMyEnum = (Item1, Item2, Item3);

if MyEnum <> Item1 then...

منذ دلفي 2005 يمكن أن يكون لديك ثوابت في الفصل الدراسي، لكن دلفي 5 لا تستطيع ذلك.

type
  TMyEnum = sealed class
  public
    const Item1 = 0;
    const Item2 = 1;
    const Item3 = 2;
  end;

أعتقد أنني أعرف سبب اختيار بورلاند عدم استخدام التعدادات الآمنة للكتابة في محرر TLB.يمكن أن تكون التعدادات في COM قيمًا مختلفة بينما تستطيع دلفي فقط منذ دلفي 6 (على ما أعتقد) القيام بذلك.

type
  TSomeEnum = (Enum1 = 1, Enum2 = 6, Enum3 = 80);  // Only since Delphi 6
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top