Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: BCB6. AnsiString::Delete что-то не работает как описано.  (Прочитано 13335 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« : 20-11-2009 08:54 » 

Хочу удалить подстроку из переменной типа AnsiString (это борландовский C++ аналог для паскалевских строк).

В доке описано так:
Цитата
Removes a specified number of characters from the string.

AnsiString& __fastcall Delete(int index, int count);

Description
Delete modifies the AnsiString to remove count characters from the string beginning with the character at index, where 1 is the index of the first character. It returns the resulting modified string (*this).
If index is larger than the length of the AnsiString or less than 1, no characters are deleted.
If count specifies more characters than remain starting at the index, Delete removes the rest of the string. If count is less than 0, no characters are deleted.

Делаю так:

Код:
Edit1->Text = "abc";
Edit1->Text.Delete(3, 1);

В итоге, в Edit1->Text по прежнему "abc".

Кто-либо сталкивался с этим?

У меня задача перебирать символы с конца строки, проверять по некому условию и удалять если проверка не пройдена.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 20-11-2009 09:04 » 

Ром, а индекс случайно не с нуля начинается? Я понимаю, что там в хелпе стоИт, но попробуй.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 20-11-2009 09:05 » 

Первая мысль: может, у них индекс zero-based? Улыбаюсь
Джон опередил Улыбаюсь
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 20-11-2009 09:06 » 

Ааааа, я кажется понял:

Код:
Edit1->Text = "abc";
Edit1->Text = Edit1->Text.Delete(3, 1);

Такая же беда как до-диезе. Те скорей всего ф-я не изменяет сам объект, а возвращает изменённую строку:

"It returns the resulting modified string (*this)."
« Последнее редактирование: 20-11-2009 09:09 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 20-11-2009 09:11 » 

Чёт хелп какой-то непонятный... "If count is less than 0, no characters are deleted." А если он РАВЕН 0? Сколько тогда будет удалено?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 20-11-2009 09:12 » 

Джон опередил Улыбаюсь

Да вроде упорно настаивают, что это не так:

"where 1 is the index of the first character" + "If index is larger than the length of the AnsiString or less than 1, no characters are deleted"

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 20-11-2009 12:19 » 

Индекс у них точно с 1 - так в остальных методах AnsiString практикуется.
Присваивать результат обратно не гуд, т.к. TEdit при этом генерит событие OnChange, в котором я и нахожусь Улыбаюсь Кстати, в последующих рекурсивных вызовах OnChange значение Text такое же - неизменное.

Цитата
It returns the resulting modified string (*this).
Мой английский слабоват, но даже со словарем я понимаю это однозначно: возвращает ссылку на себя.

И так: длина - 3, индекс - последовательно от 3 к 1 в цикле, count - 1. Не удалено ни одного символа.

Странно особенно то, что этот код я написал года два назад и тогда я его протестировал. BCB6 у меня тот же самый, что и два года назад.

Насчет кривизны документации: подтверждаю - очень кривая. (c) 2002...
« Последнее редактирование: 20-11-2009 12:21 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 20-11-2009 15:14 » 

Ром, по идее всё правильно. Смотри, если контрол виндовский, значит получать/ставить текст можно только с помощью SendMessage( WM_GETWINDOWTEXT/WM_SETWINDOWTEXT, ...

Поэтому непосредственного изменения текста в контроле сделать нельзя. А "паразитную" обратную связь затыкать флажком.

зы Попробуй просто ради интереса покажи в дебуггере результат удаления.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 20-11-2009 16:58 » 

TEdit в своей основе конечно виндовый контрол, но оболочка у него ООП и используются расширения Борланда - prperties - активные свойства. Edit1->Text возвращает мне ссылку на AnsiString, содержащую текст контрола.

Пока думаю. Странно все это. Опять лепить заплатки...
Может просто другой метод найдется? Мне нужно удалить все недопустимые символы в случае вставки текста посредством Ctrl-V.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 20-11-2009 21:10 » new

Дело оказалось не в AnsiString, а в "AnsiString TEdit::Text". Видимо это свойство возвращает не ссылку, а копию.
И пришлось добавить блокировку рекурсивного вызова в событии.

Код:
void __fastcall TfrmTextInput::edTextChange(TObject *Sender)
{
    TEdit *ed = dynamic_cast<TEdit*>(Sender);
    AnsiString tmp;

    if (!digitsOnly)
        return;

    if (locked_onchange)
        return;

    locked_onchange = true;
    tmp = ed->Text;

    for (int i = tmp.Length(); i; i--)
        if (tmp.c_str()[i - 1] < '0' || tmp.c_str()[i - 1] > '9')
            tmp.Delete(i, 1);

    ed->Text = tmp;
    locked_onchange = false;
}
« Последнее редактирование: 20-11-2009 21:13 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines