Как можно передать параметры, допустим с помощью ярлыка, в программу на PascalABC.NET? На языках C вроде понятно - это аргументы функции main(...)
. На паскале main
нет.
Есть переменная CommandLineArgs
, которую заполняет с помощью System.Environment
вот так:
var arg := Environment.GetCommandLineArgs();
if arg.Length > 1 then begin
CommandLineArgs := new string[arg.Length - 1];
for var i := 1 to arg.Length - 1 do
CommandLineArgs[i - 1] := arg[i];
end else
CommandLineArgs := new string[0];
Первый параметр удаляет, потому что он всегда содержит имя .exe файла, а его и по-другому получить можно.
Ну и в Help\ Справочник по языку\ Системный модуль PABCSystem\ Системные подпрограммы можно посмотреть ParamCount
и ParamStr
.
begin
if ParamCount = 0 then
Print('Нужны параметры')
else
for var i := 0 to ParamCount do
println(ParamStr(i));
end.
Нулевой параметр, как отмечено выше, – это полный адрес файла, а сами параметры – строки. Так что если нужны числа, надо преобразовывать.
Нет ну вот эти 2 функции использовать не стоит. Они ужасно не эффективно реализованы.
Работают один раз при старте программы… При чём тут эффективность? Вы собираетесь гигабайт передавать через комстроку?
Гигабайт нет, а передачу тысяч параметров за раз я видел…
Учитель: Дети, запишите предложение:
"Рыба сидела на дереве".
Ученик: А разве рыбы сидят на деревьях?
Учитель: Ну... Это была сумасшедшая рыба.
(А. и Б. Стругацкие. "Понедельник начинается в субботу")
А если серьезно, даже три десятка параметров - это перебор. Для такого существует файловый обмен.
Параметры также используются для передачи информации оболочке. Поэтому надо использовать только ParamStr
Погодите что? Я что то не уловил мысль. Записывать то в них всё равно ничего нельзя.
В режиме связи с оболочкой, насколько я помню, IDE туда что-то пишет.
Благодарен за помощь. PascalABC передаёт в качестве [1]
параметра принимает значение по умолчанию [REDIRECTIOMODE]
. Впрочем try except end
всё приводит в порядок.
Это не хорошо, исключения должны вызываться только в особых случаях.
Лучше проверяйте аргумент, если он [REDIRECTIOMODE]
- скипайте.
ParamStr в качестве [1] параметра выдает первый параметр а вот в качестве [0]…
- ParamStr(0) = [REDIRECTIOMODE] в режиме связи с оболочкой (по F9)
- ParamStr(0) = [RUNMODE] без связи с оболочкой (по shift+F9)
- ParamStr(0) = полный путь к файлу, при запуске из ОС
можно убедиться на примере:
begin
writeln('ParamCount: ', ParamCount);
write('Params: ');
for var i := 0 to ParamCount do write(ParamStr(i), ' ');
writeln;
end.