Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.24;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
1-75911
nikulin
2003-02-14 12:11
2003.02.24
Как получить изображение раб стола???


3-75767
sav00
2003-02-03 11:57
2003.02.24
Печать DBGrid


1-75980
V-Isa
2003-02-12 15:42
2003.02.24
Окно, кот. не может быть перекрыто...


14-76084
Adolf
2003-02-09 13:49
2003.02.24
ShellExecute


14-76122
Delph
2003-02-06 13:19
2003.02.24
Система обновления программ на клиентских местах.