![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Case of для строк
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;
это так... кусок рабочего кода, смысл думаю понятен