Страница 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, как минимум, должна лежать единица...
Во-вторых, вот это дело:

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

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]...

Если что неправильно понял - извиняйте...
Если есть еще вопросы - спрашивайте... 
 :)

Добавлено: 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, бррр!!!

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

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

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--);

Добавлено: 17 ноя 2005, 23:06
giv
Большое спасибо за советы.
Теперь работает.

Добавлено: 18 ноя 2005, 17:06
Eugie
BreakPointMAN, это был гибрид BСB с Delphi ;) По п.3 отдельное спасибо, недоглядел