Форум: "Основная";
Текущий архив: 2003.02.24;
Скачать: [xml.tar.bz2];
Внизcase of Найти похожие ветки
← →
SergeN (2003-02-14 12:48) [0]Пожалуйста, подскажите!
Как использовать case of со строковыми типами?
Например:
case StringGrid1.Cells[c,r] of
"тра-ля-ля": "что-то превращяется во что-то";
......
end;
← →
Delirium^.Tremens (2003-02-14 12:50) [1]Никак :-)
← →
SergeN (2003-02-14 12:52) [2]Так что же мне if-ы втыкать на каждый случай?
← →
SergeN (2003-02-14 12:55) [3]Может что другое есть для такого случая?
Только, пожалуйста, не советуйте мне тыкать пальчиком на F1. Она у меня и так уже в буквальном смысле скотчем залеплена.
← →
Романов Р.В. (2003-02-14 12:57) [4]Нет ничего другого
← →
SergeN (2003-02-14 13:02) [5]КАК!??????
А в "васике" я писал что-то подобное, но с Selectcase.
← →
Anatoly Podgoretsky (2003-02-14 13:03) [6]case of работает только с ординальными типами, а чем тебе if не нравится case of это особая форма if else if
← →
SergeN (2003-02-14 13:06) [7]У меня 32 варианта для анализа. Как мне после этого стремиться к оптимизации кода? :))
← →
MBo (2003-02-14 13:10) [8]Варианты записать в сортированный StringList, а Case делать по IndexOf
← →
Palladin (2003-02-14 13:10) [9]занеси все варианты в TStringList
и делай case of TStringList.IndexOf
← →
Sheriff (2003-02-14 13:11) [10]может быть выход в другой организации данных?
← →
Palladin (2003-02-14 13:14) [11]да сортированый StringList, только не IndexOf, а Find
← →
Anatoly Podgoretsky (2003-02-14 13:15) [12]SergeN (14.02.03 13:06)
Код будет оптимизирован, также как и для case of
← →
SergeN (2003-02-14 13:15) [13]2 MBo & Palladin
Пожалуй Вы правы, О ВСЕМОГУЩИЕ БОГИ DELPHI!
Спасибо, низкий поклон.
← →
han_malign (2003-02-14 13:20) [14]Case работает точно так же как серия if then else if then ..., причем в руководстве специально указывается, что, если в case, перебираемые значения не идут по возрастающей, то он не оптимизируется и работает прямым перебором (во всяком случае, в D1 было). Единственное, что можно посоветовать - массив эталонов, и дихотомия.
← →
Anatoly Podgoretsky (2003-02-14 13:26) [15]Я хочу отвговорить от использования case of TStringList.IndexOf, по следущим причинам
1. эффективность, низкая
2. потребрость в ресурсах, повышенная
3. возможность ошибки, высокая так как номера в case of не связаны напрямую с содержимым и при изменении вероятновть ошибки высокая.
4. наглядность кода, отсюда и пункт 3
Два последних пункта должны перевешивать остальное.
← →
SergeN (2003-02-14 13:37) [16]2 Anatoly Podgoretsky
В, принципе, я только что в этом убедился.
Перехожу на Ваш совет, благо время позволяет.
О ВЕЛИКИЕ БОГИ DELPHI! :))
← →
SergeN (2003-02-14 13:43) [17]Да, забыл сказать СПАСИБО!
Всё, я ушёл...
← →
vuk (2003-02-14 15:08) [18]Можно так попробовать.
uses
StrUtils;
case AnsiIndexText( "s", ["aaa", "bbb", "ccc"]) of
0 : ...;//"aaa"
1 : ...;//"bbb"
2 : ...;//"ccc"
end;
← →
vuk (2003-02-14 15:10) [19]Правда, это касается D6. Но если что, то вот реализация:
function AnsiIndexText(const AText: string;
const AValues: array of string): Integer;
var
I: Integer;
begin
Result := -1;
for I := Low(AValues) to High(AValues) do
if AnsiSameText(AText, AValues[I]) then
begin
Result := I;
Break;
end;
end;
← →
MBo (2003-02-14 15:18) [20]до кучи ;)
{
It works fine and it"s not case sensitive:
Try to give "Mother" or "mOTHER" in the Input-String...
For exemple, you may use this to programm your own macro command system.
You can also parse a well formed text file (XML...)
Or to interpret a Database Field name as a selector, or whatelse you want.
}
type
TNumericChoiceParent = (ncp_Mother, ncp_Father, ncp_Child);
procedure TForm1.btChooseClick(Sender: TObject);
var
S: string;
begin
S := InputEdit.Text;
case TNumericChoiceParent(GetEnumValue(TypeInfo(TNumericChoiceParent), "ncp_" + S)) of
ncp_Mother: ShowMessage("Hello Mom :o)");
ncp_Father: ShowMessage("Hi, Dad -]");
ncp_Child: ShowMessage("Shut up and eat your soup !-(");
else
ShowMessage("Who do you think that you are?");
end;
end;
← →
vuk (2003-02-14 16:01) [21]Ну а если уж совсем до кучи, то можно и так:
function StrCalcHash( const s : string ) : integer;
begin
Result := CalcHash(pointer(ANSIUpperCase(s)), length(s));
end;
Исходник CalcHash здесь: http://delphibase.endimus.com/?action=viewfunc&topic=mathcalc&id=10092
Потом до вычисляются хеш-коды для всех строк, которые нужно рассматривать, и расписывается case по результатам вычисления:
case StrCalcHash(s) of
1C7: ...;//"aaa"
1CE: ...;//"bbb"
1C9: ...;//"ccc"
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.02.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c