Предполага се, че е възможно на методите да липсват техните аргументи в изпълнението?

Сблъсквам се с някои често срещани грешки в IDE в Delphi XE2 (RAD Studio), но самите проблеми не ме притесняват. Това е резултат от един от тези грешки, които ме накараха да се натъкна на нещо друго.

По някакъв начин автоматичното довършване реши да унищожи няколко метода на формуляр, така че какво беше...

procedure TForm1.Button1Click(Sender: TObject);

в изпълнението стана нещо като...

procedure TForm1.Buproced(Sendure :);

(Не точно, но до известна степен така)

Така че трябваше ръчно да коригирам тези методи. Въпреки това случайно поправих един от тях на...

procedure TForm1.Button1Click;

въпреки че трябваше да бъде...

procedure TForm1.Button1Click(Sender: TObject);

но все още се компилира и работи добре.

За да тествате, стартирайте ново VCL Forms Application и изпуснете само една TButton контрола, направете манипулатор на събития за OnClick и променете процедурата му на...

procedure TForm1.Button1Click;
var
  B: TButton;
begin
  B:= TButton(Sender);
  B.Caption:= 'Something';
end;

Това трябва ли да е възможно? Или може би е грешка в IDE и/или компилатора?


person Jerry Dodge    schedule 28.07.2013    source източник
comment
Единствената причина за изключване на параметри, която мога да разбера, е да съкратя количеството код.   -  person Jerry Dodge    schedule 28.07.2013


Отговори (2)


В Delphi можете да пропуснете параметрите в изпълнението. Това не е грешка, това е функция.

Правилният подпис на метода се оценява от декларацията в раздела за интерфейс.

person nullptr    schedule 28.07.2013
comment
Никога не съм използвал тази функция. Много е подвеждащо, когато четете кода. IMHO това е слабост на езика: не мога да видя една причина за това поведение, особено с Delphi IDE, която пише кода вместо вас (напр. с Ctrl+Shift+C от интерфейсната част). Може да има смисъл в дните на Turbo Pascal... Сега е объркващо. - person Arnaud Bouchez; 28.07.2013
comment
@ArnaudBouchez, наистина слабост. Никога не съм виждал причина (освен мързел) ​​да използвам тази функция. Дори в дните на Turbo Pascal. - person LU RD; 28.07.2013
comment
Наистина, винаги използвам довършване на код, откакто го имам на разположение, и оттогава никога не съм писал внедряване на метод на клас без него. - person Jerry Dodge; 28.07.2013
comment
@Arnaud Причината е поддръжка. Модификациите на списъка с параметри (или дори типа на резултата в случай на функция!) могат да бъдат направени в единичната декларация в раздела за интерфейс. Никога обаче не го използвам. - person NGLN; 29.07.2013
comment
Това, което не ми харесва в Class Completion е, че пропуска стойностите на параметрите по подразбиране в частта за изпълнение на прототипите на метода. След това не можете да видите, че даден параметър има стойност по подразбиране при първия изглед (ако не завършите сами тази стойност на параметъра по подразбиране в прототипа). - person TLama; 29.07.2013
comment
@TLama: Всъщност предпочитам параметрите по подразбиране да липсват в изпълнението. В самия ми код няма голямо значение какви са настройките по подразбиране и ако открия, че трябва да променя настройките по подразбиране по време на поддръжката, това е едно място по-малко, където трябва да търся стойности. - person afrazier; 29.07.2013

Това е умишлена и документирана функция на езика. Това е частта от документацията, която описва тази функция, с моето допълнително наблягане:

Докато един клас може да бъде деклариран или в интерфейса, или в раздела за изпълнение на единица, дефинирането на декларации за методите на клас трябва да бъде в раздела за изпълнение.

В заглавието на дефинираща декларация името на метода винаги се допълва с името на класа, към който принадлежи. Заглавието може да повтаря списъка с параметри от декларацията на клас; ако го направи, редът, типът и имената на параметрите трябва да съвпадат точно, а ако методът е функция, върнатата стойност също трябва да съвпада.

person David Heffernan    schedule 29.07.2013