كيف يمكنك تهيئة مجموعة ثابتة من TGUID من بيانات نوع الواجهة في دلفي؟

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

سؤال

أريد تهيئة مصفوفة مثل هذا -

Const MyArray : Array[0..0] Of TGUID = (IInterface);

لكنه يؤدي إلى -

[DCC Error] Test.pas(10): E2010 Incompatible types: 'TGUID' and 'string'

ولكي أرى ما سيحدث حاولت هذا -

Const MyArray : Array[0..0] Of String = (IInterface);

مما يؤدي إلى هذا!

[DCC Error] Test.pas(10): E2010 Incompatible types: 'string' and 'TGUID'

كم هو غريب!من المؤكد أن IInterface هو واحد أو آخر، ولكن يبدو أنه يتحول بعناد إلى النوع الخطأ.

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

المحلول

ويمكنك سحب المعرفات الفريدة العمومية من الإعلانات واجهة وتعلن بأنها (سلسلة) الثوابت. ثم يمكنك استخدام هذه الثوابت في تعريفات الواجهة ومجموعة الإعلانات الخاص بك ثابت. المترجم يقبل سلاسل GUID صالحة حيث من المتوقع TGUID. سلاسل غير صالحة تؤدي إلى E2204 "جملة GUID غير صحيح" تجميع الخطأ.

const
  MyGuid1 = '{99BDAB12-B1B6-41B0-9BF1-2C1DB3D8EC70}';
  MyGuid2 = '{8C7CD303-8D81-469B-99ED-E1F163E9036F}';

type
  IMyInterface1 = interface
    [MyGuid1]
  end;

  IMyInterface2 = interface
    [MyGuid2]
  end;

const
  MyArray: array[0..1] of TGUID = (MyGuid1, MyGuid2);

نصائح أخرى

إذا كنت تستخدم مجموعة CONST لديك لإعداده مع القيم CONST مثل هذا:

const GuidArray: array[0..0] of TGuid=
  ('{84DBCC66-72AA-4806-AE28-B55FC5B83FC8}');

وحاولت فقط في ++ C البناء:

const TGUID g = __uuidof(IInterface);
const TGUID MyArray[] = {__uuidof(IInterface)};

وكنت أظن أن الكلمة الصريحة __uuidof قد تجنب المشكلة لديك، ولكن مجرد يستبدلها بشيء جدا similar.While السطر الأول يعمل بشكل جيد، والثانية العوائد واحد:

[C++ Fehler] Unit1.cpp(9): E2034 Konvertierung von 'const _GUID' nach 'unsigned long' nicht möglich

و(بالإنجليزية: [C ++ خطأ] Unit1.cpp (9): E2034 التحويل من '_GUID CONST' إلى 'غير الموقعة طويلة' غير ممكن)

وهناك فكرة أخرى: إن بتجميع التالية:

procedure Blah(const MyArray: array of TGUID);
begin
  //...
end;

Blah([IInterface, IDispatch]);

وربما يمكنك استخدام هذا النهج.

يمكنك كتابة دالة لإرجاع مجموعة المعرفات الفريدة العمومية (GUIDs) الخاصة بك.(أستخدم هذه التقنية لقيم التاريخ الثابتة.)

  • إنه ليس ثابتًا "حقًا"، ولكن يجب أن يكون قابلاً للاستخدام أينما تستخدم الثابت عادةً.
  • ولكن لا يمكن تعديله أيضًا باستخدام خيار "الثوابت المكتوبة القابلة للتخصيص". الغش غير مسموح :)
  • لذلك فهي تتمتع بميزة صغيرة مقارنة بوضع عالمي في التهيئة قسم.
  • كما أنه عمل يدوي أقل من نقل المعرفات الفريدة العمومية (GUID) التي تستخدمها الواجهات إلى ثوابتها الخاصة.

لديك خيار إرجاع مصفوفة ذات حجم ديناميكي أو ثابت.

الخيار 1

type
  TGUIDArray = array of TGUID;

function GetMyInterfaces: TGUIDArray;
begin
  SetLength(Result, 2);
  Result[0] := IMyInterface1;
  Result[1] := IMyInterface2;
end;

الخيار 2

type
  TGUIDArray = array[0..1] of TGUID;

function GetMyInterfaces: TGUIDArray;
begin
  Result[0] := IMyInterface1;
  Result[1] := IMyInterface2;
end;

يمكنك إنشاء مجموعة من IInterface.

وهنا طريقة اكتشفت باستخدام حقيقة أن تقليديا، consts لا CONST حقا في دلفي. يتطلب التحول مترجم للعودة إلى هذا السلوك (في D2007)

{$J+}
Const MyArray : Array[0..0] Of TGUID = (());
{$J-}

في قسم التهيئة -

MyArray[0] := IInterface;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top