Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

Case для строк   Найти похожие ветки 

 
KyRo   (2006-02-21 12:41) [0]

Подскажите как реализовать Case для строк ?


 
Ega23 ©   (2006-02-21 12:43) [1]


if aStr="gsdg" then
begin

end
else
if aStr="vlkbnk" then
begin

end
else
if aStr="okdfgbok" then
begin

end
else
.........
if aStr="345tnkcv" then
begin

end
else
begin

end;


 
KyRo   (2006-02-21 12:46) [2]

:) Ну это понятно но мне нужна
конструкция типа
Case text of
1:
2:
3:
Итд ..
У меня очень много параметров и мне их надо добовлять или далять
с ифами я получу не малый кусок работы !!!
Тем более я знаю что это возможно


 
RO   (2006-02-21 12:54) [3]


> Тем более я знаю что это возможно


Нет, это не возможно. CASE-оператор не работает с типами данных, не совместимыми с cardinal,  а строковые данные - это не cardinal-совместимые данные.
А если знаешь что возможно - сделай ! Кто ж мешает ...


 
API   (2006-02-21 12:57) [4]

конструкция типа
Case text of
1:
2:
3:
Итд ..


Ну, это совсе просто... пишете функцию:

function TextIndex(aText: string): integer;
begin
 if (aText = "aaa") then Result := 1
 else if (aText = "bbb") then Result := 2
 else if (aText = "ccc") then Result := 3
end;

и используете:

Case TextIndex(text) of
1:
2:
3:
Итд ..

:)


 
Vlad ©   (2006-02-21 13:00) [5]


> KyRo   (21.02.06 12:46) [2]
> Тем более я знаю что это возможно


"Знать" и "верить" - разные понятия.
Если ты немного читал справку по case, то увидел бы...

where selectorExpression is any expression of an ordinal type (string types are invalid) and each caseList is one of the following:


 
KyRo   (2006-02-21 13:04) [6]

Чисто кейс не работает со строками -это я знаю
но вот вам реальный пример реализации он чем то похож на предложеный вариант API

const
 vlist = "первый, второй, третий";

var
 Values: TStringList;

procedure SetValues(VL : TStringList; S: String);
var
 I : Integer;
begin
 VL.CommaText := S;
 for I := 0 to CL.Count-1 do
   VL.Objects[I] := Pointer(I);
 VL.Sorted := True;
end;

function GetValueIndex(VL : TStringList; Match: String): Integer;
begin
 Result := VL.IndexOf(Match);
 if Result >= 0 then
   Result := Integer(VL.Objects[Result]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 case GetValueIndex(Values, Edit1.Text) of
   -1: {не найден} ;
    0: Caption := "0";
    1: Caption := "1";
    2: Caption := "2";
 end;
end;

initialization
 VL := TStringList.Create;
 SetValues(VL, vlist);

finalization
 VL.Free;

Но мне он немного не подходит . Хотя попробую
все же этот вариант

> function TextIndex(aText: string): integer;
> begin
>  if (aText = "aaa") then Result := 1
>  else if (aText = "bbb") then Result := 2
>  else if (aText = "ccc") then Result := 3
> end;
>
> и используете:
>
> Case TextIndex(text) of
> 1:
> 2:
> 3:


 
API   (2006-02-21 13:13) [7]

Но мне он немного не подходит . Хотя попробую
все же этот вариант


Вообще-то, это шутка была... кхм...

Возможно, вам подойдет вот так:

const
 Values: array[0..2] of string = ("one", "two", "three");

function IndexOfValue(AValue: string): integer;
var
 i: integer;
begin
 for i := Low(Values) to High(Values) do
   if (Values[i] = AValue) then
   begin
     Result := i;
     Exit;
   end;
 Result := -1;  
end;

использование:

case IndexOfValue(Edit1.Text) of
 -1: Caption := "не найдено ;
  0: Caption := "один";
  1: Caption := "два";
  2: Caption := "три";
end;


 
KyRo   (2006-02-21 13:16) [8]

Можно и так попробвать так наверное удобней будет


 
API   (2006-02-21 13:16) [9]

Прошу прощения... торможу под утро...

function IndexOfValue(AValue: string): integer;
begin
for Result := Low(Values) to High(Values) do
  if (Values[Result] = AValue) then
    Exit;
Result := -1;  
end;


 
begin...end ©   (2006-02-21 13:21) [10]

> API   (21.02.06 13:16) [9]

AnsiIndexStr


 
RO   (2006-02-21 13:21) [11]


> KyRo   (21.02.06 13:04) [6]


Это - не более чем пример штатного применения CASE, к оригинальному вопросу ("Case для строк") не имеющий ни малейшего отношения.


 
KyRo   (2006-02-21 13:27) [12]


> Это - не более чем пример штатного применения CASE, к оригинальному
> вопросу ("Case для строк") не имеющий ни малейшего отношения.
>

Какая разница я прикрасно знаю что нельзя реализовать прямо кейс для строк !!! Мне нужно это пускай не на прямую , а через индексы потому что ифами я задолбаюсь проверять значение строки (тем более что у меня их может быть и 30 и 50)


 
API   (2006-02-21 13:30) [13]

begin...end ©

function AnsiIndexStr(const AText: string;
 const AValues: array of string): Integer;
var
 I: Integer;
begin
 Result := -1;
 for I := Low(AValues) to High(AValues) do
   if AnsiSameStr(AText, AValues[I]) then
   begin
     Result := I;
     Break;
   end;
end;

Нет, не торможу... велосипед изобретаю...
Пошел я спать...


 
KyRo   (2006-02-21 13:36) [14]


> API


Спасибо уже переделал второй вариант буду щас пробовать

> AnsiSameStr(AText, AValues[I])

Я пользуюсь другой функцией сравнения написаной на асм работает быстрее и ограничений на символы не каких нет
{******** Функция поиска вхождения подстроки SubStr в строке S
         в случае успеха возвращает значение больше еденицы}
function TailPos(const S, SubStr: AnsiString; fromPos: integer): integer;
asm
       PUSH EDI
       PUSH ESI
       PUSH EBX
       PUSH EAX
       OR EAX,EAX
       JE @@2
       OR EDX,EDX
       JE @@2
       DEC ECX
       JS @@2

       MOV EBX,[EAX-4]
       SUB EBX,ECX
       JLE @@2
       SUB EBX,[EDX-4]
       JL @@2
       INC EBX

       ADD EAX,ECX
       MOV ECX,EBX
       MOV EBX,[EDX-4]
       DEC EBX
       MOV EDI,EAX
@@1: MOV ESI,EDX
       LODSB
       REPNE SCASB
       JNE @@2
       MOV EAX,ECX
       PUSH EDI
       MOV ECX,EBX
       REPE CMPSB
       POP EDI
       MOV ECX,EAX
       JNE @@1
       LEA EAX,[EDI-1]
       POP EDX
       SUB EAX,EDX
       INC EAX
       JMP @@3
@@2: POP EAX
       XOR EAX,EAX
@@3: POP EBX
       POP ESI
       POP EDI
end;


Писал не я . Но работает пристойно (Быстро и пока без глюков)


 
RO   (2006-02-21 13:43) [15]


> Мне нужно это пускай не на прямую , а через индексы


Тогда и вопрос д.б. прозвучать как "Case для индексов".


> [14]
> Я пользуюсь другой функцией сравнения


Ну и где здесь оператор CASE ? Ты же именно о нем речь завел в изначальном вопросе ..


 
KyRo   (2006-02-21 14:08) [16]

Удалено модератором


 
RO   (2006-02-21 14:17) [17]


> Я не пойму


Я сожалею.


> следи за своими вопросами


Слежу.
Ты же  в свою очередь учись следить за своей мыслью.

Ты начал за здравие (Case для строк), а закончил за упокой (asm-код, НЕ имеющий НИ малейшего отношения к работе оператора CASE).

К тому же алгоритмы хэширования и контр.суммирования строк.данных, которые с успехом могли бы быть использованы для совместной работы с CASE, ты отклонил по причине полного неведения.


 
KyRo   (2006-02-21 14:23) [18]

Удалено модератором


 
RO   (2006-02-21 14:40) [19]


> KyRo   (21.02.06 14:23) [18]


Хамить, парниша, будешь "своим пацанам в подворотне".



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.045 c
8-1129748863
yura32
2005-10-19 23:07
2006.03.26
Kak zgladit BitMap


2-1141670649
KILROY
2006-03-06 21:44
2006.03.26
ADOTable...


2-1141721172
dera
2006-03-07 11:46
2006.03.26
Никак не могу разобраться в чем ошибка


2-1142049830
mfender
2006-03-11 07:03
2006.03.26
Редактор TStrings в Design-Time


4-1136275989
dust
2006-01-03 11:13
2006.03.26
Получить параметры железа





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский