Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > StringGrid


Автор: LenaKi 5.12.2005, 12:01
Нашла на форуме код позволяющий убрать не нужное из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;

.

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

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

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

Автор: _hunter 5.12.2005, 12:39
наоборот как раз строки удалять нельзя -- вся индексация гахнется...

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

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

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

Автор: Gala 5.12.2005, 14:14
вот моя процедура удаления строки
Код

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



Автор: LenaKi 5.12.2005, 14:48
//Код разкоментирован результат на рисунке ниже с номером 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-ах отставить нужные мне три строки.

Автор: LenaKi 5.12.2005, 15:23
Вроде заработало. Надо цикл разбить на два. Сначала удалить строки с нулями во второй колонке, а затем во вновь получившемся 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);




}


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

Автор: LenaKi 5.12.2005, 17:09
Cпасибо, _hunter !

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