Страница 1 из 1
если в строке первый символ 'С',то удалить эту строчку
Добавлено: 15 ноя 2005, 19:32
giv
Здравствуйте.Помогите, пожалуйста. Надо сделать так:
если в строке первый символ 'С',то удалить эту строчку
Если сделать так, то выдается ошибка
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);
}
}
Заранее спасибо
Добавлено: 16 ноя 2005, 15:46
Kolinus
С билдером не знаком, но код str.Delete(j,l); наталкивает на определенный подозрения.
Может стоит удалять строчку из Memo1 ?
Добавлено: 16 ноя 2005, 23:27
BreakPointMAN
Во-первых, индексация в переменных типа
AnsiString начинается не с
0, а с
1:
Код: Выделить всё
AnsiString str;
...
j=0;
if (str[j]=='C') // Ошибка! Такое обращение вызовет исключение...
str.Delete(j,l); // В j, как минимум, должна лежать единица...
Во-вторых, вот это дело:
не скомпилируется вообще... Зачем нужна
',' после
n?
В-третьих, что тебе, собственно, сделать-то нужно? Если сделать тебе нужно то, как у тебя написано:
giv писал(а):
если в строке первый символ 'С',то удалить эту строчку
то ты делаешь что-то совсем другое... Для удаления строк из компонента типа
TMemo используется метод
Delete свойства
Lines, т.е. писать нужно как-то так:
Код: Выделить всё
Memo1->Lines->Delete(]
Обрати внимание на комментарий...
А вообще, прежде чем программы писать, нелишним было бы литературку хорошую почитать [i](могу порекомендовать [b]"Программирование в C++ Builder 6" (c) Архангельский А.Я.[/b])[/i], а прежде, чем вопросы такие на форуме задавать, не помешало бы почитать [b]help[/b]...
Если что неправильно понял - извиняйте...
Если есть еще вопросы - спрашивайте...
:)
Добавлено: 17 ноя 2005, 16:52
Eugie
Код: Выделить всё
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);
}
}
Зам. В условии цикла должно стоять именно Memo1->Lines->Count, т.к. число строк в Memo1 меняется при удалении.
Добавлено: 17 ноя 2005, 22:45
BreakPointMAN
Eugie, бррр!!!
Во-первых, писать надо не
а
Во-вторых, метод
Delete вызывается не через точку:
а через стрелку:
В-третьих, самая грубая ошибка - не учитывается тот факт, что мы удаляем строки. Счетчик
i инкрементится каждую итерацию цикла, но при удалении очередной строки мы должны уменьшать его значение на
1, чтобы не перескакивать через следующую строку - ведь она сместилась вверх...
Т.е. удаление должно происходить так:
Добавлено: 17 ноя 2005, 23:06
giv
Большое спасибо за советы.
Теперь работает.
Добавлено: 18 ноя 2005, 17:06
Eugie
BreakPointMAN, это был гибрид BСB с Delphi

По п.3 отдельное спасибо, недоглядел