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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2010, 18:54   #11
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
но приходиться жать на кнопку три четыре раза
Я же уже дал это решение.
Код:
i := 1;
while i < Stringgrid1.RowCount do begin
  if StringGrid1.Cells[2, i] = '0' then
    GridDeleteRow(i, stringGrid1)
  else
    Inc (i);
end;
Sibedir вне форума Ответить с цитированием
Старый 21.12.2010, 19:05   #12
Aleksandr69
Пользователь
 
Регистрация: 11.12.2010
Сообщений: 71
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Я же уже дал это решение.
Код:
i := 1;
while i < Stringgrid1.RowCount do begin
  if StringGrid1.Cells[2, i] = '0' then
    GridDeleteRow(i, stringGrid1)
  else
    Inc (i);
end;

простите ступил,все работает огромное спасибо
Aleksandr69 вне форума Ответить с цитированием
Старый 21.12.2010, 20:11   #13
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

вот еше 1 вариант
Код:
procedure TForm1.Button1Click(Sender: TObject);
 var
 i, j, k: integer;
begin

  for i := 0 to Stringgrid1.RowCount -1 do
  begin
    if StringGrid1.Cells[1, i] = '0' then
      for j := i to StringGrid1.RowCount - 1 do
        for k := 0 to StringGrid1.ColCount - 1 do
          StringGrid1.Cells[k,j]:=StringGrid1.Cells[k,j+1]
  end;
end;
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 21.12.2010, 22:37   #14
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Нет, это не вариант. Если две строки с '0' идут подряд, вторая из них не удалится. Нужен именно while, а не for.
Sibedir вне форума Ответить с цитированием
Старый 22.12.2010, 02:13   #15
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Нет, это не вариант. Если две строки с '0' идут подряд, вторая из них не удалится. Нужен именно while, а не for.
согласен, косяк! исправлюсь)
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 23.12.2010, 16:41   #16
Aleksandr69
Пользователь
 
Регистрация: 11.12.2010
Сообщений: 71
По умолчанию StringGrid

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Я же уже дал это решение.
Код:
i := 1;
while i < Stringgrid1.RowCount do begin
  if StringGrid1.Cells[2, i] = '0' then
    GridDeleteRow(i, stringGrid1)
  else
    Inc (i);
end;
Странно работает цикл,если в таблице 2000 строк все очень быстро,а если больше очень медленно удаляет.Как ускорить процесс и почему такая проблема вообще не пойму.
Aleksandr69 вне форума Ответить с цитированием
Старый 24.12.2010, 04:38   #17
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Попробуй так:
Код:
var
  r, c, i: Integer;
begin
  Randomize;
  i := 1;
  for r := 1 to StringGrid1.RowCount-1 do begin
    if StringGrid1.Cells [2, r] <> '0' then begin
      if r <> i then begin
        for c := 0 to StringGrid1.ColCount-1 do begin
          StringGrid1.Cells [c, i] := StringGrid1.Cells [c, r];
        end;
      end;
      i := i + 1;
    end;
  end;
  StringGrid1.RowCount := i;
end;
Sibedir вне форума Ответить с цитированием
Старый 24.12.2010, 07:35   #18
Aleksandr69
Пользователь
 
Регистрация: 11.12.2010
Сообщений: 71
По умолчанию

все работает отлично скорость просто супер 2 секунды ,можно подробно почему такой эффект,нужно все переделать по такому принципу
Aleksandr69 вне форума Ответить с цитированием
Старый 25.12.2010, 07:57   #19
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Процедура GridDeleteRow каждый раз при ее вызове перемещала все данные ниже удаляемой строчки на 1 вверх, да еще и размер уменьшала на 1. Если строчек с "0" была 1000, то последняя строка перезаписывается 1000 раз. А сейчас каждая строчку перемещается всего единажды, а в конце 1 раз меняется размер стрингрида. Считай в (1000)^0.5 = 31 раз быстрее.
GridDeleteRow применима при одиночных удалениях.

Последний раз редактировалось Sibedir; 25.12.2010 в 08:23. Причина: c математикой шутки плохи
Sibedir вне форума Ответить с цитированием
Старый 28.12.2010, 15:23   #20
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Нет, это не вариант. Если две строки с '0' идут подряд, вторая из них не удалится. Нужен именно while, а не for.
Код:
procedure TForm1.Button1Click(Sender: TObject);
 var
 i, j, k: integer;
begin
  for i := Stringgrid1.RowCount -1 downto 0 do
  begin
    if StringGrid1.Cells[1, i] = '0' then
      for j := i to StringGrid1.RowCount - 1 do
        for k := 0 to StringGrid1.ColCount - 1 do
         StringGrid1.Cells[k,j]:=StringGrid1.Cells[k,j+1]
   end;
end;
VirusN13
ArtGrek вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение строк Dasharnb777 Общие вопросы .NET 5 22.09.2010 20:46
firebird сравнение belii0987 БД в Delphi 6 17.09.2010 14:58
сравнение slavsmo Microsoft Office Excel 2 05.04.2010 17:51
stringgrid,сравнение двух столбцов на совпадения и не совпадения betirsolt БД в Delphi 7 19.01.2010 15:09
Сравнение данных White БД в Delphi 1 09.09.2008 22:32