Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

разбор строка


Страницы:   1 2 3

Максим ©   (2008-02-20 09:31:00) 

я передаю параметры для работы свой программы через строку(например так: -a -b -c) все работает,но хотелось чтобы -abc  было равносильно -a -b -c.
Как такое сделать?


Максим   (2008-02-20 23:13:00) [21]

буду рад,но сам тоже сейчас помучаюсь, может выйдет что...


Palladin   (2008-02-20 22:20:00) [22]

хм... легко... если дождешься до завтра... когда пива во мне будет меньше чем меня в пиве...


Максим   (2008-02-20 21:11:00) [23]

хм...что-то криво я изъясняюсь... попробую по-нормальному!:)

Есть основная программа(main) и куча плагинов.
В main есть edit, в котором я пишу: 1)первое слово это название плагина,которому будут передаваться параметры и сами данные на обработку. 2) параметры 3) данные на обработку.
Получается что первое слово удаляем(название плагина) все остальное передаем плагину на обработку,тот в свою очередь должен понять что за параметры,и какие у них значения если они вообще предусматриваются. т.е. на пример параметр -a и -b идут как "просто" параметры, а параметр -c и -d должны быть со значениями,т.е. -a -b -c 5 -d 10, и если после параметра с или d  нету значение то result = 'error parametrs' and exit ;)


Максим   (2008-02-20 20:35:00) [24]

еще забыл сказать что программы которым я передаю парамтеры,не являются программами "***.exe", Это мои плагины которым я передаю параметры. не пинайте сильно если это кардинально меняет решение всей задачи :))


Максим   (2008-02-20 20:32:00) [25]

прошу прощения что не поучавствовал в обсуждении моего вопроса, только добрался до компутера :)
Большое спасибо всем за ответы! Григорьев Антон прав, по умолчанию параметры выключены, знак "-" означает что параметр включается, причем памаметр может быть просто "-a" а может быть со значением "-a 15", т.е. включаем параметр а со значением 15.
Ща буду разбираться что вы мне тут понаписали! =)


{RASkov}   (2008-02-20 12:00:00) [26]

> [16] {RASkov} ©   (20.02.08 11:31)

Хм.... код [16] содержит ошибку... При параметрах "prog -ab-c" покажет, что a и b выключены, а с - включен :(
Могут и еще быть ошибки... нужно тестить :)
А может Антон прав, и не нужно парится, тогда - [12]

Хотя... Ключи это - "/х" а параметры - "/х: -y" или "/х: y" - вроде как.... Впрочем это все условно по большей части, и зависит от программиста...


{RASkov}   (2008-02-20 11:31:00) [27]

"немного" переделал код [12]

type
 TParamState = (psNone, psEnable, psDisable);

procedure TForm1.GetParam;
var
ParamsPresent: array['A'..'Z'] of TParamState;
I, J: Integer;
S: string; C: Char;
begin
 FillChar(ParamsPresent, SizeOf(ParamsPresent), 0);
 for I := 1 to ParamCount do begin
  S := ParamStr(I);
  J:=1;
  while J<=Length(S) do begin
   if (S[J]='-') and (J<Length(S)) then begin
    INC(J);
    while UpCase(S[J]) in ['A'..'Z'] do begin
     ParamsPresent[UpCase(S[J])] := psDisable;
     INC(J); Continue;
    end;
   end;
   if UpCase(S[J]) in ['A'..'Z'] then ParamsPresent[UpCase(S[J])] := psEnable
    else ParamsPresent[UpCase(S[J])] := psNone;
   INC(J);
  end;
end;
Caption:=cmdLine;
for C:='A' to 'Z' do
 case ParamsPresent[C] of
  psNone: ListBox1.Items.Add(C + ' - >> не определен');
  psEnable: ListBox1.Items.Add(C + ' - Включен!!');
  psDisable: ListBox1.Items.Add(C+ ' - ВЫКЛЮЧЕН');
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 GetParam;
end;

Не тестировал, но вроде работает.... единственное - ключи могут повторятся и реально покажется последний из них
проверил с такими параметрами prog -acf g +j-k -n+xk
ключ k - первый раз сбрасывается, второй - устанавливается....


> [15] Григорьев Антон ©   (20.02.08 11:28)
> Не думаю. "-" принято использовать в командной строке как
> признак того, что данный параметр является ключом, включающим
> что-то, что по умолчанию выключено

Ну мало ли :)


Григорьев Антон   (2008-02-20 11:28:00) [28]


> {RASkov} ©   (20.02.08 11:01) [13]
> а если параметр не -abc а просто abc?) Я так понял, что
> "-" выключает, без него(-) типа "+" - включено....

Не думаю. "-" принято использовать в командной строке как признак того, что данный параметр является ключом, включающим что-то, что по умолчанию выключено. В DOS'е, вообще-то, было принято использовать для этого прямой слэш, а "-" - это из UNIX'ов, но постепенно "-" победил и в MS'овских системах.


> Johnmen ©   (20.02.08 11:02) [14]
> Ты действительно такой наивный?

Я специально использовал не слишком известные новичкам вещи, чтобы, если в человеке есть хоть искра интереса, ему стало бы хотя бы любопытно. Тогда разберётся. А если искры нет, то всё равно впрок не пойдёт, на чём-нибудь другом споткнётся.


Johnmen   (2008-02-20 11:02:00) [29]


> // Домашнее задание - разобраться, почему

Ты действительно такой наивный?


{RASkov}   (2008-02-20 11:01:00) [30]

> [12] Григорьев Антон ©   (20.02.08 10:50)
> if (Length(S) > 0) and (S[1]='-') then

а если параметр не -abc а просто abc?) Я так понял, что "-" выключает, без него(-) типа "+" - включено....

> Максим
> // Домашнее задание - разобраться, почему


Григорьев Антон   (2008-02-20 10:50:00) [31]

var
 ParamsPresent: array['A'..'Z'] of Boolean;
 I, J: Integer;
 S: string;
begin
 FillChar(ParamsPresent, SizeOf(ParamsPresent), 0);
 for I := 1 to ParamCount do
 begin
   S := ParamStr(I);
   if (Length(S) > 0) and (S[1]='-') then
   begin
     for J := 2 to Length(S) do
       if UpCase(S[J]) in ['A'..'Z'] then
         ParamsPresent[UpCase(S[J])] := True
   end
 end;
 // После выполнения этого кода если некоторая буква встретилась в параметрах,
 // то ParamsCount[Эта_буква_в_верхнем_регистре] = True, если не встретилась - False
 // Домашнее задание - разобраться, почему
end;


Ник   (2008-02-20 10:49:00) [32]

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

Автор просит именно то, что предложил allucard   (20.02.08 09:44) [1]


oldman   (2008-02-20 10:46:00) [33]


> -abc  было равносильно -a -b -c


А зачем?
Покажи мне прогу, где реализована подобная система передачи параметров...
Или считаешь юзеров даунами? Что, мол, они могут забыть, как передавать параметры?

"Либо дудочка, либо кувшинчик" ©


{RASkov}   (2008-02-20 10:43:00) [34]

> [8] palva ©   (20.02.08 10:39)
> что параметрыпередаются через строку, то есть параметр всегда один

Это как? :)

> И сабж он называет "разбор строки"

тогда ему нужно cmdline получается, и разбирать ее до посинения :)


palva   (2008-02-20 10:39:00) [35]

В сабже ясно сказано, что параметры передаются через строку, то есть параметр всегда один. Программа prog, видимо, запускается так:
prog "-a -b -c"
Строку эту автор получает s := Param[1];
И сабж он называет "разбор строки"


{RASkov}   (2008-02-20 09:50:00) [36]

> [1] allucard   (20.02.08 09:44)

садись - два (с)


{RASkov}   (2008-02-20 09:49:00) [37]

Ух... чет я медленно печатаю.... понаотвечали тут уже :)


Ega23   (2008-02-20 09:48:00) [38]


> allucard   (20.02.08 09:44) [1]


Ты сам проверил то, что тут насоветовал?


{RASkov}   (2008-02-20 09:48:00) [39]

> [0] Максим   (20.02.08 09:31)

Так:
> -a -b -c

это три параметра, а так:
> -abc  

один. Вот и вся разница.... анализируй один параметр, ну и типа for i:=1 to length(ParamStr(N)) do if ParamStr(N)[i].... then ... else ...., как обычно....


Ega23   (2008-02-20 09:47:00) [40]


> я передаю параметры для работы свой программы через строку(например
> так: -a -b -c) все работает,но хотелось чтобы -abc  было
> равносильно -a -b -c.


Так делать некорректно. Но если очень хочется, то ParamCount, ParamStr(N), Pos или StringReplace, ко всему этому F1 и подключенные мозги.
Пишется за 20 минут максимум.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо