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

 
Как победить компонент StringGrid ?
Костик
Отправлено: 11.01.2005, 21:54


Не зарегистрирован







Как в компоненте StringGrid удалить требуемую строку ? Вроде бы такая элементарщина, а не получается, вылетает сообщение об ошибке. Я делаю так: StringGrid1->Rows->Delete(1); Не получается, пишет что то вроде 'to few parametres to call GetRows ...'. Почему компилятор меня не любит ??? Помогите !
Bond
Отправлено: 11.01.2005, 22:01


Станционный диспетчер

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



CODE

StringGrid1->Cells[ColumnIndex][RowIndex] = "Hello";
Bond
Отправлено: 11.01.2005, 22:07


Станционный диспетчер

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



Правильно обратиться к строке:
CODE
StringGrid1->Rows[_RowIndex]

При попытке удалить строку выдает ошибку "Cannot insert or delete rows from grid"
Aptem
Отправлено: 12.01.2005, 03:48


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

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



Когда я мало знал о TStringGrid я делал так:
CODE
//---------------------------------------------------------------------------
void __fastcall TForm1::DeleteRowInGrid ( TStringGrid *Grid, int Row )
{
for ( int i = 0; i < Grid -> RowCount; i++ )
if ( i > Row )
for ( int j = 0; j < Grid -> ColCount; j++ )
Grid -> Cells[j][i-1] = Grid -> Cells[j][i];

for ( int j = 0; j < Grid -> ColCount; j++ )
Grid -> Cells[j][Grid -> RowCount-1] = "";

Grid -> RowCount--;
}
//---------------------------------------------------------------------------


Отредактировано Aptem — 12/01/2005, 04:59
full_lamer
Отправлено: 12.01.2005, 08:50


Машинист паровоза

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



QUOTE (Aptem @ 12/01/2005, 04:50)
Когда я мало знал о TStringGrid я делал так...

а теперь?
Bond
Отправлено: 12.01.2005, 10:45


Станционный диспетчер

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



smile.gif Есть компонент с расширенными функциональными возможностями TProfGrid, но ссылку на него я не помню. Можно в нем посмотреть — может есть фишка удаления строки
GIZMO
Отправлено: 12.01.2005, 11:53


Машинист паровоза

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



QUOTE (Костик @ 11/01/2005, 22:56)
Как в компоненте StringGrid удалить требуемую строку ? Вроде бы такая элементарщина, а не получается, вылетает сообщение об ошибке. Я делаю так: StringGrid1->Rows->Delete(1); Не получается, пишет что то вроде 'to few parametres to call GetRows ...'. Почему компилятор меня не любит ??? Помогите !

Удалить в компоненте TStringGrid произвольную строку или столбец нельзя, только последнюю(ий) и поэтому получается следующее...
CODE

//удалить колонку...
void RemoveCol(TStringGrid* StringGrid, int Index)
{
 assert(StringGrid != NULL);
 //откл. перерисовку...
 SNDMSG(StringGrid->Handle, WM_SETREDRAW, false, 0);
 try
 {
   const int col_count = StringGrid->ColCount;

   // смещаем  стобцы на один влево
   for (int col = Index; col < col_count — 1; ++col)
   {
     StringGrid->Cols[col] = StringGrid->Cols[col + 1];
   }      

   // удаляем последнюю колонку...
   StringGrid->ColCount = col_count -1;
 }
 __finally
 {
   SNDMSG(StringGrid->Handle, WM_SETREDRAW, true, 0);
 }

 // вычисляем область для перерисовки...
 RECT R = StringGrid->CellRect(0, Index);
 InflateRect(&R, StringGrid->Width, StringGrid->Height);
 //и обновляем ее...
 InvalidateRect(StringGrid->Handle, &R, false);
}
//-----------------------------------------------------------------------------

Тоже самое со строками.
Konstantine
Отправлено: 12.01.2005, 15:37


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

Группа: Модератор
Сообщений: 545



StringGrid1->Rows->Delete(1); не подходит, т.к. StringGrid1->Rows возвращает тип TStrings... — по строчке на каждую ячейку...
а удалить строку наверно и нету. sad.gif нада или переписывать нижние строки (как предложил Aptem) или можно (криво правда) высоту строки сделать =0.... (правда линия вдвое толще выходит), а при =-1, её вообще нету....
Bond
Отправлено: 12.01.2005, 15:50


Станционный диспетчер

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



Мне кажется что самый нормальный вариант у GIZMO.
Он ведь переписывает строки более шустро и выключает перерисовку грида, что не затормозит приложение
Aptem
Отправлено: 12.01.2005, 19:41


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

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



QUOTE (full_lamer @ 12/01/2005, 09:52)
QUOTE (Aptem @ 12/01/2005, 04:50)
Когда я мало знал о TStringGrid я делал так...

а теперь?

А теперь я использую TAdvStringGrid вместо обычного TStringGrid, а там существует функция RemoveRows biggrin.gif

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