Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Удаление выделенной строки в StringGrid


Автор: kox 15.6.2004, 18:45
Нужно удалить выделенную строку
код:
StringGrid1->Rows->Delete(StringGrid1->Row);

[C++ Error] Too few parameters in call to '_fastcall TStringGrid::GetRows(int)'

что я делаю неправильно?

Автор: bel_nikita 15.6.2004, 19:18
to kox
Я не знаю че это, но кажется у тебя ошибка в другом месте.
Как вызывается GetRows() ?

Автор: Дрон 15.6.2004, 19:19
По моему, нельзя удалять строки из StringGrid.

Вообще Rows это array property (не знаю как по-русски будет), т.е. там нужно в квадратных скобках указывать номер нужной строки: StringGrid1->Rows[n]

Если я пробую написать:
Код
StringGrid1->Rows[n]->Delete(0);
о при запуске проги возникает ошибка: Cannon insert or delete rows from grid.

Добавлено @ 19:21
bel_nikita
GetRows(), вроде как, вызывается неявно при обращении к Rows.

Автор: Ignat 15.6.2004, 19:32
А просто очистить не хочешь?
StringGrid1->Rows[n]->Clear();

Автор: kox 15.6.2004, 20:17
Хорошо бы было бы конечно удалять, иначе придется потом все следующие строки сдвиать на одну вверх((

Автор: Конструктор 17.6.2004, 09:21
Я всегда вручную удалял. Сдвигал строчки вверх, а потом Grid->RowCount--;
Вот только если есть фиксированные строки, начинаются пляски с бубнами, ибо тогда не удастся удалить последнюю строку, и она всегда будет висеть пустой.

Автор: kox 17.6.2004, 18:25
А как мне узнать номер выделенной строки (у меня построчное выделение)?????

Автор: zss 17.6.2004, 20:29
Цитата(kox @ 17.6.2004, 18:25)
А как мне узнать номер выделенной строки

Код

OnSelectCell (TObject *Sender, int ACol, int ARow, bool &CanSelect);


ARow - номер выделенной строки

а далее как писали выше
Код

StringGrid1->Rows[ARow]->Clear();
...

Автор: kox 17.6.2004, 20:42
Я кажется нашел болле легкий способ узнать номер выделенной строки
StringGrid1->Row
У меня вроде работает, может я неправ?
А удаление строки уже реализовал, путем сдвига всего что ниже на одну строку вверх, а потом colcount--;

Автор: Vyacheslav 18.6.2004, 09:13
Эх, ну что же так неуклюже то (с)

Код

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
   class TProxyGrid : public TStringGrid
   {
       public:
        using TStringGrid::DeleteRow;
   };
   ((TProxyGrid*)StringGrid1)->DeleteRow(StringGrid1->Row);

}

Вот и все

Автор: Конструктор 18.6.2004, 09:54
Vyacheslav

э-э-э прошу пардона, а можно немножечко поподробнее? А то я TStringGrid::DeleteRow не видел в справке.

И что вообще за такая конструкция навороченая, ибо по недостатку знаниев ведать не ведаю? smile.gif

Автор: Vyacheslav 21.6.2004, 09:42
DeleteRow - виртуальный protected метод, который удаляет строку с заданным индексом. Почему разработчики сделали его protected - вопрос не ко мне. Объявлен впервые можно в TCustomGrid.
Выражение
Код

class TProxyGrid : public TStringGrid
  {
      public:
       using TStringGrid::DeleteRow;
  };
((TProxyGrid*)StringGrid1)->DeleteRow(StringGrid1->Row)

- стандартный С++ способ, позволяющий добрастться до protected методов, если не хочется
специально городить класc.
PS Не хелпом единым жив человек

Автор: Конструктор 21.6.2004, 10:25
It works!!! It works!!! biggrin.gif
Вот спасибо. Такого я еще не видывал.
Как наберу 100 постов, +репутация smile.gif

PS
В хелпе нашел. На кой они действительно protected сделали?

Автор: Vyacheslav 21.6.2004, 18:13
То, что сделали protected, я большой беды не вижу. Если интересны мои соображения по этому вопросу, а так же моих оппонентов, советую ознакомится с этим
http://borland.xportal.ru/forum/viewtopic.php?t=7045&highlight=

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)