¿Verificar si el parámetro de función no está definido en SmartMS?

¿Cómo puedo verificar si un parámetro de función no está definido?

procedure Test(aValue: TObject);
begin
  if aValue <> nil then
    ShowMessage('param filled')      <-- also when Test() is executed!
  else
    ShowMessage('no param filled')   <-- not called, only when Test(nil) is called
end;

Sin embargo, cuando se llama a esta función en JS puro sin un parámetro, entonces aValue = indefinido, pero la verificación <> nil se convierte en == null.

Por ejemplo, cuando tiene una función JS con una devolución de llamada:

type
  TObjectProcedure = procedure(aValue: TObject);

procedure FetchUrlAsync(aUrl: string; aCallback: TObjectProcedure )
begin
  asm
    $().load(@aUrl, @aCallback);
  end;
end;

Puede llamar a esta función con:

FetchUrlAsync('ajax/test.html', Test);

Ahora depende de jQuery si se llama a "Prueba" con un parámetro o no.

preguntado el 22 de mayo de 12 a las 14:05

Si Test se declara de esa manera, no puede llamar a Test(), no se compilará. Que eres democracia ¿Intentando hacer? -

@gabr: En Smart no puedes llamar a Test(), así es. ¡Pero puede usar "Prueba" como una devolución de llamada JS, y la función puede ejecutar esta devolución de llamada sin ningún parámetro! -

2 Respuestas

En la próxima versión, podrá utilizar definido () función especial, hará una verificación estricta contra indefinido (devolverá verdadero para un valor nulo).

if Defined(aValue) then
   ...

En la versión actual se puede definir una función para comprobar que

function IsDefined(aValue : TObject);
begin
   asm
      @result = (@aValue!==undefined);
   end;
end;

contestado el 23 de mayo de 12 a las 07:05

Pasar TObject a Defined da como resultado el error de sintaxis "Cadena esperada". - Gabriel

nota agregada sobre la versión en la que debería aparecer! - eric grange

En la versión actual (1.0) puede usar la función varIsValidRef() para verificar si un valor no está definido. La función es parte de w3system.pas por lo que siempre está ahí. Se parece a esto:

function varIsValidRef(const aRef:Variant):Boolean;
begin
  asm
    if (@aRef == null) return false;
    if (@aRef == undefined) return false;
    return true;
  end;
end;

Esto verifica tanto si es nulo como si no está definido, por lo que también puede usarlo contra referencias de objetos (el tipo THandle es una variante).

Respondido el 06 de junio de 12 a las 17:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.