Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2013, 10:42   #1
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию Аналог Case для срок в Delphi 7

Есть ли в Delphi 7 Аналог Case для строк или какойнибудь отдельный модуль чтобы можно было работатьс case также как в VB Net

Хотел было написать код через Case используя не числовую а строковую переменную но не тут то было

После написания кода в 200 строк он мне выдал ошибку говорящию что case не работает со строками. можно использовать иф но код будет раз в 10 тогда больше чем это сделать через Case

Скажите самый эфективный способ сделать многомерное сравнение без иф аналогом case если он есть.
Alexandr17-10 вне форума Ответить с цитированием
Старый 01.09.2013, 11:13   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Нет такого способа. Дельфи строки нельзя проверить по сейсу. Существует дельфи фор дотнет где это можно (емнип), но это будет тот же дотнет.

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

Если у Вас строго известен набор возможных вариантов, то можно использовать енумы - специальный тип с именованными значениями, например:
Код:
TYearSeason = (ysWinter, ysSpring, ysSummer, ysAutumn);
Ими можно пользоваться для кейсов и у них понятные имена (в чём то напоминает работу с константами).
Есть и специальное средство GetEnumName + GetEnumValue + TypeInfo (модуль TypInfo), которое позволяет конвертировать енум в строку и обратно, им можно реализовать Вашу задачу.
Однако, если же строка произвольная (что, конечно, малореально, если Вы таким образом поставили вопрос) - то точно ничего не поможет, кроме пачки иф.
phomm вне форума Ответить с цитированием
Старый 01.09.2013, 12:01   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
код будет раз в 10 тогда больше чем это сделать через Case
Интересно посмотреть на этот код, который якобы в IF увеличится многократно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.09.2013, 12:21   #4
Vad33
Участник клуба
 
Аватар для Vad33
 
Регистрация: 24.07.2009
Сообщений: 638
По умолчанию

Цитата:
Сообщение от Alexandr17-10 Посмотреть сообщение
Есть ли в Delphi 7 Аналог Case для строк или какойнибудь отдельный модуль чтобы можно было работатьс case также как в VB Net

Хотел было написать код через Case используя не числовую а строковую переменную но не тут то было

После написания кода в 200 строк он мне выдал ошибку говорящию что case не работает со строками. можно использовать иф но код будет раз в 10 тогда больше чем это сделать через Case

Скажите самый эфективный способ сделать многомерное сравнение без иф аналогом case если он есть.
Можно использовать хэш функции строки.

Но тут два момента:
- Case требует константы в перечислении.
Поэтому придется писать значения хеш функции.

- Хеши строк теоретически могут совпадать, но практически не встречалось.

Да, и еще вариант - индексировать строки:
Код:
uses strutils;

procedure TForm1.Button1Click(Sender: TObject);
begin
case AnsiIndexText( Edit1.Text , ['Привет', 'Пока']) of
      0: ShowMessage('И тебе привет!');
      1: ShowMessage('Пока-пока!');
      else
         ShowMessage('ХЗ');
    end;
end;
** Удача терпелива. **
Vad3333@inbox.ru

Последний раз редактировалось Stilet; 01.09.2013 в 14:29.
Vad33 вне форума Ответить с цитированием
Старый 01.09.2013, 18:26   #5
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Интересно посмотреть на этот код, который якобы в IF увеличится многократно.
Наверно так:
Код:
case AnsiLowerCase(str) of
'ololo':Do_Ololo;
'lolol':Do_Lolol;
'stilet':Do_Stilet;
'1':t1;
'2':t2;
'3':t3;
'4':t4;
'5':t5;
'6':t6;
'7':t7;
'8':t8;
'9':t9;
'0':t0;
else Do_Error;

if AnsiLowerCase(str) = 'ololo' then Do_Ololo
 else Do_Erorr;
if AnsiLowerCase(str) = 'lolol' then Do_Lolol
 else Do_Erorr;
if AnsiLowerCase(str) = 'stilet' then Do_Stilet
 else Do_Erorr;
if AnsiLowerCase(str) = '1' then t1
 else Do_Erorr; 
if AnsiLowerCase(str) = '2' then t2
 else Do_Erorr; 
if AnsiLowerCase(str) = '3' then t3
 else Do_Erorr; 
if AnsiLowerCase(str) = '4' then t4
 else Do_Erorr; 
if AnsiLowerCase(str) = '5' then t5
 else Do_Erorr;  
if AnsiLowerCase(str) = '6' then t6
 else Do_Erorr;  
if AnsiLowerCase(str) = '7' then t7
 else Do_Erorr;  
if AnsiLowerCase(str) = '8' then t8
 else Do_Erorr;  
if AnsiLowerCase(str) = '9' then t9
 else Do_Erorr;  
if AnsiLowerCase(str) = '0' then t0
 else Do_Erorr;
Можно было и в 10 раз,но лень.
Kix.IV вне форума Ответить с цитированием
Старый 01.09.2013, 19:01   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Наверно так:
Ну не знаю... Не вижу я тут особого увеличения... Можно даже украсить:
Код:
str:=AnsiLowerCase(str);
if (str) = 'ololo' then Do_Ololo else 
if (str) = 'lolol' then Do_Lolol else 
if (str) = 'stilet' then Do_Stilet else
if (str) = '1' then t1 else
if (str) = '2' then t2 else
if (str) = '3' then t3 else  
if (str) = '4' then t4 else 
if (str) = '5' then t5 else 
if (str) = '6' then t6 else 
if (str) = '7' then t7 else 
if (str) = '8' then t8 else 
if (str) = '9' then t9 else 
if (str) = '0' then t0 else 
 Do_Erorr;
Не так уж и много места. а если сделать массивом процедур вообще две три строки получится (не учитывая описание самого массива.)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
3 задания на Delphi, срок -вечер 1 июня (до 22 по Москве) Dimitrius_92 Фриланс 11 31.05.2010 20:48
аналог функции case redfield Microsoft Office Excel 3 05.05.2010 12:25
Не могу сделать на Delphi аналог phpMyAdmin для MySQL 4 Daniel_90 БД в Delphi 3 05.03.2009 09:57
Контрольная по Delphi. Срок 18 часов, оплата WM. PUH Фриланс 2 08.12.2008 17:46
Аналог паскалевского case MusicMan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 21.04.2008 22:10