2009-05-20 21 views
10

En una de las aplicaciones de demostración de Delphi, que ha tropezado con una sintaxis que no sabía que el compilador Delphi aceptado:Parámetros nombrados/opcionales en Delphi?

// ......\Demos\DelphiWin32\VCLWin32\ActiveX\OleAuto\SrvComp\Word\  
// Main.pas, line 109 

Docs.Add(NewTemplate := True); // note the assignment 

Me parece que no puede reproducir este tipo de parámetro que pasa en mi propia código, y nunca veo a nadie usarlo. Así que estas son mis preguntas:

  • ¿Puedo usar esto en métodos "normales" y que es parte del "lenguaje Delphi", o se trata de algún artilugio compilador para objetos de automatización?

  • ¿Qué se necesita para poder usar esto?

  • ¿Es esto algo así como los parámetros nombrados y opcionales de C# 4?


Información adicional: Por lo general paso registros o clases simples cuando hay son muchos parámetros opcionales a métodos, pero parece que no necesitaría que con esta sintaxis. Soy consciente de valores de parámetros predeterminados, pero su utilidad es limitada porque no puede proporcionar ningún parámetro al derecho de uno omitido. En JavaScript estoy usando este parámetro llamado estilo todo el tiempo (ya sea con la sintaxis diferente), y es poderoso.

+0

La función de pasar parámetros al nombrarlos es la característica de OLE y no la función de Delphi. No pierda el tiempo al realizar esta función en Delhi. –

Respuesta

19

parámetros Es evidente que el lenguaje Delphi mediante named ya que aparecen allí mismo, en la muestra de código de Delphi. Delphi admite parámetros con nombre en objetos de automatización, que son objetos que implementan la interfaz IDispatch. There are restrictions on the types the parameters and return types can have; en particular, no pueden ser clases Delphi.

No creo que la conveniencia que busca de los parámetros nombrados superaría el impacto en el rendimiento que obtendría haciendo que cada método se enrutara a través del método IDispatch.Invoke. Una llamada también puede necesitar usar primero GetIDsOfNames. No se ve esto en más código porque el enlace tardío suele ser algo que las personas intentan evitar.Utilice enlaces anticipados siempre que sea posible para evitar el costo de buscar ID de despacho e invocaciones indirectas de métodos.

Delphi admite parámetros opcionales en códigos que no son de automatización al permitir valores predeterminados. Puede omitir los parámetros reales para cualquier parámetro con un valor predeterminado siempre que también omita los parámetros reales de todos los parámetros posteriores; el compilador asegura que la declaración de una función lo permite.

Creo que los parámetros opcionales están sobrevalorados. Ahorran tiempo para la (persona) que escribe el código, pero no para las (muchas) personas que leen el código. Quien lo lea necesita saber cuáles serán los valores predeterminados de los parámetros no especificados, por lo que también puede proporcionar todos los valores explícitamente de todos modos.

+2

Me gustaría: podría llamar a una función que diga "Quiero el comportamiento predeterminado exacto excepto * esto * una cosa". y el lector obtendrá su intención de inmediato. Como es ahora, debe escanear muchas llamadas a la función donde coinciden con los parámetros predeterminados y difieren. –

+3

Estoy de acuerdo con Ulrich. De mi tiempo usando Ruby, ser capaz de especificar parámetros nombrados es muy útil, especialmente para funciones que pueden tener muchos parámetros y solo te importan un par. También aumentan la legibilidad del código, ya que no necesita conocer el orden de las llamadas de parámetros para comprender para qué sirve cada parámetro. –

+2

Me gusta usarlos. En lugar de CallProc (1, 2, 3) puedo leer CallProc (TimesToLoop: = 1, MagicValue: = 2, PossibleReturnCode: = 3) – Bilbo

2

si se declara su procedimiento, así:

procedure DoSomething(AParam : integer = 0); 

... que asumirá un valor de 0 para el parámetro si no se da. Por lo que recuerdo, los parámetros con los valores por defecto tienen que estar al final de la llamada, por lo que de esta manera:

procedure DoSomething(AFirstParam : string; AParam : integer = 0); 

no como este:

procedure DoSomething(AParam : integer = 0; ASecondParam : string); 
4

Se trata básicamente de "algún artilugio compilador para objetos de automatización ". A veces tengo que usarlo para la automatización de Excel y Word.

p. Ej.

MSExcel.Application.Cells.Replace(What:='', Replacement:='', LookAt:=xlPart, 
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True, ReplaceFormat:=True); 

es equivalente a VBA

Application.Cells.Replace(What='', Replacement='', LookAt=xlPart, _ 
    SearchOrder=xlByRows, MatchCase=False, SearchFormat=True, ReplaceFormat=True) 
Cuestiones relacionadas