Необязательный параметр функции

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Необязательный параметр функции

Сообщение Climber »

У меня несколько ламерских вопросов.
1. Насколько я помню, еще в Турбо Паскале были функции readln и writeln, в которые можно было передавать произвольное количество параметров. Мне кажется, я даже когда-то знал, как описать такую функцию... Только забыл. В Lazarus так можно? Мне нужно функцию написать, которая бы из одного места вызывалась с параметром, из другого - без (потому что в другом месте ей просто нечего присваивать). В принципе, можно из обоих мест вызывать без параметра, только создать переменную и не присваивать ей ничего. Желательно, внутри функции еще как-то определять, передан параметр или нет (параметр - простой тип вроде integer или string).
2. Если я на форму динамически добавляю компонент:

Код: Выделить всё

  MyPanel:=TPanel.Create(Self);
  MyPanel.Parent:= Self; //  Self = Form
Как отследить события этого компонента?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

1. Используй в функции параметр типа array of <Тип>

Код: Выделить всё

procedure Test(arr: array of Integer);
var
 j: Integer;
begin
  for j:=Low(arr) to High(arr) do
   // Действие с параметрами arr[j];
end;


2. Создай процедуру обработчик и присвое её свойству компанента

Код: Выделить всё

type
  TMyForm = class(TForm)
  ....
  private
    procedure OnClick(Sender: Tobject);
  ....
 end;
...
  MyPanel:=TPanel.Create(Self);
  MyPanel.Parent:=self;
  MyPanel.OnClick:=@OnClick;
...
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Кроме способа описанного Mr.Smart, можно использовать и такой:

Код: Выделить всё

procedure SomeProc( FirstParam:integer=0; SecParam:string='some string');

Таким макаром, если не передан параметр, то используется указанное в описании процы значение переменной.
Timid
постоялец
Сообщения: 290
Зарегистрирован: 21.11.2007 20:33:15

Сообщение Timid »

Можно использовать также переопределение функций.
Делаешь несколько дубликатов функции с разным количеством параметров, при компиляции будет выбран подходящий по количеству переменных.
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

Спасибо за ответы. Мне наверно, последний вариант больше подойдет. Причем я этот способ знал, только как-то не догадался даже...
А еще по поводу второго варианта вопрос: значение по умолчанию может быть только у параметра функции или любая переменная может его иметь? Ну типа как в С/С++?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

При использование диалекта язызыка freepascal (директива {$mode objfpc}) возможна такая конструкция:

Код: Выделить всё

var
  s: String = 'Test';

в этом случае переменная s инициализируется не nil, а 'Test'
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

B4rr4cuda писал(а):Кроме способа описанного Mr.Smart, можно использовать и такой:

Код: Выделить всё

procedure SomeProc( FirstParam:integer=0; SecParam:string='some string');

Таким макаром, если не передан параметр, то используется указанное в описании процы значение переменной.


А во фреепаскаль диалекте как такое пишется?
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Емнип

Код: Выделить всё

{$modeswitch defaultparameters}

а дальше все точно так же.
Alex2013
долгожитель
Сообщения: 3230
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

iskander писал(а):А во фреепаскаль диалекте как такое пишется?

Вполне ! Иногда удобно, но если "предварительно заданных опциональных параметров" несколько то есть тонкости доступа к ним, однако вроде как все "интуитивно понятно . :idea:
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Alex2013 писал(а):
iskander писал(а):А во фреепаскаль диалекте как такое пишется?


А я точно такое писал?
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

Alex2013 писал(а):Вполне !

Это в объектном и дельфийском паскалях такое из коробки работает, а не в свободном.
Аватара пользователя
zoltanleo
постоялец
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Сообщение zoltanleo »

А мне показалось, что ТС про default параметры говорит. Нет?
https://wiki.freepascal.org/Default_parameter/ru
Seenkao
энтузиаст
Сообщения: 578
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

Сквозняк писал(а):Это в объектном и дельфийском паскалях такое из коробки работает, а не в свободном.

Странно, но ты этим пользовался достаточно давно. В ZenGL достаточно много параметров по умолчанию идут. И хочешь сказть, что компилируя проекты, ты ни разу не столкулся с проблемой компиляции?
Я ни разу не столкнулся (за время пользования FPC/Lazarus) с тем, что по умолчанию можно задавать параметры (я достаточно недавно пользуюсь именно FPC), и компилятор ни разу не ругался.

Надо знать, что после параметров по умолчанию, не должны идти задаваемые параметры. В этом случае компилятор ругается.
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

zoltanleo писал(а):А мне показалось, что ТС про default параметры говорит. Нет?
https://wiki.freepascal.org/Default_parameter/ru

Я тоже вроде про них говорил. А в чём сомнение?

Фраза из вики
вика писал(а):Будьте осторожны: если хоть один параметр определен как необязательный, то все последующие параметры тоже будут необязательными. Обязательный параметр не должен идти после необязательного.

звучит странно. Это просто не скомпилируется.
Аватара пользователя
zoltanleo
постоялец
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Сообщение zoltanleo »

Сомнений нет, в топике в основном про директиву overload почему-то говорили.
Насчёт последовательности обязательных и необязательных параметров тоже согласен.
Ответить