2009-05-20 16 views
10

In una delle applicazioni demo Delphi, ho inciampato su qualche sintassi che non conoscevo l'accettato compilatore Delphi:Parametri nominati/facoltativi in ​​Delphi?

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

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

io non riesco a riprodurre questo tipo di parametro che passa nella mia codice, e non vedo mai nessuno che lo usi. Quindi, queste sono le mie domande:

  • Posso usare questo nei metodi "normali" e se è parte di "linguaggio Delphi", o si tratta di qualche trucco compilatore per oggetti di automazione?

  • Cosa è necessario per poter utilizzare questo?

  • È simile ai parametri denominati e facoltativi del C# 4?


Ulteriori informazioni: Di ​​solito passo record o semplici classi in presenza sono molti parametri opzionali metodi, ma sembra che io non avrei bisogno che con questa sintassi. Sono a conoscenza dello dei valori dei parametri predefiniti, ma la loro utilità è limitata perché l'utente non può fornire alcun parametro per il diritto di uno omesso. In JavaScript Sto usando questo stile di parametro con nome tutto il tempo (sia con la diversa sintassi ), sia potente.

+0

La funzione di passare i parametri nominandoli è la funzione OLE e non la funzionalità di Delphi. Non perdere tempo a realizzare questa funzione a Delhi. –

risposta

19

parametri Chiaramente il linguaggio Delphi supporta nominato dal momento che appaiono proprio lì nel codice di esempio Delphi. Delphi supporta i parametri denominati sugli oggetti di automazione, che sono oggetti che implementano l'interfaccia IDispatch. There are restrictions on the types the parameters and return types can have; in particolare, non possono essere classi di Delphi.

Non credo che la convenienza che si cerca dai parametri denominati superi il livello di prestazioni che si otterrebbe facendo instradare tutte le chiamate di metodo attraverso il metodo IDispatch.Invoke. Potrebbe anche essere necessario utilizzare prima la chiamata GetIDsOfNames. Non vedi questo in più codice perché l'associazione tardiva è di solito qualcosa che le persone cercano di evitare.Utilizzare l'associazione anticipata ogni volta che è possibile per evitare il costo della ricerca degli ID di invio e delle invocazioni di metodi indiretti.

Delphi supporta i parametri opzionali nel codice di non automazione consentendo valori predefiniti. È possibile omettere i parametri effettivi per qualsiasi parametro con un valore predefinito purché si omettano anche i parametri effettivi di tutti i parametri successivi: il compilatore garantisce che la dichiarazione di una funzione lo consenta.

Penso che i parametri opzionali siano sopravvalutati. Risparmiano tempo per la (una) persona che scrive il codice, ma non per le (molte) persone che leggono il codice. Chiunque stia leggendo, deve sapere quali saranno i valori predefiniti di qualsiasi parametro non specificato, quindi potresti anche fornire esplicitamente tutti i valori in ogni caso.

+2

Mi piacerebbe: Puoi chiamare una funzione che dice "Voglio l'esatto bahaviour di default ad eccezione di * this * one thing." e il lettore otterrebbe immediatamente la tua intenzione. Come ora è necessario eseguire la scansione di molte chiamate alla funzione in cui corrispondono i parametri predefiniti e dove si differenziano. –

+3

Sono d'accordo con Ulrich. Dal mio tempo con Ruby, essere in grado di specificare i parametri con nome è molto utile, specialmente per le funzioni che possono avere molti parametri e ti interessa solo un paio. Aumentano anche la leggibilità del codice, in quanto non è necessario conoscere l'ordine di chiamata dei parametri per capire a cosa serve ciascun parametro. –

+2

Mi piace usarli. Invece di CallProc (1, 2, 3) riesco a leggere CallProc (TimesToLoop: = 1, MagicValue: = 2, PossibleReturnCode: = 3) – Bilbo

2

Se si dichiara la routine in questo modo:

procedure DoSomething(AParam : integer = 0); 

... assumerà un valore pari a 0 per il parametro se non è dato. Se non ricordo male, i parametri con valori di default devono essere alla fine della chiamata, in modo simile a questo:

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

non in questo modo:

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

Si tratta essenzialmente di "qualche trucco compilatore per oggetti di automazione ". A volte devo usarlo per l'automazione di Excel e Word.

ad es.

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

equivale a VBA

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