2017-01-31 3 views
2

Я KnownFolderPath идентификаторы объявлены consts:Delphi: Const список константных объектов

const 
    FOLDERID_LocalAppData : TGUID = '{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}'; 
    FOLDERID_RoamingAppData: TGUID = '{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}'; 
    FOLDERID_Documents  : TGUID = '{FDD39AD0-238F-46AF-ADB4-6C85480369C7}'; 
    {...} 

Я хочу, чтобы определить упорядоченный список идентификаторов папок во время компиляции. Я знаю, что я могу сделать следующее:

const 
    settings_roots: array[0..2] of TGuid = (
    '{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}', 
    '{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}', 
    '{FDD39AD0-238F-46AF-ADB4-6C85480369C7}' 
); 

Но это не очень удобно в сопровождении кода, так что я хотел бы, чтобы лучше использовать имена, определенные ранее. Но это дает мне компилятор ошибки в Delphi XE3 (Уст выражение ожидается):

const 
    settings_roots: array[0..2] of TGuid = (
    FOLDERID_LocalAppData, FOLDERID_RoamingAppData, FOLDERID_Documents 
); 

я мог определить FOLDERIDs как константные строки, как

const 
    FOLDERID_LocalAppData = '{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}'; 
    FOLDERID_RoamingAppData = '{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}'; 
    FOLDERID_Documents  = '{FDD39AD0-238F-46AF-ADB4-6C85480369C7}'; 
    {...} 

, но чем я бы преобразовать идентификаторы с StringToGUID() everywehere в коде. Разве не удается определить упорядоченный статический/const-список объектов const до выполнения в Delphi?

+0

Я не согласен, что это точный дубликат. Ответчик особенно хочет определить исходные константы как TGUID (а не строку), чтобы он мог использовать их в другом месте в своей программе напрямую, как он утверждает. Эта дополнительная спецификация дает ответы, приведенные в исходном недействительном IMHO. – Dsm

+0

Простое редактирование ответа Ondrej разрешило бы это. Схожая с добавлением, которое я только что сделал для Реми. –

ответ

3

Для того, чтобы использовать константы ID по имени в объявлении массива, необходимо удалить TGuid типа от постоянных деклараций ID, что делает их «Истинные константы» вместо «типизированных констант»:

const 
    FOLDERID_LocalAppData = '{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}'; 
    FOLDERID_RoamingAppData = '{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}'; 
    FOLDERID_Documents = '{FDD39AD0-238F-46AF-ADB4-6C85480369C7}'; 
    {...} 

Это описано в документации Embarcadero по:

Declared Constants

Истинного константы

Истинная константа - это объявленный идентификатор, значение которого не может измениться. Например:

const MaxValue = 237; 

объявляет константу с именем MaxValue, которая возвращает целое число 237. Синтаксис объявления истинной константы:

const identifier = constantExpression 

, где identifier это любой допустимый идентификатор и constantExpression этого выражение, что компилятор может оценить без выполнения вашей программы.

...

константные выражения

Постоянное выражение является выражением, которое компилятор может оценить без выполнения программы, в которой она происходит.Константные выражения включают цифры; символьные строки; истинные константы; значения перечислимых типов; специальные константы True, False и nil; и выражения, построенные исключительно из этих элементов с операторами, типами и конструкторами set.

...

типизированные константы

типизированные константы, в отличие от истинных констант, могут содержать значения типов массива, записей, процедурных и указателей. Типированные константы не могут встречаться в постоянных выражениях.

...

Массива Константа

Чтобы объявить константу массива, заключить значение элементов массива, разделенных запятыми, в круглых скобках в конце объявления. Эти значения должны быть представлены постоянными выражениями.

Часто бывает полезно объявить типизированные константы, а также, что вы можете сделать без повторения значений, например:

const 
    FOLDERID_LocalAppData = '{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}'; 
    FOLDERID_RoamingAppData = '{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}'; 
    FOLDERID_Documents = '{FDD39AD0-238F-46AF-ADB4-6C85480369C7}'; 
    {...} 

    FOLDERID_LocalAppData_GUID: TGUID = FOLDERID_LocalAppData; 
    FOLDERID_RoamingAppData_GUID: TGUID = FOLDERID_RoamingAppData; 
    FOLDERID_Documents_GUID: TGUID = FOLDERID_Documents; 
    {...} 

    settings_roots: array[0..2] of TGuid = (
    FOLDERID_LocalAppData, FOLDERID_RoamingAppData, FOLDERID_Documents 
); 

В качестве альтернативы, так TGuid типизированных констант могут совпадать с Win32 API схемы именования:

const 
    FOLDERID_LocalAppData_STR = '{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}'; 
    FOLDERID_RoamingAppData_STR = '{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}'; 
    FOLDERID_Documents_STR = '{FDD39AD0-238F-46AF-ADB4-6C85480369C7}'; 
    {...} 

    FOLDERID_LocalAppData: TGUID = FOLDERID_LocalAppData_STR; 
    FOLDERID_RoamingAppData: TGUID = FOLDERID_RoamingAppData_STR; 
    FOLDERID_Documents: TGUID = FOLDERID_Documents_STR; 
    {...} 

    settings_roots: array[0..2] of TGuid = (
    FOLDERID_LocalAppData_STR, FOLDERID_RoamingAppData_STR, FOLDERID_Documents_STR 
); 
+0

Таким образом, я не могу использовать тип 'TGuid' и его операторы класса без преобразования констант с помощью' StringToGUID() 'всюду. –

+1

@PascalRosin Я сделал редактирование, показывающее, как его решить. –

+0

дополнительные типизированные константы выглядят как путь. Спасибо @DavidHeffernan –

-1

К сожалению, ответ кажется нет. Вам сделать следующее

const 
    FOLDERID_LocalAppData : TGUID = '{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}'; 
    FOLDERID_RoamingAppData : TGUID = '{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}'; 
    FOLDERID_Documents  : TGUID = '{FDD39AD0-238F-46AF-ADB4-6C85480369C7}'; 

    const 
    settings_roots: array[0..2] of ^TGuid = (
    @FOLDERID_LocalAppData, @FOLDERID_RoamingAppData, @FOLDERID_Documents 
); 

, но тогда вам нужно будет назначить как этот

iGUID := settings_roots[ i ]^; 

Не уверен, если это является приемлемым. Если хотите, вы можете поместить оболочку класса.

+0

Это то, что я имел в виду с _ «Я мог бы определить FOLDERIDs как const strings» _. Но это означало бы, что я должен конвертировать FOLDERIDs с 'StringToGUID()' всюду. –

+0

@PascalRosin OK – Dsm

+0

@Dsm Посмотрите на ответ Реми, чтобы увидеть опрятный способ обо всем этом –

Смежные вопросы