Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-76136
123456
2003-02-07 10:04
2003.02.24
community.borland.com


1-75918
and_sp
2003-02-13 13:09
2003.02.24
Access Violation в MDI-приложении


3-75742
BlackTiger
2003-02-04 15:10
2003.02.24
DevExpress Grid4: Как правильно раскрашивать ячейки по условию?


3-75830
RUSTAM
2003-02-07 08:34
2003.02.24
Связывание таблиц PARADOX


14-76160
asafr
2003-02-06 12:52
2003.02.24
Прошу маленькую подсказку по VBA.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский