Поиск:

Ответ в темуСоздание новой темы Создание опроса
> StringGrid, удаление строк 
:(
    Опции темы
LenaKi
Дата 5.12.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 22.6.2005

Репутация: 1
Всего: 1



Нашла на форуме код позволяющий убрать не нужное изStringGrid.
Где ошибка у меня?
Подскажите, как правильно удалить в цикле названия из первой колонки StringGrid? Чтобы было понятнее, вылаживаю рисунок. Пытаюсь оставить в StringGrid только то, что мне нужно. Если разкомментировать код получаю ерунду.
Код


//настройка StringGrid
 class TPublicGrid: public  TStringGrid
{
    public:
        using TStringGrid::DeleteRow;
};
for (int i=Form1->StringGrid1->RowCount-1; i > 0; --i)//тут не правильно?
{
      
//руссофицирую нужное в первой колонке и убираю нули из второй колонки
  if(Form1->StringGrid1->Cells[0][i] == "NUMBER1")
          Form1->StringGrid1->Cells[0][i] ="Номер дома";

         if(Form1->StringGrid1->Cells[0][i] == "STR_STD1")
         Form1->StringGrid1->Cells[0][i] ="Номер улицы";

         if(Form1->StringGrid1->Cells[0][i] == "TYPE")
            Form1->StringGrid1->Cells[0][i] ="Тип";

          if(Form1->StringGrid1->Cells[0][i] == "Name")
           Form1->StringGrid1->Cells[0][i] ="Наз.";


       if(Form1->StringGrid1->Cells[1][i] == "0")//убрала все, где есть нули во второй колонке
        ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);



/* если разкомментировать получается ерунда 

         if(Form1->StringGrid1->Cells[0][i] == "ID")
        ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

        if(Form1->StringGrid1->Cells[0][i] == "ID_2")
        ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

         if(Form1->StringGrid1->Cells[0][i] == "NAME_OBJ")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

          if(Form1->StringGrid1->Cells[0][i] == "dom")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);


           if(Form1->StringGrid1->Cells[0][i] == "STR_STD2")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

          if(Form1->StringGrid1->Cells[0][i] == "NAM_STR2")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);


        if(Form1->StringGrid1->Cells[0][i] == "dom")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

         if(Form1->StringGrid1->Cells[0][i] == "LIT_N1")//возможные названия в первой колонке
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);



          if(Form1->StringGrid1->Cells[0][i] == "TANK")
              ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

       if(Form1->StringGrid1->Cells[0][i] == "NAME_OBJ")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);


        if(Form1->StringGrid1->Cells[0][i] == "NUMBER2")
          ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);
*/

}

StringGrid1->Canvas->Font->Size = 10;
StringGrid1->Canvas->Font->Style = StringGrid1->Canvas->Font->Style << fsBold;
int maxWidth = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[0][0]);
int maxWidth2 = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[1][0]);
StringGrid1->Canvas->Font->Size = 8;
StringGrid1->Canvas->Font->Style = StringGrid1->Canvas->Font->Style >> fsBold;
for (int i=1; i<Form1->StringGrid1->RowCount; ++i)
{
   if( Form1->StringGrid1->Canvas->TextWidth( Form1->StringGrid1->Cells[0][i] ) > maxWidth )
     maxWidth = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[0][i]);
   if( Form1->StringGrid1->Canvas->TextWidth( Form1->StringGrid1->Cells[1][i] ) > maxWidth2 )
     maxWidth2 = Form1->StringGrid1->Canvas->TextWidth(Form1->StringGrid1->Cells[1][i]);

}
Form1->StringGrid1->ColWidths[0]= maxWidth+10;
Form1->StringGrid1->ColWidths[1]= maxWidth2+10;

Form1->StringGrid1->Visible = true;

.

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  new_8.gif 32,36 Kb
PM MAIL   Вверх
_hunter
Дата 5.12.2005, 12:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



что-то мне кажется, что ты перепутала колонки и столбцы ( или структуру таблицы ): как в одной ячейке ( и в одном столбце ) может быть и улица и дом и тип?

+ убери из тестового случая все лишнее: ты удаляеш строки? зачем тогда в коде руссификация?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
111111
Дата 5.12.2005, 12:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Изв.Компилятора под рукой нет.
Попробуй на оборот
for (int i=0; i<StringGrid1->RowCount-1; i++)

  Вверх
_hunter
Дата 5.12.2005, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



наоборот как раз строки удалять нельзя -- вся индексация гахнется...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
LenaKi
Дата 5.12.2005, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 22.6.2005

Репутация: 1
Всего: 1



Не совсем поняла, где у меня не правильно hunter?. Вот, например, прилагаю рисунок. В данном StringGrid я, например, хочу убрать все значения из второй колонки, где есть 0 и оставить то, что выделено розовым цветом предварительно руссофицировав. Как точно организовать код?
Нули убираются без проблем:
if(Form1->StringGrid1->Cells[1][i] == "0")
((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

Потом начинаю убирать лишние строки по одной и на каком-то этапе вдруг получаю ерунду.

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  new_1.gif 11,32 Kb
PM MAIL   Вверх
_hunter
Дата 5.12.2005, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



тогда ( если нули убираются ) я не понял в чем проблема...
и на каком этапе ( и в чем это выражается )? -- отладчиком по коду пройди...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Gala
Дата 5.12.2005, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.9.2005

Репутация: 2
Всего: 2



вот моя процедура удаления строки
Код

void __fastcall TMainForm::StringGridRecordDelete(int Rows)
 {
  int  Count, CountRow;
  for (CountRow = Rows; CountRow < StringGrid->RowCount; CountRow++)
   {
    Count = CountRow;
    Count++;
    for(int index = 1; index < StringGrid->ColCount; index++)
     {
      if (StringGrid->Cells[1][Count] != "")
        StringGrid->Cells[index][CountRow] = StringGrid->Cells[index][Count];
      else
        StringGrid->Cells[index][CountRow] = "";
     }
   }
  if (StringGrid->RowCount > 2)
   {
    StringGrid->RowCount--;
   }
 }



PM MAIL   Вверх
LenaKi
Дата 5.12.2005, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 22.6.2005

Репутация: 1
Всего: 1



//Код разкоментирован результат на рисунке ниже с номером 1
Код

for (int i=Form1->StringGrid1->RowCount-1; i > 0; --i)
{

       if(Form1->StringGrid1->Cells[0][i] == "NUMBER1")
          Form1->StringGrid1->Cells[0][i] ="Номер дома";

         if(Form1->StringGrid1->Cells[0][i] == "STR_STD1")
         Form1->StringGrid1->Cells[0][i] ="Номер улицы";

         if(Form1->StringGrid1->Cells[0][i] == "TYPE")
            Form1->StringGrid1->Cells[0][i] ="Тип";

          if(Form1->StringGrid1->Cells[0][i] == "Name")
           Form1->StringGrid1->Cells[0][i] ="Наз.";


          if(Form1->StringGrid1->Cells[1][i] == "0")
        ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);


         if(Form1->StringGrid1->Cells[0][i] == "ID")
       ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

        if(Form1->StringGrid1->Cells[0][i] == "ID_2")
        ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

         if(Form1->StringGrid1->Cells[0][i] == "NAME_OBJ")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

          if(Form1->StringGrid1->Cells[0][i] == "dom")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);


           if(Form1->StringGrid1->Cells[0][i] == "STR_STD2")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

          if(Form1->StringGrid1->Cells[0][i] == "NAM_STR2")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);


         if(Form1->StringGrid1->Cells[0][i] == "NUMBER2")
          ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);


}


//Теперь ставлю коментарии и получаю результат с номером 3

for (int i=Form1->StringGrid1->RowCount-1; i > 0; --i)
{

       if(Form1->StringGrid1->Cells[0][i] == "NUMBER1")
          Form1->StringGrid1->Cells[0][i] ="Номер дома";

         if(Form1->StringGrid1->Cells[0][i] == "STR_STD1")
         Form1->StringGrid1->Cells[0][i] ="Номер улицы";

         if(Form1->StringGrid1->Cells[0][i] == "TYPE")
            Form1->StringGrid1->Cells[0][i] ="Тип";

          if(Form1->StringGrid1->Cells[0][i] == "Name")
           Form1->StringGrid1->Cells[0][i] ="Наз.";


          if(Form1->StringGrid1->Cells[1][i] == "0")
        ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

/*
         if(Form1->StringGrid1->Cells[0][i] == "ID")
       ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

        if(Form1->StringGrid1->Cells[0][i] == "ID_2")
        ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

         if(Form1->StringGrid1->Cells[0][i] == "NAME_OBJ")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

          if(Form1->StringGrid1->Cells[0][i] == "dom")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);


           if(Form1->StringGrid1->Cells[0][i] == "STR_STD2")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

          if(Form1->StringGrid1->Cells[0][i] == "NAM_STR2")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);


         if(Form1->StringGrid1->Cells[0][i] == "NUMBER2")
          ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);
*/

}

//как добиться во втором StringGrid-е результата как в первом


Опишу как я получаю StringGrid. Может в этом проблема.
StringGrid формируется при щелчках мыши динамически. Каждый раз в нем разное кол-во строк с английскими именами в первой колонке. Я хочу создать универсальный код убирающий эти названия и оставляющий только три нужных мне. Я пишу общий код убирающий все ненужные мне названия, благо я знаю все их имена. Убираю простым перечислением в if. Проблема такая: я разкоментировала код выше, на рисунке получила результат с номером 1. Далее в коде сформировался новый StringGrid. У него есть в первой колонке те же имена что и у предыдущего (имена те же, но их меньше). Воздействую тем же кодом, получаю ерунду рисунок 2. Если весь код закомментировать, то вижу что оба StringGrid-а сформировались нормально (рисунок 3), вот только мой универсальный код не убирает строки так, как я это себе представляю в обоих случаях.

Еще раз подробнее. Допустим, есть StringGrid c 20 строками. Я хочу оставить только три строки с нужными мне названиями. Все получилось. Далее сформировался новый StringGrid в нем, к примеру, 10 строк с названиями, которые все есть и в первом 20-ти строковом. Среди них в обязательном порядке есть и мои нужные три строки (такие же имена как и в 20-строковом) и остальные не нужные (тоже с именами как в 20-и строковом). В конечном итоге я хочу в обеих StringGrid-ах отставить нужные мне три строки.


Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  new_6.gif 32,17 Kb
PM MAIL   Вверх
LenaKi
Дата 5.12.2005, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 22.6.2005

Репутация: 1
Всего: 1



Вроде заработало. Надо цикл разбить на два. Сначала удалить строки с нулями во второй колонке, а затем во вновь получившемся StringGrida-е удалять не нужные строки из первой. Почему нельзя объединить удаление нулей из втрой колонки и строк с не нужными именами из первой колонки в одном цикле я пока не поняла.
Код

//руссофикация и удаление строк с нулями во торой колонке
for (int i=Form1->StringGrid1->RowCount-1; i > 0; --i)
{

       if(Form1->StringGrid1->Cells[0][i] == "NUMBER1")
          Form1->StringGrid1->Cells[0][i] ="Номер дома";

         if(Form1->StringGrid1->Cells[0][i] == "STR_STD1")
         Form1->StringGrid1->Cells[0][i] ="Номер улицы";

        

          if(Form1->StringGrid1->Cells[0][i] == "Name")
           Form1->StringGrid1->Cells[0][i] ="Наз.";


          if(Form1->StringGrid1->Cells[1][i] == "0")
        ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

}
//удаление строк с не нужными названий из первой колоке
for (int i=Form1->StringGrid1->RowCount-1; i > 0; --i)
{


         if(Form1->StringGrid1->Cells[0][i] == "ID")
       ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

        if(Form1->StringGrid1->Cells[0][i] == "ID_2")
        ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

         if(Form1->StringGrid1->Cells[0][i] == "NAME_OBJ")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

          if(Form1->StringGrid1->Cells[0][i] == "dom")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);


           if(Form1->StringGrid1->Cells[0][i] == "STR_STD2")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);

          if(Form1->StringGrid1->Cells[0][i] == "NAM_STR2")
         ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);


         if(Form1->StringGrid1->Cells[0][i] == "NUMBER2")
          ((TPublicGrid*)Form1->StringGrid1)->DeleteRow(i);




}



Это сообщение отредактировал(а) LenaKi - 5.12.2005, 15:25
PM MAIL   Вверх
_hunter
Дата 5.12.2005, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



тут проблема в том, что _теряются_ проверки: после удаления строки дальше проверять не нужно ( continue поставить )
а, вообще, эту проверку ( по крайней мере на имена ( STR_STD2, NAM_STR2, ... ) )
лучше вынести в отдельную функцию, в которую передавать строку и список строк для удаления -- и читатся код будет легче и понятнее будет...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
LenaKi
Дата 5.12.2005, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 22.6.2005

Репутация: 1
Всего: 1



Cпасибо, _hunter !
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1076 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.