2009-05-20 24 views
10

W jednej z aplikacji demo Delphi, ja natknęliśmy się na jakiejś składni, które nie wiedziałem, że kompilator Delphi przyjętych:Parametry nazwane/opcjonalne w Delphi?

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

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

I nie wydają się odtworzyć ten typ parametru przechodzącą w mój własny kod i nigdy nie widzę, żeby ktoś z niego korzystał. To są moje pytania:

  • mogę używać w „normalnych” metodami i jest ona częścią „Delphi Język”, czy też jest to jakiś kompilator Hack dla obiektów automatyki?

  • Co jest potrzebne, aby móc z niego korzystać?

  • Czy jest to coś w rodzaju parametrów opcjonalnych C# 4?


Dodatkowe informacje: Ja zazwyczaj przechodzą rekordów lub proste zajęcia, kiedy wiele opcjonalnych parametrów do metod, ale wygląda na to, że nie musiałby że z tej składni. Domyślne wartości parametrów są znane, ale ich użyteczność jest ograniczona, ponieważ nie może podać żadnych parametrów do prawa pomijanego. W JavaScript używam tego nazwanego stylu parametru przez cały czas (czy to z inną składnią ), i to jest potężne.

+0

Cechą przekazywania parametrów poprzez ich nazywanie jest funkcja OLE, a nie funkcja Delphi. Nie trać czasu na realizację tej funkcji w Delhi. –

Odpowiedz

19

Wyraźnie języka Delphi obsługuje nazwane parametry, ponieważ pojawiają się one tam w przykładowy kod Delphi. Delphi obsługuje nazwane parametry w obiektach automatyzacji, które są obiektami implementującymi interfejs IDispatch. There are restrictions on the types the parameters and return types can have; w szczególności nie mogą być klasami Delphi.

Nie sądzę, że wygoda, której szukasz od nazwanych parametrów, przeważyłaby nad trafieniem wydajności, które można uzyskać, wywołując każde wywołanie metody metodą IDispatch.Invoke. Połączenie może również wymagać najpierw użycia GetIDsOfNames. Nie widzisz tego w większej ilości kodu, ponieważ późniejsze wiązanie jest zwykle czymś, czego ludzie starają się unikać.W miarę możliwości używaj wczesnego wiązania, aby uniknąć kosztów wyszukiwania identyfikatorów wysyłki i pośrednich wywołań metod.

Delphi obsługuje opcjonalne parametry w kodzie innym niż automatyzacja, dopuszczając wartości domyślne. Można pominąć faktyczne parametry dla dowolnego parametru o wartości domyślnej, o ile pominie się również faktyczne parametry wszystkich kolejnych parametrów - kompilator zapewnia, że ​​deklaracja funkcji na to pozwala.

Myślę, że opcjonalne parametry są przereklamowane. Oszczędzają czas dla (jednej) osoby piszącej kod, ale nie dla (wielu) osób czytających kod. Każdy, kto ją czyta, musi wiedzieć, jakie wartości domyślne będą miały nieokreślone parametry, więc równie dobrze możesz podać wszystkie wartości jawnie.

+2

Chciałbym je: Można wywołać funkcję mówiąc: "Chcę dokładnego domyślnego bahavour z wyjątkiem * tej * jednej rzeczy." a czytelnik natychmiast otrzyma twoją intencję. Ponieważ obecnie trzeba skanować wiele wywołań funkcji, w których są one zgodne z domyślnymi parametrami i gdzie się różnią. –

+3

Zgadzam się z Ulrichem. Odkąd używam Rubiego, możliwość określania nazwanych parametrów jest bardzo przydatna, szczególnie w przypadku funkcji, które mogą mieć wiele parametrów i zależy ci tylko na kilku osobach. Zwiększają także czytelność kodu, ponieważ nie trzeba znać kolejności wywoływania parametrów, aby zrozumieć, do czego służy dany parametr. –

+2

Lubię ich używać. Zamiast CallProc (1, 2, 3) mogę przeczytać CallProc (TimesToLoop: = 1, MagicValue: = 2, PossibleReturnCode: = 3) – Bilbo

2

Jeśli zadeklarować procedurę tak:

procedure DoSomething(AParam : integer = 0); 

... to będzie przyjmować wartość 0 dla parametru, jeśli nie jest podana. Jak sobie przypominam, parametry z wartościami domyślnymi muszą być pod koniec rozmowy, tak jak to:

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

nie podoba:

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

To jest w zasadzie „jakiś kompilator Hack dla obiektów automatyki ". Czasami muszę go używać do automatyzacji Excela i Worda.

np.

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

jest równoznaczne z VBA

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