Форум: "Основная";
Текущий архив: 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.069 c