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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2008, 11:51   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию AnsiMatchStr

Привет всем!
В функцию AnsiMatchStr надо передовать фиксированный массив строк. А как передать динамический массив? Вот например строк в memo?
Код:
var
a: array of string;
c: shortInt;
begin
   setLength(a, memo1.Lines.Count - 1);
   for c := 0 to memo1.Lines.Count - 1 do
      a[c] := memo1.Lines.strings[c];


   if AnsiIndexStr(edit1.Text, a) = -1 then
      edit1.Color := rgb(255, 128, 128)
   else
      edit1.Color := clWindow;
end;
Вот так выдаёт ошибку.
Помогите plz!
Altera вне форума Ответить с цитированием
Старый 29.12.2008, 14:15   #2
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Странно, спрашиваешь о AnsiMatchStr, а в коде AnsiIndexSt. Ну да не суть важно. В общем-то здесь ошибка только в том, что неверно устанавливаешь длину массива. Она будет все-таки Memo1.Lines.Count, а у тебя на 1 меньше

Последний раз редактировалось Баламут; 29.12.2008 в 14:20.
Баламут вне форума Ответить с цитированием
Старый 29.12.2008, 15:12   #3
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Она будет все-таки Memo1.Lines.Count, а у тебя на 1 меньше
Ой да, а я почему-то подумал, что.....
----
Дело в том, копировать так весь текст из memo в массив дело не из быстрых, особенно если строк много. И это если AnsiMatchStr максимально оптимизирована. А нельзя код по легче?
Вот к примеру что-то типа этого:
Код:
if AnsiIndexStr(edit1.Text, memo1.Lines.strings) = -1 then
      edit1.Color := rgb(255, 128, 128)
   else
      edit1.Color := clWindow;
Компилятор правда не доволен и не хочит компилеть, мыл
[Pascal Error] EXE_FORM.pas(49): E2029 '[' expected but ')' found
Altera вне форума Ответить с цитированием
Старый 29.12.2008, 15:25   #4
KORN
Банхаммер
Участник клуба
 
Аватар для KORN
 
Регистрация: 17.02.2007
Сообщений: 1,754
По умолчанию

if AnsiIndexStr(edit1.Text, memo1.Lines.strings[указываешь строку]) = -1 then
Перед тем как спросить ищи на форуме и в GOOGLE
KORN вне форума Ответить с цитированием
Старый 29.12.2008, 16:46   #5
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от KORN Посмотреть сообщение
Код:
if AnsiIndexStr(edit1.Text, memo1.Lines.strings[указываешь строку]) = -1 then
Во-перых: этот вариант не работает:
[Pascal Error] EXE_FORM.pas(50): E2036 Variable required
Во-вторых: это был всего лишь пример. Мне нужен весь текст. Если я укажу номер строчки, то будет только строчка. Тогда так надо:
Код:
if AnsiIndexStr(edit1.Text, [memo1.Lines.strings[указываешь строку]]) = -1 then
Altera вне форума Ответить с цитированием
Старый 30.12.2008, 06:25   #6
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Кажется, это вообще ерунда в таком случае...
А разве нет?
Вот описание как выглядит функция ansiIndexStr в strUtils:
Код:
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;
Надо было мне сразу это посмотреть.
Просто идём циклом по строчкам в memo и проблема долой!
Altera вне форума Ответить с цитированием
Ответ


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