если в строке первый символ 'С',то удалить эту строчку

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
giv
Сообщения: 2
Зарегистрирован: 15 ноя 2005, 19:25

Здравствуйте.Помогите, пожалуйста. Надо сделать так:
если в строке первый символ 'С',то удалить эту строчку
Если сделать так, то выдается ошибка
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);
}
}
Заранее спасибо
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

С билдером не знаком, но код str.Delete(j,l); наталкивает на определенный подозрения.
Может стоит удалять строчку из Memo1 ?
В SAD - все в SAD.
BreakPointMAN
Сообщения: 38
Зарегистрирован: 21 июн 2004, 02:59
Откуда: Saratov
Контактная информация:

Во-первых, индексация в переменных типа AnsiString начинается не с 0, а с 1:

Код: Выделить всё

AnsiString str;
...
j=0;
if (str[j]=='C')    //   Ошибка! Такое обращение вызовет исключение...
   str.Delete(j,l); // В j, как минимум, должна лежать единица...
Во-вторых, вот это дело:

Код: Выделить всё

int i,j,l,n,; 
не скомпилируется вообще... Зачем нужна ',' после n?
В-третьих, что тебе, собственно, сделать-то нужно? Если сделать тебе нужно то, как у тебя написано:
giv писал(а): если в строке первый символ 'С',то удалить эту строчку
то ты делаешь что-то совсем другое... Для удаления строк из компонента типа TMemo используется метод Delete свойства Lines, т.е. писать нужно как-то так:

Код: Выделить всё

Memo1->Lines->Delete&#40]
Обрати внимание на комментарий...

А вообще, прежде чем программы писать, нелишним было бы литературку хорошую почитать [i](могу порекомендовать [b]"Программирование в C++ Builder 6" (c) Архангельский А.Я.[/b])[/i], а прежде, чем вопросы такие на форуме задавать, не помешало бы почитать [b]help[/b]...

Если что неправильно понял - извиняйте...
Если есть еще вопросы - спрашивайте... 
 :)
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Код: Выделить всё

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 меняется при удалении.
BreakPointMAN
Сообщения: 38
Зарегистрирован: 21 июн 2004, 02:59
Откуда: Saratov
Контактная информация:

Eugie, бррр!!!

Во-первых, писать надо не

Код: Выделить всё

if (Memo1->Lines[i][1]=='C')
а

Код: Выделить всё

if(Memo1->Lines->Strings[i][1]=='C')
Во-вторых, метод Delete вызывается не через точку:

Код: Выделить всё

Memo1->Lines.Delete(i);
а через стрелку:

Код: Выделить всё

Memo1->Lines->Delete(i);
В-третьих, самая грубая ошибка - не учитывается тот факт, что мы удаляем строки. Счетчик i инкрементится каждую итерацию цикла, но при удалении очередной строки мы должны уменьшать его значение на 1, чтобы не перескакивать через следующую строку - ведь она сместилась вверх...
Т.е. удаление должно происходить так:

Код: Выделить всё

Memo1->Lines->Delete(i--);
giv
Сообщения: 2
Зарегистрирован: 15 ноя 2005, 19:25

Большое спасибо за советы.
Теперь работает.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

BreakPointMAN, это был гибрид BСB с Delphi ;) По п.3 отдельное спасибо, недоглядел
Ответить