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

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

Case of для строк


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

ford ©   (2010-03-31 17:24:00) 

Здравствуйте!
в программу передается параметр от которого зависит какая из процедур должна быть выполнена. Значений параметра около десятка.

я сделал следующим образом

if ParamStr(1)='create' then createnewfile(paramstr(2))
 else if ParamStr(1)='send' then sendfile(paramstr(2))
       else ....


подскажите, можно ли реализовать это как Case of
т.е. примерно так:


Case ParamStr(1) of
'create' : createnewfile(paramstr(2));
'send'   : sendfile(paramstr(2));
...
else
...
end;


понятно что Case не работает для строк
но все же :)


Германн   (2010-04-01 01:46:00) [21]


> Leonid Troyanovsky ©   (01.04.10 01:31) [24]
>
>
> > Германн ©   (01.04.10 01:07) [23]
>
> > > Т.е., члены вашей команды обмениваются оными строками
> > > и используют их в коде как уникальные идентификаторы?
>
>
> > И такое бывает. :)
> > Лично встречал.
>
> Даже если так, то никто не мешает им обмениваться, скажем,
>
> целочисленными, вполне пригодными к case.

Ты не в теме, Леонид.
У меня была, да и сейчас существует и продаётся (вот только вчера-позавчера обновил инсталляторы) ПО, в котором две программы обмениваются информацией по TCP/IP. Работают нормально без всяких проблем. Но возник как-то новый "руководитель работ", который захотел этот обмен "пристроить" к запросу некоего потенциального заказчика. А как проверять новые возможности? Смотреть на двоичные данные? Это же геморрой для него! Таки было выставлено требование, чтобы обмен шел в текстовом виде. Который можно прочитать в Блокноте :)


Leonid Troyanovsky   (2010-04-01 01:31:00) [22]


> Германн ©   (01.04.10 01:07) [23]

> > Т.е., члены вашей команды обмениваются оными строками
> > и используют их в коде как уникальные идентификаторы?

> И такое бывает. :)
> Лично встречал.

Даже если так, то никто не мешает им обмениваться, скажем,
целочисленными, вполне пригодными к case.

Могу даже предположить, например, как реализовать это
с помощью текстового файла.

--
Regards, LVT.


Германн   (2010-04-01 01:07:00) [23]


> Т.е., члены вашей команды обмениваются оными строками
> и используют их в коде как уникальные идентификаторы?
>

И такое бывает. :)
Лично встречал.


Leonid Troyanovsky   (2010-03-31 22:10:00) [24]


> _Юрий   (31.03.10 21:22) [19]

> Нет, извне строки не поступают.

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

Т.е., члены вашей команды обмениваются оными строками
и используют их в коде как уникальные идентификаторы?

--
Regards, LVT.


Leonid Troyanovsky   (2010-03-31 21:54:00) [25]


> sniknik ©   (31.03.10 21:29) [20]

> по моему это часть VCL... видел в генофонде. или очень похожее.

Возможно, что это напоминает Object Pascal Language Guide:

Variant open array parameters.
function MakeStr(const Args: array of const): string;

--
Regards, LVT.


sniknik   (2010-03-31 21:29:00) [26]

> А я б и за [6] тоже проголосовал.
по моему это часть VCL... видел в генофонде. или очень похожее.


_Юрий   (2010-03-31 21:22:00) [27]


> Игорь Шевченко ©   (31.03.10 20:35) [17]


> Leonid Troyanovsky ©   (31.03.10 20:50) [18]


Нет, извне строки не поступают. Речь идет именно о случае, когда массив объявляется тут же

case IndexStr(s, ['variant 1', 'variant 2', 'variant 3'] ) of
  0:   DoVariant1();
  1:   DoVariant2();
  2:   DoVariant3();
  else // not found
end;

Если массив приходит сюда параметром, и мы оказываемся вынуждены синхронизировать два места,  то тогда совершенно справедливо [8]


Leonid Troyanovsky   (2010-03-31 20:50:00) [28]


> _Юрий   (31.03.10 19:23) [16]

> Собственно, удобство .

Удобство кодирования неочевидно, особенно для сase.
Бо, заранее неизвестно сколько строк в будущем в оный поступит.
Т.к., строки, очевидно, поступают извне, то необходим механизм,
максимально упрощающий изменения кода при изменении списка управляющих слов. IMHO, case для оного механизма - последний выбор.

--
Regards, LVT.


Игорь Шевченко   (2010-03-31 20:35:00) [29]

_Юрий   (31.03.10 19:23) [16]

Ну не лень вам два места синхронизировать


_Юрий   (2010-03-31 19:23:00) [30]


> Leonid Troyanovsky ©   (31.03.10 19:16) [15]
>
>


Собственно, удобство кодирования.
Применимо, разумеется, только для случаев, когда элементов в массиве немного, и когда их индексы видны "невооруженным глазом".
Скорость не замеряли, в нашем случае она неважна - функция вызывается однократно


Leonid Troyanovsky   (2010-03-31 19:16:00) [31]


> Юрий   (31.03.10 19:13) [14]

> Мы используем почти в точности такой паттерн уже пару лет,
>  в хвост и в гриву.

А что за нужда к этому подтолкнула?

--
Regards, LVT.


_Юрий   (2010-03-31 19:13:00) [32]


> но за подобный код я бы драл розгами на конюшне


Мы используем почти в точности такой паттерн уже пару лет, в хвост и в гриву.
(у нас еще передается параметром признак CaseSencitive).
Сказать, сколько было за это время с ним проблем?

Ровно 0 случаев.


Leonid Troyanovsky   (2010-03-31 19:05:00) [33]


> Демо ©   (31.03.10 19:03) [12]

> Так - мельком пробежался.

Т.е., ты это который мимо проходил?

Рекомендовал, значит отдувайся.

--
Regards, LVT.


Демо   (2010-03-31 19:03:00) [34]

Да не мой это код.
Так - мельком пробежался.

Пусть автор сам разбирается с тем, что там неправильно.

Главное - принцип понять.


Leonid Troyanovsky   (2010-03-31 19:00:00) [35]


> Игорь Шевченко ©   (31.03.10 17:37) [3]

Это секретная тема.

--
Regards, LVT.


Leonid Troyanovsky   (2010-03-31 18:55:00) [36]


> Игорь Шевченко ©   (31.03.10 18:53) [8]

А я б и за [6] тоже проголосовал.

--
Regards, LVT.


Leonid Troyanovsky   (2010-03-31 18:53:00) [37]


> Демо ©   (31.03.10 17:39) [5]

> то скорость по сравнению с многоступенчатыми if-then-else
> будет идентична и даже немного выше.

Не будет.
Может сравниваться лишь с TStringList подходящего размера,
но, не уверен про Sorted,

--
Regards, LVT.


Игорь Шевченко   (2010-03-31 18:53:00) [38]

Демо ©   (31.03.10 17:39) [5]

я понимаю, каждому хочется показать, какие возможности Delphi он выучил, но за подобный код я бы драл розгами на конюшне, так как неочевиден он. Высчитывать нужную позицию...


Leonid Troyanovsky   (2010-03-31 18:46:00) [39]


> Демо ©   (31.03.10 17:39) [5]

> тоже не всегда выход. Задачу можно решить с помощью безымянной
> константы-массива.

By Vladimir Titov:

http://rsdn.ru/forum/delphi/476748.1.aspx

--
Regards, LVT.


evvcom   (2010-03-31 17:55:00) [40]


> пока не удалось понять, как перейти от TVarData к Variant

   with TVarData(VariantValue) do
     case VType of
       varEmpty,
       varNull:     Result := 0;
       varSmallInt: Result := VSmallInt;
       varInteger:  Result := VInteger;
       varSingle:   Result := Round(VSingle);
       varDouble:   Result := Round(VDouble);
       varBoolean:  Result := Integer(VBoolean);
       varShortInt: Result := VShortInt;
       varByte:     Result := VByte;
       varWord:     Result := VWord;
       varLongWord: Result := VLongWord;
       varInt64:    Result := VInt64;
       varString:   Result := StrToInt(PChar(VString));
       else VarCastError;
     end;

это так... кусок рабочего кода, смысл думаю понятен


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

Наверх

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