Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Удаление пустых строк


Автор: MrDmitry 22.6.2010, 07:17
Как организовать цикл по удалению пустых строк в StringGrid?? Или может быть это можно сделать еще проще в компоненте AdvStringGrid? 

Автор: Akella 22.6.2010, 09:34
Выполни цикл от конца к началу (от последней строки к нулевой). В цикле выполняй проверку и удаление.

Автор: Rennigth 22.6.2010, 12:18
Akella, на сколько помню(могу ошибаться) в StringGrid можно только уменьшить кол-во строк(столцов), так что надо извращаться )))
(п.с. не люблю я StringGrid)

Автор: Frees 22.6.2010, 12:28
Цитата(Rennigth @  22.6.2010,  15:18 Найти цитируемый пост)
StringGrid можно только уменьшить кол-во строк(столцов)

у автора AdvStringGrid у него есть метод RemoveRows - для удаления строк

Добавлено через 1 минуту и 3 секунды
PS
Цитата(Rennigth @  22.6.2010,  15:18 Найти цитируемый пост)
(п.с. не люблю я StringGrid)

а что вместо него любишь?

Автор: Rennigth 22.6.2010, 12:44
Цитата(Frees @  22.6.2010,  12:28 Найти цитируемый пост)
а что вместо него любишь? 

VT или cxGrid если уж совсем суръезные извращения нужны.  Иногда ListView.  smile 


Цитата(Frees @  22.6.2010,  12:28 Найти цитируемый пост)
у автора AdvStringGrid

Цитата(MrDmitry @  22.6.2010,  07:17 Найти цитируемый пост)
Как организовать цикл по удалению пустых строк в StringGrid?? 

 smile 

Автор: MrDmitry 23.6.2010, 07:02
Цитата(Akella @ 22.6.2010,  09:34)
Выполни цикл от конца к началу (от последней строки к нулевой). В цикле выполняй проверку и удаление.

Цитата

на сколько помню(могу ошибаться) в StringGrid можно только уменьшить кол-во строк(столцов), так что надо извращаться )))
(п.с. не люблю я StringGrid)


Вот вопрос как раз таки и в том как именно извращаца? ))
Просто я думаю может поставить компонент AdvStrinGrid? Как там удалять строки?

Автор: DarkProg 23.6.2010, 10:07
Цитата(MrDmitry @  23.6.2010,  07:02 Найти цитируемый пост)
Просто я думаю может поставить компонент AdvStrinGrid? Как там удалять строки? 

Да также, пока никто насколько я знаю другого способа не придумал как действовать по следующему алгоритму(вообще их два я оба напишу, но просто почти не отличаются):
1)идём сначала(или откуда надо) по всем строка таблицы
2)нашли не нужную и тогда организовываем цикл с этого места и до предпоследней строки таблицы( т.е. StringGrid.RowCount-1 или уже до куда надо), в этом цикле мы каждой текущей строке присваиваем значение следующей
3)последнюю строку очищаем и уменьшаем число строк на одну

В результате получите то что хотите

Второй вариант заключается в том чтобы все ненужные строки просто очистить и после того как очистили все строки уже организовать цикл по сдвигу и соответственно уменьшению числа строк

Для данных целей я вам рекомендую использовать цикл с предусловием

Как ещё вариант(вспомнил что как-то такое пробовал, но на малых объёмах) можете нужные строки скопировать в некоторую невидимую таблицу а потом переместить их опять в вашу видимую, но обязательно уменьшив число строк(последние в принципе желательно очищать)

Автор: MrDmitry 23.6.2010, 11:08
Код

 adv:=0;
      i:=0;
      j:=0;
     While adv<StringGrid1.RowCount do
  begin
   inc(Adv);
   if (StringGrid1.cells[0,adv]='') or (StrToInt(StringGrid1.cells[5,adv])<5)
    then
     begin
      i:=AdvStringGrid1.Row+1;
      inc(j)
      StringGrid1.Cells[0,adv]:=StringGrid1.Cells[0,i];
      StringGrid1.Cells[1,adv]:=StringGrid1.Cells[1,i];
      StringGrid1.Cells[2,adv]:=StringGrid1.Cells[2,i];
      StringGrid1.Cells[3,adv]:=StringGrid1.Cells[3,i];
      StringGrid1.Cells[4,adv]:=StringGrid1.Cells[4,i];
      StringGrid1.Cells[5,adv]:=StringGrid1.Cells[5,i];
      StringGrid1.Cells[6,adv]:=StringGrid1.Cells[6,i];
     end;
    end;
   StringGrid1.RowCount:=StringGrid1.RowCount-j;

вот так заработает? просто сейчас на работе, нет возможности проверить (

Автор: rytmix 23.6.2010, 14:01
Код

type TMyGrid = class(TCustomGrid);
....
....
....
procedure TForm1.DelRow(Sender: TObject); 
begin 
    TMyGrid(StringGrid1).DeleteRow(StringGrid1.Row);
end;

Автор: Mikel 23.6.2010, 14:39
И как четвертый вариант smile , затереть ненужную строку последней, уменьшив число строк на 1.
Можно не перетаскивать все значения
Код

StringGrid1.Cells[0,adv]:=StringGrid1.Cells[0,i];
...

а воспользоваться 
Код

StringGrid1.Rows[adv].Text:=StringGrid1.Rows[i].Text

Автор: Akella 25.6.2010, 10:44
Цитата(Rennigth @  22.6.2010,  12:18 Найти цитируемый пост)
Akella, на сколько помню(могу ошибаться) в StringGrid можно только уменьшить кол-во строк(столцов), так что надо извращаться )))
(п.с. не люблю я StringGrid) 

Да, по идее нужно смещать информацию в гриде, а потом установить нужно значение количества строк


Цитата(MrDmitry @  23.6.2010,  07:02 Найти цитируемый пост)
Просто я думаю может поставить компонент AdvStrinGrid? Как там удалять строки? 


Вроде ж по-русски ответили smile
Цитата(Frees @  22.6.2010,  12:28 Найти цитируемый пост)
у автора AdvStringGrid у него есть метод RemoveRows - для удаления строк


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