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

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

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

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

Сообщение Climber » 14.11.2008 12:49:13

У меня несколько ламерских вопросов.
1. Насколько я помню, еще в Турбо Паскале были функции readln и writeln, в которые можно было передавать произвольное количество параметров. Мне кажется, я даже когда-то знал, как описать такую функцию... Только забыл. В Lazarus так можно? Мне нужно функцию написать, которая бы из одного места вызывалась с параметром, из другого - без (потому что в другом месте ей просто нечего присваивать). В принципе, можно из обоих мест вызывать без параметра, только создать переменную и не присваивать ей ничего. Желательно, внутри функции еще как-то определять, передан параметр или нет (параметр - простой тип вроде integer или string).
2. Если я на форму динамически добавляю компонент:
Код: Выделить всё
  MyPanel:=TPanel.Create(Self);
  MyPanel.Parent:= Self; //  Self = Form
Как отследить события этого компонента?
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

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

Сообщение Mr.Smart » 14.11.2008 13:49:36

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;
...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение B4rr4cuda » 14.11.2008 14:25:21

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

Код: Выделить всё
procedure SomeProc( FirstParam:integer=0; SecParam:string='some string');

Таким макаром, если не передан параметр, то используется указанное в описании процы значение переменной.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

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

Сообщение Timid » 14.11.2008 17:01:26

Можно использовать также переопределение функций.
Делаешь несколько дубликатов функции с разным количеством параметров, при компиляции будет выбран подходящий по количеству переменных.
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

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

Сообщение Climber » 14.11.2008 22:48:05

Спасибо за ответы. Мне наверно, последний вариант больше подойдет. Причем я этот способ знал, только как-то не догадался даже...
А еще по поводу второго варианта вопрос: значение по умолчанию может быть только у параметра функции или любая переменная может его иметь? Ну типа как в С/С++?
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

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

Сообщение Mr.Smart » 14.11.2008 23:17:56

При использование диалекта язызыка freepascal (директива {$mode objfpc}) возможна такая конструкция:
Код: Выделить всё
var
  s: String = 'Test';

в этом случае переменная s инициализируется не nil, а 'Test'
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Сквозняк » 19.10.2021 15:46:08

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

Код: Выделить всё
procedure SomeProc( FirstParam:integer=0; SecParam:string='some string');

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


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

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

Сообщение iskander » 19.10.2021 17:00:34

Емнип
Код: Выделить всё
{$modeswitch defaultparameters}

а дальше все точно так же.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Alex2013 » 19.10.2021 19:54:34

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

Вполне ! Иногда удобно, но если "предварительно заданных опциональных параметров" несколько то есть тонкости доступа к ним, однако вроде как все "интуитивно понятно . :idea:
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение iskander » 19.10.2021 20:09:26

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


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

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

Сообщение Сквозняк » 19.10.2021 20:47:43

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

Это в объектном и дельфийском паскалях такое из коробки работает, а не в свободном.
Сквозняк
энтузиаст
 
Сообщения: 1110
Зарегистрирован: 29.06.2006 22:08:32

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

Сообщение zoltanleo » 24.10.2021 00:59:27

А мне показалось, что ТС про default параметры говорит. Нет?
https://wiki.freepascal.org/Default_parameter/ru
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 457
Зарегистрирован: 17.10.2013 10:55:01

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

Сообщение Seenkao » 24.10.2021 12:07:59

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

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

Надо знать, что после параметров по умолчанию, не должны идти задаваемые параметры. В этом случае компилятор ругается.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

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

Сообщение iskander » 24.10.2021 15:18:17

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

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

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

звучит странно. Это просто не скомпилируется.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение zoltanleo » 24.10.2021 18:36:22

Сомнений нет, в топике в основном про директиву overload почему-то говорили.
Насчёт последовательности обязательных и необязательных параметров тоже согласен.
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 457
Зарегистрирован: 17.10.2013 10:55:01

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 86

Рейтинг@Mail.ru