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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2010, 08:30   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Счастье Странный цикл у меня в StringGrid

Доброй утро! Играюсь тут сижу с циклом подсчета количества одинаковых значений в строке в StringGrid-e. Цикл:
Код:
 counter:=0;
 for x1:=8 to Form1.RzStringGrid1.ColCount + 1 do
 begin
  if Form1.RzStringGrid1.Cells[x1,1] <> '' then
  begin
    Inc(counter);
    Form1.RzStringGrid1.Cells[4,1]:=IntToStr(counter)
  end;
 end;
считает количество не пустых ячеек. А если я ему пишу так:
Код:
 counter:=0;
 for x1:=8 to Form1.RzStringGrid1.ColCount + 1 do
 begin
  if Form1.RzStringGrid1.Cells[x1,1] = '100' then
  begin
    Inc(counter);
    Form1.RzStringGrid1.Cells[4,1]:=IntToStr(counter)
  end;
 end;
т.е. я хочу, чтобы он мне считал только ячейки с "100", он по-прежнему считает общее количество не пустых ячеек, даже если я в эту строку впишу другое число. Понимаю, что я что-то не то написал. Но что именно?
Для наглядности пример того, что должно получаться во вложении...
Изображения
Тип файла: jpg Безымянный.jpg (9.8 Кб, 128 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 25.07.2010 в 09:07.
artemavd вне форума Ответить с цитированием
Старый 25.07.2010, 10:11   #2
betirsolt
Форумчанин
 
Регистрация: 20.07.2009
Сообщений: 421
По умолчанию

странно..у меня есть проект с стринггридом и циклами,вроде все работает вот например одна процедура оттуда
Код:
procedure TForm1.ToolButton4Click(Sender: TObject);
begin
index:=1;
progressform.Show;
progressform.Caption:='Поиск совпадений';
progressform.ProgressBar1.Max:=setchik;
 for k := 1 to setchik  do
   begin
     for j := k+1 to  setchik do
      begin
       if stringgrid1.Cells[3,k]=stringgrid1.Cells[3,j] then
       begin
            for I := 1 to 12 do
         begin
           stringgrid2.Cells[i,index]:=stringgrid1.Cells[i,k];
         end;
         index:=index+1;
         for I := 1 to 12 do
         begin
         stringgrid2.Cells[i,index]:=stringgrid1.Cells[i,j];
         end;
         index:=index+1;
       end;
   end;
        progressform.ProgressBar1.Position:=progressform.ProgressBar1.Position+1;
   end;
   progressform.ProgressBar1.Position:=0;
   progressform.Close;
end;
может ты тоже попробуешь сравнить не с '100' а записать число 100 в какую нибудь невидимую ячеку или еще куда то и потом сравнивать две ячейки как у меня
Код:
 if stringgrid1.Cells[3,k]=stringgrid1.Cells[3,j] then
не знаю...
Уважаемые модераторы, Я всячески стараюсь не нарушать правила сайта, будьте снисходительны
betirsolt вне форума Ответить с цитированием
Старый 25.07.2010, 10:17   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
Form1.RzStringGrid1.ColCount + 1
должно быть, разумеется, минус один (Form1.RzStringGrid1.ColCount - 1)

но по сути, второй вариант похож на правильный.
Единственно, я бы вынес запись счётчика в грид за цикл...

я думаю, что ошибка у Вас где-то в другом месте...
p.s. попробуйте кинуть отдельно кнопку и на неё назначить код:
Код:
 counter:=0;
 Form1.RzStringGrid1.Cells[4,1]:='n/a';
 for x1:=8 to Form1.RzStringGrid1.ColCount - 1 do
 begin
  if Trim(Form1.RzStringGrid1.Cells[x1,1]) = '100' then
    Inc(counter);
 end;
 Form1.RzStringGrid1.Cells[4,1]:=IntToStr(counter);
и расскажите о получаемых результатах.

Последний раз редактировалось Serge_Bliznykov; 25.07.2010 в 10:20.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.07.2010, 10:46   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
должно быть, разумеется, минус один (Form1.RzStringGrid1.ColCount - 1)
Конечно! Именно так, сейчас правильно считает. Спасибо всем

Маленький нюанс.
Как записать, чтобы в таблицу в колонку под 100 не проставлялось одинаковое значение в весь столбец? Считать то считает, но проставляет в весь столбец, а надо только до последней заполненной строки.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 25.07.2010 в 11:08.
artemavd вне форума Ответить с цитированием
Старый 25.07.2010, 12:44   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Как записать, чтобы в таблицу в колонку под 100 не проставлялось одинаковое значение в весь столбец? Считать то считает, но проставляет в весь столбец, а надо только до последней заполненной строки.
так кто ж видит, где и как Вы цикл организовали?!!! Вы же знаете, что телепаты все в отпуске

попробуйте вот так:

Код:
var k, j : integer;
      ArrCounter : array[1..4] of integer;
....
 for k:=1 to  Form1.RzStringGrid1.RowCount - 1 do begin
   for j:=1 to 4 do begin
      ArrCounter[j] := 0;
      Form1.RzStringGrid1.Cells[3+j,k]:='n/a';
   end;

   for x1:=8 to Form1.RzStringGrid1.ColCount - 1 do
   begin
      for j:=1 to 4 do
        if Trim(Form1.RzStringGrid1.Cells[x1,k]) = 
                  Trim(Form1.RzStringGrid1.Cells[3+j,0])  then
           Inc(ArrCounter[j]);
   end;
   for j:=1 to 4 do
     Form1.RzStringGrid1.Cells[3+j,k]:=IntToStr(ArrCounter[j]);
end;
ВНИМАНИЕ! ВАЖНО!
Сравнение (и подсчёт) идёт по заголовкам столбцов 4, 5, 6 и 7 -го (напоминаю, нумерация столбцов от нуля).

там должно быть подсчитываемые значения
(ну, например, как на рисунке из пост #1: 100 200 300 400

Последний раз редактировалось Serge_Bliznykov; 25.07.2010 в 12:48.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.07.2010, 13:27   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Нет, не работает

Давай, Сергей, попробуем разобраться в коде. Код:
Код:
var k, j : integer;
      ArrCounter : array[1..4] of integer; //массив столбцов от 1 до 4, т.е. 1,2,3,4
....
 for k:=1 to  Form1.RzStringGrid1.RowCount - 1 do begin //начиная с первой строки и до последней
   for j:=1 to 4 do begin //начиная с первого столбца и до четвертого
      ArrCounter[j] := 0; //инициализируем каждый "столбец" - тут понятно
      Form1.RzStringGrid1.Cells[3+j,k]:='n/a'; //начиная с третьего столбца, прибавляем наши столбцы от 1 до 4
   end;

   for x1:=8 to Form1.RzStringGrid1.ColCount - 1 do  //начиная с восьмого столбца
   begin
      for j:=1 to 4 do //начиная с первого столбца и до четвертого
        if Trim(Form1.RzStringGrid1.Cells[x1,k]) = 
                  Trim(Form1.RzStringGrid1.Cells[3+j,0])  then //вот тут непонятно
           Inc(ArrCounter[j]);
   end;
   for j:=1 to 4 do
     Form1.RzStringGrid1.Cells[3+j,k]:=IntToStr(ArrCounter[j]);
end;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 25.07.2010 в 13:36.
artemavd вне форума Ответить с цитированием
Старый 25.07.2010, 14:22   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
//начиная с первой строки и до последней
ну не от первой, а от второй.
Или, да, от первой, если первую строку грида считать нулевой
то же касается и 8-го столбца...

Цитата:
Код:
      for j:=1 to 4 do //начиная с первого столбца и до четвертого
по сути верно! только не с первого столбца.
это для заполнения массива со счётчиками (нам же 4-ре столбца надо заполнить?...)


Цитата:
Код:
        if Trim(Form1.RzStringGrid1.Cells[x1,k]) = 
                  Trim(Form1.RzStringGrid1.Cells[3+j,0])  then //вот тут непонятно
если текущее значение K-й строки и x1 столбца
совпадает с нулевым значением 3+j столбца нулевой строки (нулевая строчка, это та, где у Вас должны находиться заголовки столбцов).

Вот попробуйте написать просто такой код (отдельно, например на кнопке...):
Код:
ShowMessage("Заголовок равен "+Trim(Form1.RzStringGrid1.Cells[4,0]));
если увидели "Заголовок равен 100" значит такой подход будет работать. Иначе надо чуть-чуть по другом цикл сравнения сделать.

Цитата:
Нет, не работает
а как именно не работает? Ошибку выдаёт? Или что? И что при этом в столбцах 4-7 получается? Нули? "n/a" ? или какие-то значения, но неправильные?
Рассказывайте поподробнее. Обязательно добьём Вашу задачу!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.07.2010, 14:29   #8
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Рассказывайте поподробнее.
Сейчас распишу.... . Подожди

Итак, есть таблица

В столбцах 100, 200, 300, 400 записывается количество соотвествующих значений в строках, начиная со столбца с первой датой, в данном случае с 25.07.2010 и до последнего столбца. Иными словами, напротив каждой ФИО, должна располагаться соотвествующая строчка с количеством 100, 200, 300, 400, т.е. сколько их всего в строчке по-отдельности. Как-то так. Вот и вся задача. . Сколько всего именно строк будет - точно заранее неизвестно.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 25.07.2010 в 14:34.
artemavd вне форума Ответить с цитированием
Старый 25.07.2010, 14:38   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да это я уже понял!!
Предложенный мною выше код именно эту задачу и решает!

Ты распиши, что означает "Нет, не работает "!!!
__КАК__ именно не работает?! Мой код выдаёт ошибку? Или Что? Что после выполнения кода получается в значениях столбцов?! Пошагово пробовал проходить код?!

и ещё.
выполни эту строчку кода!
Код:
ShowMessage("Заголовок равен "+Trim(Form1.RzStringGrid1.Cells[4,0]));
что увидел в результате выполнения?!?!?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.07.2010, 15:05   #10
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
что увидел в результате выполнения?!?!?!
Название столба 100.

Цитата:
Что после выполнения кода получается в значениях столбцов?!
Все четыре столбца от начала и до конца проставляются нулями.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл подстановки в Edit из StringGrid artemavd Общие вопросы Delphi 11 06.07.2010 10:21
Цикл по времени - Как сделать так чтобы цикл выполнялся к примеру 10 секунд ? Anarki Общие вопросы C/C++ 3 13.11.2009 19:23
[B]Странный макрос[/B] mephist Microsoft Office Word 10 12.06.2009 11:46
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34