2009-05-20 12 views
10

In eines der Delphi-Demo-Anwendungen, ich habe auf einige Syntax gestolpert, dass ich nicht den Delphi-Compiler akzeptiert wusste:Benannte/optionale Parameter in Delphi?

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

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

Ich kann nicht diese Art von Parametern scheint in meinem eigenen vorbei zu reproduzieren Code, und ich sehe nie, dass jemand es benutzt. Das sind also meine Fragen:

  • Kann ich diese in „normalen“ Verfahren und es ist ein Teil von „Delphi“, oder ist dies einige Compiler-Hack für Automatisierungsobjekte?

  • Was ist nötig, um dies nutzen zu können?

  • Ist dies etwas wie die benannten und optionalen Parameter von C# 4?


Zusätzliche Informationen: Ich in der Regel Aufzeichnungen oder einfache Klassen übergeben, wenn es viele optionale Parameter Methoden sind, aber es sieht so würde ich nicht müssen, dass mit dieser Syntax. Ich kenne von Standard-Parameter-Werte, aber ihre Brauchbarkeit ist begrenzt, weil Sie keine Parameter an die Rechte eines weggelassenen bereitstellen können. In JavaScript benutze ich diesen benannten Parameter Stil die ganze Zeit (sei es mit anderen Syntax), und es ist mächtig.

+0

Die Eigenschaft, Parameter durch Benennung zu übergeben, ist die Funktion von OLE und nicht die von Delphi. Verschwenden Sie keine Zeit, dieses Feature in Delhi zu realisieren. –

Antwort

19

Klar, dass die Sprache Delphi benannte Parameter unterstützt, da sie genau dort in Beispiel Delphi-Code angezeigt. Delphi unterstützt benannte Parameter in Automatisierungsobjekten, bei denen es sich um Objekte handelt, die die Schnittstelle IDispatch implementieren. There are restrictions on the types the parameters and return types can have; Insbesondere können sie keine Delphi-Klassen sein.

Ich glaube nicht, dass die Bequemlichkeit, die Sie von benannten Parametern suchen, den Leistungshieb überwiegt, den Sie nehmen würden, wenn jeder Methodenaufruf über die IDispatch.Invoke Methode weitergeleitet wird. Ein Anruf muss möglicherweise auch GetIDsOfNames zuerst verwenden. Sie sehen dies nicht in mehr Code, weil eine späte Bindung normalerweise etwas ist, das die Leute zu vermeiden versuchen.Verwenden Sie die frühzeitige Bindung wann immer möglich, um die Kosten für das Nachschlagen von Versand-IDs und indirekten Methodenaufrufen zu vermeiden.

Delphi unterstützt optionale Parameter in nicht automatisiertem Code, indem Standardwerte zugelassen werden. Sie können die tatsächlichen Parameter für jeden Parameter mit einem Standardwert weglassen, solange Sie auch die tatsächlichen Parameter aller nachfolgenden Parameter weglassen - der Compiler stellt sicher, dass die Deklaration einer Funktion dies zulässt.

Ich denke optionale Parameter werden überbewertet. Sie sparen Zeit für die (eine) Person, die den Code schreibt, aber nicht für die (vielen) Leute, die den Code lesen. Wer es liest, muss wissen, wie die Standardwerte von irgendwelchen nicht spezifizierten Parametern sind, also können Sie auch alle Werte explizit angeben.

+2

Ich würde sie mögen: Sie könnten eine Funktion aufrufen, die sagt: "Ich möchte das genaue Standardverhalten, außer für * dieses * eine Ding." und der Leser würde sofort Ihre Absicht bekommen. Wie es jetzt ist, müssen Sie viele Aufrufe an die Funktion scannen, wo sie den Standardparametern entsprechen und wo sie sich unterscheiden. –

+3

Ich stimme Ulrich zu. Seit ich Ruby benutze, ist es sehr praktisch, benannte Parameter angeben zu können, besonders für Funktionen, die viele Parameter haben können und nur für ein Paar wichtig sind. Sie erhöhen auch die Lesbarkeit des Codes, da Sie die Aufrufreihenfolge des Parameters nicht kennen müssen, um zu verstehen, wofür die einzelnen Parameter stehen. –

+2

Ich benutze sie gerne. Anstelle von CallProc (1, 2, 3) kann ich CallProc lesen (TimesToLoop: = 1, MagicValue: = 2, PossibleReturnCode: = 3) – Bilbo

2

Wenn Sie erklären, um Ihre Prozedur wie folgt:

procedure DoSomething(AParam : integer = 0); 

... es wird einen Wert von 0 für den Parameter übernehmen, wenn es nicht gegeben. Soweit ich mich erinnere, haben Parameter mit Standardwerten am Ende des Anrufs sein, also wie folgt aus:

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

nicht mag:

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

Es ist im Grunde „einige Compiler Hack für Automatisierungsobjekte ". Manchmal muss ich es für Excel und Word-Automatisierung verwenden.

z.B.

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

entspricht VBA

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