你怎么初始化const列TGUID从界面类型的数据,在德尔菲?
-
22-08-2019 - |
题
我想要一系列初始化喜欢这个-
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'
怎么奇怪了!当然模是一个或另一个,但它似乎顽固地转变为错误的类型。
解决方案
可以从接口声明拉guid和它们声明为(字符串)常数。然后,您可以在您的接口声明和你的数组常量声明使用这些常量。编译器接受有效的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 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' 到 '无符号长' 是不可能的)
另一个想法:以下编译:
procedure Blah(const MyArray: array of TGUID);
begin
//...
end;
Blah([IInterface, IDispatch]);
也许你可以使用这种方法。
你可以写一个功能返回的你的系列Guid。(I使用这种技术对恒定的日期的价值观。)
- 这不是"真正的"一个恒定不变,但应该可以使用,无论你愿意经常使用恒定。
- 但它也不能以修改,使用"可转让的类型的常数"的选项。 作弊不允许的:)
- 因此,它有一个小小的优势,设置一个全球性的 初始化 部分。
- 此外,它的小手册工作于移动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是不是真的在delphi const的一种方法,我发现了。需要编译器开关返回到这种行为(在D2007)
{$J+}
Const MyArray : Array[0..0] Of TGUID = (());
{$J-}
在初始化部分 -
MyArray[0] := IInterface;
不隶属于 StackOverflow