Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2011, 23:40   #1
Turboworld
 
Регистрация: 27.12.2007
Сообщений: 3
По умолчанию Удаление строки в StringGrid работает как-то странно.

Добрый вечер!

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

PHP код:
procedure DelStroka(var mTStringGridnomer:integer);
var 
i:integer;
begin
   
// идем по игреку - т.е. по СТРОКАМ, нулевую (заголовки) не трогаем
   
for i:=1 to m.RowCount-do begin
       
if i>=nomer then begin
           m
.Rows[i]:=m.Rows[i+1];
       
end;
   
end;
   
m.RowCount:=m.RowCount-1// т.к. мы только что удалили одну строку.
   
Form1.Edit1.Text:= inttostr(m.RowCount);
end
Процедурка работает, кажется, правильно. Но когда я захотел удалить из таблицы все строки, заданная ячейка которых пустая:

PHP код:
procedure TForm1.Button6Click(SenderTObject);
var 
i:integer;
begin
   
for i:=1 to StringGrid1.RowCount-do begin
     
if StringGrid1.Cells[4,i]='' then begin
       DelStroka
(StringGrid1,i);
     
end;
   
end;
end
то обнаружил, что удаляются почему-то не все строки, у которых значение заданного столбца пустое. Т.е. кнопку, привязанную к процедуре, нужно нажимать дважды... уже на втором проходе удаляет все строки... но почему необходимо проходить дважды??? Должно же работать сразу - сразу удалять все-все строки, где заданная ячейка равна пусто =''

Не подможете разобраться, в чем причина странной работы кода? =/
Turboworld вне форума Ответить с цитированием
Старый 25.04.2011, 00:01   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

после удаления строки номера всех последующих строк сдвигаются (уменьшаются на 1). в ркзультате строка следкющая за удаленной из анализа выпадает и остается.
чтобы избежать этого анализ надо начинать с конца и идти вверх
for i:=StringGrid1.RowCount-1 dowto 1 do begin
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 25.04.2011, 00:47   #3
Turboworld
 
Регистрация: 27.12.2007
Сообщений: 3
По умолчанию

Благодарю за подсказку, но я и сам уже додумался ))) Правда я заменил цикл FOR на WHILE (для возможности модификации внутри цикла переменной i). Получилось так:

Код:
procedure TForm1.Button6Click(Sender: TObject);
var i:integer;
begin
   i:=1;
   while i<=(StringGrid1.RowCount-1) do begin
     if StringGrid1.Cells[3,i]='' then begin
       DelStroka(StringGrid1,i);
       i:=i-1;
     end;
     i:=i+1;
   end;
end;


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 25.04.2011 в 09:14.
Turboworld вне форума Ответить с цитированием
Старый 25.04.2011, 09:04   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Благодарю за подсказку, но я и сам уже додумался )))
Молодец!
Я бы переписал твой код немного переписал
Код:
while i<=(StringGrid1.RowCount-1) do begin
     if StringGrid1.Cells[3,i]='' then begin
       DelStroka(StringGrid1,i);
///       i:=i-1;
     end
    else  i:=i+1;
   end;
т.е. перемещение по строкам только при НЕ удалении.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрет на удаление пустой строки StringGrid Sheeby Помощь студентам 8 25.04.2011 07:31
странно работает RegSetValueEx di91 Win Api 4 07.11.2010 15:27
Stringgrid удаление строки Horus92 Компоненты Delphi 2 25.05.2010 07:40
Delphi. StringGrid. PopupMenu. Удаление строки Neroaz Помощь студентам 3 04.04.2010 16:51
Странно работает эзешник на другом компьютере runtimeLibrary(Multi-threaded (/MT) LostSoul Общие вопросы C/C++ 11 20.04.2009 23:25