function syntax inno-setup pascalscript

function - "Identificador esperado" o "Prototipo inválido" al implementar una constante con script en Inno Setup



syntax inno-setup (1)

Entonces, dada esta función, aparece el error "Identificador esperado" en GetRoot := ROOTPage.Values[0]; línea. ¿Espero que me esté diciendo que ROOTPage no está definido?

const DefaultRoot = ''C:/IAmGRoot''; Var ROOTPage : TInputQueryWizardPage; procedure SetupRoot; begin ROOTPage := CreateInputQueryPage(wpUserInfo, ExpandConstant(''{cm:RootTitle}''), ExpandConstant(''{cm:RootInstructions}''), ExpandConstant(''{cm:RootDescription}'') + '' "'' + DefaultRoot + ''"'' ); ROOTPage.Add(ExpandConstant(''{cm:SSRoot}'') + '':'', False); ROOTPage.Values[0] := ExpandConstant(''{DefaultRoot}''); // add SSROOT to path end; function GetRoot : string; begin GetRoot := ROOTPage.Values[0]; end;

¿Cómo debo interpretar este error? ¿Qué es un identificador en Pascal?

Esta page me dice que los identificadores son nombres de variables. ¿Quizás necesito expandir ROOTPage.Values[0] de alguna manera ya que estoy haciendo referencia a una matriz de un objeto Inno Setup?

O tal vez necesito devolver el valor de manera diferente. Vi una página en Pascal que decía que tenía que evitar asignar al valor de función en funciones sin parámetros para evitar un bucle recursivo. ¿Esto significa que debería pasar un valor ficticio? o hay una sintaxis diferente? Esa página no lo explicó.

Secretamente creo que mi problema real es que no estoy definiendo mi función correctamente ... pero bien. Eso compila al menos. Esta pregunta podría ser: ¿Cómo maneja una función sin parámetros en Pascal?

No creo que Inno Setup sea parte del problema, pero estoy trabajando con Inno Setup en caso de que sea importante.

Actualización: no parece ser la matriz porque esto obtiene el mismo error:

const DefaultRoot = ''C:/IAmGRoot''; function GetRoot : string; begin GetRoot := DefaultRoot; end;

Actualización: Este link ha dicho que el nombre de la función se puede reemplazar / se debe reemplazar con la palabra clave Result , como el siguiente código. En realidad lo sabía, pero el compilador Inno Setup no reconoce esto como una sintaxis válida. Luego me dice que mi función es un prototipo no válido.

function GetRoot : string; begin Result := DefaultRoot; end;

Actualización: si hago esto me sale "Prototipo no válido para GetRoot"

function GetRoot : boolean; begin Result := False; end;

Actualización para @Martin Prikryl:

Bueno, lo uso en algunos lugares, pero el uso típico sería así:

[Files] Source: "C:/ValidPath/Release/*"; DestDir: "{app}/bin"; Components: DefinedComponent Source: "C:/ValidPath/Deployment/*"; DestDir: "{code:GetRoot}/"; Flags: ignoreversion recursesubdirs; Components: DefinedComponent


Identificador esperado

Su código sería correcto en un Pascal, pero no se compila en Pascal Script.

En Pascal, cuando desea asignar un valor de retorno de una función, puede asignar el valor a una "variable" con un nombre de la función o a la variable Result .

Entonces esto es correcto:

function GetRoot: string; begin GetRoot := ROOTPage.Values[0]; end;

Y esto también (ambos son equivalentes):

function GetRoot: string; begin Result := ROOTPage.Values[0]; end;

En el Script Pascal, solo funciona el Result . Cuando utiliza el nombre de la función, obtiene el "Identificador esperado".

Prototipo inválido

Obtiene esto cuando se llama a la función desde el tamaño de la sección Code y se requiere una lista de parámetros / valor de retorno específico. Pero no nos dijo para qué utiliza la función GetRoot .

Hay dos lugares donde puede usar una función personalizada en Inno Setup:

  • Parámetro de Check : para esto, la función debe devolver un valor Boolean y no tomar ningún parámetro o un parámetro (el tipo de parámetro está determinado por un valor que proporcione en el parámetro de Check ).

    function MyProgCheck(): Boolean; function MyDirCheck(DirName: String): Boolean;

  • Constantes con secuencia de comandos: la función debe devolver una string y tomar un parámetro de string , incluso si no se proporciona ningún parámetro en la constante con secuencia de comandos. Supongo que este es su caso de uso. Si no necesita ningún parámetro, simplemente declare, pero no lo use:

    function GetRoot(Param: String): string; begin Result := ROOTPage.Values[0]; end;