Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Case для строк [D7, WinXP]


KyRo ©   (2006-02-21 12:41:00) 

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


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


> KyRo   (21.02.06 14:23) [18]


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


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

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


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


> Я не пойму


Я сожалею.


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


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

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

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


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

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


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


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


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


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


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


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


> 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;


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


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

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:27:00) [8]


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

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


begin...end   (2006-02-21 13:21:00) [9]

> API   (21.02.06 13:16) [9]

AnsiIndexStr


RO   (2006-02-21 13:21:00) [10]


> KyRo   (21.02.06 13:04) [6]


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


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

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

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


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

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


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

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


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

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

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:04:00) [14]

Чисто кейс не работает со строками -это я знаю
но вот вам реальный пример реализации он чем то похож на предложеный вариант 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:


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


> 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:


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

конструкция типа
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:
Итд ..

:)


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


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


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


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

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


Ega23   (2006-02-21 12:43:00) [19]


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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо