если в строке первый символ 'С',то удалить эту строчку
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Здравствуйте.Помогите, пожалуйста. Надо сделать так:
если в строке первый символ 'С',то удалить эту строчку
Если сделать так, то выдается ошибка
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
AnsiString str;
int i,j,l,n,;
n=Memo1->Lines->Count;
for(i=0; i<n; i++)
{
l=Memo1->Lines->Strings.Length();
str=Memo1->Lines->Strings;
j=0;
if (str[j]=='C') { str.Delete(j,l); }
Memo2->Lines->Add(str);
}
}
Заранее спасибо
если в строке первый символ 'С',то удалить эту строчку
Если сделать так, то выдается ошибка
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
AnsiString str;
int i,j,l,n,;
n=Memo1->Lines->Count;
for(i=0; i<n; i++)
{
l=Memo1->Lines->Strings.Length();
str=Memo1->Lines->Strings;
j=0;
if (str[j]=='C') { str.Delete(j,l); }
Memo2->Lines->Add(str);
}
}
Заранее спасибо
С билдером не знаком, но код str.Delete(j,l); наталкивает на определенный подозрения.
Может стоит удалять строчку из Memo1 ?
Может стоит удалять строчку из Memo1 ?
В SAD - все в SAD.
-
- Сообщения: 38
- Зарегистрирован: 21 июн 2004, 02:59
- Откуда: Saratov
- Контактная информация:
Во-первых, индексация в переменных типа AnsiString начинается не с 0, а с 1:
Во-вторых, вот это дело:
не скомпилируется вообще... Зачем нужна ',' после n?
В-третьих, что тебе, собственно, сделать-то нужно? Если сделать тебе нужно то, как у тебя написано:
Код: Выделить всё
AnsiString str;
...
j=0;
if (str[j]=='C') // Ошибка! Такое обращение вызовет исключение...
str.Delete(j,l); // В j, как минимум, должна лежать единица...
Код: Выделить всё
int i,j,l,n,;
В-третьих, что тебе, собственно, сделать-то нужно? Если сделать тебе нужно то, как у тебя написано:
то ты делаешь что-то совсем другое... Для удаления строк из компонента типа TMemo используется метод Delete свойства Lines, т.е. писать нужно как-то так:giv писал(а): если в строке первый символ 'С',то удалить эту строчку
Код: Выделить всё
Memo1->Lines->Delete(]
Обрати внимание на комментарий...
А вообще, прежде чем программы писать, нелишним было бы литературку хорошую почитать [i](могу порекомендовать [b]"Программирование в C++ Builder 6" (c) Архангельский А.Я.[/b])[/i], а прежде, чем вопросы такие на форуме задавать, не помешало бы почитать [b]help[/b]...
Если что неправильно понял - извиняйте...
Если есть еще вопросы - спрашивайте...
:)
Код: Выделить всё
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
for(int i=0; i<Memo1->Lines->Count; i++)
{
if (Memo1->Lines[i][1]=='C')
Memo1->Lines.Delete(i);
}
}
-
- Сообщения: 38
- Зарегистрирован: 21 июн 2004, 02:59
- Откуда: Saratov
- Контактная информация:
Eugie, бррр!!!
Во-первых, писать надо не
а
Во-вторых, метод Delete вызывается не через точку:
а через стрелку:
В-третьих, самая грубая ошибка - не учитывается тот факт, что мы удаляем строки. Счетчик i инкрементится каждую итерацию цикла, но при удалении очередной строки мы должны уменьшать его значение на 1, чтобы не перескакивать через следующую строку - ведь она сместилась вверх...
Т.е. удаление должно происходить так:
Во-первых, писать надо не
Код: Выделить всё
if (Memo1->Lines[i][1]=='C')
Код: Выделить всё
if(Memo1->Lines->Strings[i][1]=='C')
Код: Выделить всё
Memo1->Lines.Delete(i);
Код: Выделить всё
Memo1->Lines->Delete(i);
Т.е. удаление должно происходить так:
Код: Выделить всё
Memo1->Lines->Delete(i--);
Большое спасибо за советы.
Теперь работает.
Теперь работает.
BreakPointMAN, это был гибрид BСB с Delphi
По п.3 отдельное спасибо, недоглядел
