C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
StringGrid, Удаление строки со сдвигом вверх
Riva
Отправлено: 20.02.2007, 16:06


Ученик-кочегар

Группа: Участник
Сообщений: 14



Помогите разобратся с StringGrid, как удалить строку со сдвигом вверх?
Riva
Отправлено: 21.02.2007, 16:46


Ученик-кочегар

Группа: Участник
Сообщений: 14



Частично разобрался.

Вот что получилось. Удаление со сдвигом работает просто супер, а вот запись результата удаления в файл не выходит. Как же всё это сохранить?

void __fastcall TForm5::Button2Click(TObject *Sender)
{
int ind=MessageBox(0,"Удалить раздел?","Вопрос",MB_YESNO);
if(ind==IDYES)
{
StringGrid1->Cells[c][r]="";

int curRec = StringGrid1->Selection.Top;
if (curRec != StringGrid1->RowCount-1)
{
for (int i=curRec; iRowCount-1; i++)
StringGrid1->Rows[i] = StringGrid1->Rows[i+1];

}
StringGrid1->RowCount--;
TIniFile *ini;
ini = new TIniFile(
ChangeFileExt( Application->ExeName, ".ini" ) );
ini->WriteString ( "Topics", r, StringGrid1->Cells[c][r] );
delete ini;

Edit1->Clear();
}
else if(ind==IDNO) return;
}
Termi_uc
Отправлено: 21.02.2007, 18:14


Дежурный стрелочник

Группа: Участник
Сообщений: 61



QUOTE (Riva @ 21.02.2007, 16:46)
Вот что получилось. Удаление со сдвигом работает просто супер, а вот запись результата удаления в файл не выходит. Как же всё это сохранить?

Что ты имееш введу под запись результата удаления?
Ты хочеш записать строку, которую удалил? ohmy.gif
Пиши перед удалением...
Riva
Отправлено: 21.02.2007, 18:37


Ученик-кочегар

Группа: Участник
Сообщений: 14



Нет я имею ввиду, что в StringGrig удаление происходит а в файле при этом ни чего не изменяется
Grigoriy
Отправлено: 21.02.2007, 19:11


Мастер участка

Группа: Участник
Сообщений: 381



Я думаю, что тут какое-то гонево...
Во первых фрагмент текста программы
QUOTE

for (int i=curRec; iRowCount-1; i++)

я понимаю, что переменной iRowCount не существует, а просто это опечатка.
И еще вот
CODE

ini->WriteString ( "Topics", r, StringGrid1->Cells[c][r] );

не пойму, как это могло компилироваться, если r — это должен быть строковый параметр, а не целочисленный.
Termi_uc
Отправлено: 21.02.2007, 19:57


Дежурный стрелочник

Группа: Участник
Сообщений: 61



Cудя по
CODE
StringGrid1->RowCount--;
TIniFile *ini;
ini = new TIniFile(
ChangeFileExt( Application->ExeName, ".ini" ) );
ini->WriteString ( "Topics", r, StringGrid1->Cells[c][r] );
delete ini;

ты пытаешся переписать значение StringGrid1->Cells[c][r], в эллемент с номером r.

Хм...
По идеи, у тебя должно быть примерно так:
Перед удалением
[Topics]
0=Line1
1=Line2
2=Line3
3=Line4
И так после удаления строки 2, например:
[Topics]
0=Line1
1=Line3
2=Line3
3=Line4
Вывод: тебе надо сохранять в файл все строки начиная с удалённой.

Вообще, для данного сохранения лучше подойдёт
CODE
StringGrid1->Cols[0]->SaveToFile(ChangeFileExt( Application->ExeName, "._ini" ) );

Сохраняет в выбранный файл 0-й столбец.
Grigoriy
Отправлено: 21.02.2007, 23:23


Мастер участка

Группа: Участник
Сообщений: 381



CODE

ini->WriteString ( "Topics", r, StringGrid1->Cells[c][r] );

Да. Так можно.
Riva
Отправлено: 22.02.2007, 14:43


Ученик-кочегар

Группа: Участник
Сообщений: 14



CODE

ini->WriteString ( "Topics", r, StringGrid1->Cells[c][r] );


А как написать тоже самое, только на основе ListBox1?
CODE

?
Termi_uc
Отправлено: 22.02.2007, 20:09


Дежурный стрелочник

Группа: Участник
Сообщений: 61



QUOTE (Riva @ 22.02.2007, 14:43)
CODE

ini->WriteString ( "Topics", r, StringGrid1->Cells[c][r] );


А как написать тоже самое, только на основе ListBox1?
CODE

?

ListBox1->Items?
CODE
ini->WriteString ( "Topics", r, ListBox1->Items->operator[](r));
Riva
Отправлено: 22.02.2007, 22:01


Ученик-кочегар

Группа: Участник
Сообщений: 14



Спасибо работает. Тема закрыта.

Вернуться в Вопросы программирования в C++Builder