![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;