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 valorBoolean
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 deCheck
).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 destring
, 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;