На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Как посчитать количество элементов и вывести в StringGrid один элемент?
    Допустим второй элемент 4 как посчитать количество 4 и вывести в Grid четвертый элемент массива “4444”?
    Пример массив:
    ExpandedWrap disabled
      var
        Form1: TForm1;
        a: array[1..10,1..4] of integer = ((1, 1, 4234,1111),
                                           (1, 4, 5423,4444),
                                           (1, 3, 6532,3333),
                                           (1, 5, 8865,5555),
                                           (1, 4, 3456,4444),
                                           (1, 3, 7898,3333),
                                           (1, 4, 5643,4444),
                                           (1, 5, 7542,5555),
                                           (1, 3, 7532,3333),
                                           (1, 4, 3456,4444));

    Если в массиве во втором элемента отсутствует цифра 4, то ничего не выводить.
    Другими словами сравнить все элементы второго значения узнать, где 4(если их количество больше 0) вывести один раз значение “4444” в StringGrid.
    Пример:
    ExpandedWrap disabled
      unit Unit1;
       
      interface
       
      uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, Grids;
       
      type
        TForm1 = class(TForm)
          StringGrid1: TStringGrid;
          procedure FormShow(Sender: TObject);
        private
          { Private declarations }
        public
          { Public declarations }
        end;
       
      var
        Form1: TForm1;
        a: array[1..10,1..4] of integer = ((1, 1, 4234,1111),
                                           (1, 4, 5423,4444),
                                           (1, 3, 6532,3333),
                                           (1, 5, 8865,5555),
                                           (1, 4, 3456,4444),
                                           (1, 3, 7898,3333),
                                           (1, 4, 5643,4444),
                                           (1, 5, 7542,5555),
                                           (1, 3, 7532,3333),
                                           (1, 4, 3456,4444));
       
      implementation
       
      {$R *.dfm}
       
      procedure TForm1.FormShow(Sender: TObject);
      var i,t:Integer;
      begin
      StringGrid1.RowCount:=Length(a);
       
      t:=1;
       
       
      for i:=1 to Length(a) do
        if a[i][2] = 4 then
        begin
       
          //ShowMessage(IntToStr(t));
          StringGrid1.Cells[1,t]:=IntToStr(a[i][3]);
          inc(t);
        end;
      end;
       
      end.
    Сообщение отредактировано: Katerina1993 -
      Ну ваш пример же уже почти все решает.
      ExpandedWrap disabled
        unit Unit1;
            
        interface
            
        uses
            Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
            Dialogs, Grids;
            
        type
            TForm1 = class(TForm)
            StringGrid1: TStringGrid;
            procedure FormShow(Sender: TObject);
            private
            { Private declarations }
            public
            { Public declarations }
            end;
            
        var
            Form1: TForm1;
            a: array[1..10,1..4] of integer = ((1, 1, 4234,1111),
                            (1, 4, 5423,4444),
                            (1, 3, 6532,3333),
                            (1, 5, 8865,5555),
                            (1, 4, 3456,4444),
                            (1, 3, 7898,3333),
                            (1, 4, 5643,4444),
                            (1, 5, 7542,5555),
                            (1, 3, 7532,3333),
                            (1, 4, 3456,4444));
            
        implementation
            
        {$R *.dfm}
            
        procedure TForm1.FormShow(Sender: TObject);
        var i,j,k,t:Integer;
        begin
        StringGrid1.RowCount:=Length(a);
            
        t:=0;
        j:=Low(a)-1; // Начальное значение индекса
        k:=Low(a)-1; // Начальное значение индекса
            
        for i:=1 to Length(a) do
            if a[i][2] = 4 then
            begin
            
            //ShowMessage(IntToStr(t));
            // StringGrid1.Cells[1,t]:=IntToStr(a[i][3]);
            // Для сохранения первого индекса совпавшего с условием
            if j < Low(a) then j := i;
            // Для сохранения последнего индекса совпавшего с условием
            k := i;
            inc(t);
            end;
        if t > 0 then begin
          // Дальше можете оставить одну из этих строк
          // Почему вы добавляете 3 индекс, хотя сами же просили в условии 4-ый?
          StringGrid1.Cells[1,0]:=IntToStr(a[j][4]); // Значение первого совпавшего с условием элемента
          StringGrid1.Cells[2,0]:=IntToStr(a[k][4]); // Значение последнего совпавшего с условием элемента
        end;
        end;
            
        end.
      Сообщение отредактировано: macomics -
        А как интересно нулевой элемент учитывать в отборе? Я немного изменила массив.

        ExpandedWrap disabled
            a: array[1..10,1..4] of integer = ((1, 1, 4234,1111),
                                               (1, 4, 5423,4444),
                                               (1, 3, 6532,3333),
                                               (1, 5, 8865,5555),
                                               (2, 4, 3456,4444),
                                               (1, 3, 7898,3333),
                                               (3, 4, 5643,4444),
                                               (1, 5, 7542,5555),
                                               (7, 4, 7532,4444),
                                               (1, 4, 3456,4444));


        При этом подчитывая количество, если больше “0” выводя списком?
        1 – 4444
        2 – 4444
        3 – 4444
        7 – 4444.
        Где первый идентификатор размещается в колонку 1, а второй в колонку 2 StrginGrid.
        Сообщение отредактировано: Katerina1993 -
          Цитата Katerina1993 @
          А как интересно нулевой элемент учитывать в отборе?

          Так t это не индекс, а количество. При этом j и k это индексы в массиве.

          Цитата Katerina1993 @
          При этом подчитывая количество, если больше “0” выводя списком?

          Тогда надо либо два цикла, либо надо записать все индексы совпавших элементов в другой массив.
          ExpandedWrap disabled
            unit Unit1;
                
            interface
                
            uses
                Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                Dialogs, Grids;
                
            type
                TForm1 = class(TForm)
                StringGrid1: TStringGrid;
                procedure FormShow(Sender: TObject);
                private
                { Private declarations }
                public
                { Public declarations }
                end;
                
            var
                Form1: TForm1;
                a: array[1..10,1..4] of integer = ((1, 1, 4234,1111),
                        (1, 4, 5423,4444),
                        (1, 3, 6532,3333),
                        (1, 5, 8865,5555),
                        (1, 4, 3456,4444),
                        (1, 3, 7898,3333),
                        (1, 4, 5643,4444),
                        (1, 5, 7542,5555),
                        (1, 3, 7532,3333),
                        (1, 4, 3456,4444));
                
            implementation
                
            {$R *.dfm}
                
            procedure TForm1.FormShow(Sender: TObject);
            var i,j,k,t:Integer;
            b: array of Integer; // Массив с индексами элементов
            begin
            StringGrid1.RowCount:=Length(a);
                
            t:=0;
            j:=Low(a)-1; // Начальное значение индекса
            k:=Low(a)-1; // Начальное значение индекса
            SetLength(b, Length(a));
                
            for i:=1 to Length(a) do
                if a[i][2] = 4 then
                begin
                
                //ShowMessage(IntToStr(t));
                // StringGrid1.Cells[1,t]:=IntToStr(a[i][3]);
                // Для сохранения первого индекса совпавшего с условием
                if j < Low(a) then j := i;
                // Для сохранения последнего индекса совпавшего с условием
                k := i;
                // Сохраняем в массив индексы всех совпавших элементов
                b[t] := i;
                inc(t);
                end;
            if t > 0 then begin
                // Дальше можете оставить одну из этих строк
                // Почему вы добавляете 3 индекс, хотя сами же просили в условии 4-ый?
                StringGrid1.Cells[1,0]:=IntToStr(a[j][4]); // Значение первого совпавшего с условием элемента
                StringGrid1.Cells[2,0]:=IntToStr(a[k][4]); // Значение последнего совпавшего с условием элемента
                for i := Low(b) to High(b) do // Цикл вывода элементов из массива индексов
                    StringGrid1.Cells[i,3] := IntToStr(a[b[i]][4]);
                for i := 1 to Length(a) do // Цикл повторного поиска совпадений
                    if a[i][2] = 4 then
                        StringGrid1.Cells[i,4]:=IntToStr(a[i][4]);
            end;
            end;
                
            end.
          Сообщение отредактировано: macomics -
            Нулевой элемент также следует учитывать как и 1 элемент - 4. Например у меня несколько разных элементов, есть и 2 и 3 и 7 все они входят в номер 4. Соответственно нужно посчитать и если записей больше 0 вывести список.

            Вот например массив.

            ExpandedWrap disabled
              a: array[1..10,1..4] of integer = ((1, 1, 4234,1111),
                                                   (1, 4, 5423,4444),
                                                   (1, 3, 6532,3333),
                                                   (1, 5, 8865,5555),
                                                   (2, 4, 3456,4444),
                                                   (1, 3, 7898,3333),
                                                   (3, 4, 5643,4444),
                                                   (1, 5, 7542,5555),
                                                   (7, 4, 7532,4444),
                                                   (1, 4, 3456,4444));

            А вот результат:

            Прикреплённый файлПрикреплённый файлScreenshot5.png (8,95 Кбайт, скачиваний: 16)
            Это я подразумевала в сообщении выше.
            Сообщение отредактировано: Katerina1993 -
              ExpandedWrap disabled
                unit Unit1;
                    
                interface
                    
                uses
                    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                    Dialogs, Grids;
                    
                type
                    TForm1 = class(TForm)
                      StringGrid1: TStringGrid;
                      procedure FormShow(Sender: TObject);
                    private
                      procedure FirstOption();
                      procedure SecondOption();
                      procedure ThirdOption();
                    public
                    { Public declarations }
                    end;
                    
                var
                    Form1: TForm1;
                    a: array[1..10,1..4] of integer = ((1, 1, 4234,1111),
                                                       (1, 4, 5423,4444),
                                                       (1, 3, 6532,3333),
                                                       (1, 5, 8865,5555),
                                                       (2, 4, 3456,4444),
                                                       (1, 3, 7898,3333),
                                                       (3, 4, 5643,4444),
                                                       (1, 5, 7542,5555),
                                                       (7, 4, 7532,4444),
                                                       (1, 4, 3456,4444));
                    
                implementation
                    
                {$R *.dfm}
                 
                function postincrement(var a: Integer): Integer; inline;
                begin
                  Result := a;
                  inc(a);
                end;
                 
                procedure TForm1.FirstOption(); // Вариант с дополнительным массивом индексов (удобен, если надо обращаться к результатам несколько раз)
                var i,t:Integer; b: array of Integer;
                begin
                    t:=0;
                    SetLength(b, Length(a));
                    StringGrid1.RowCount:=Length(a);
                    for i:=Low(a) to High(a) do
                      if a[i][2] = 4 then
                        b[postincrement(t)] := i;
                    if t > 0 then
                      for i := Low(b) to t + Low(b) - 1 do begin
                        StringGrid1.Cells[1,i + 1 - Low(b)] := IntToStr(a[b[i]][1]);
                        StringGrid1.Cells[2,i + 1 - Low(b)] := IntToStr(a[b[i]][4]);
                      end;
                end;
                    
                procedure TForm1.SecondOption(); // Вариант повторным просмотром (удобен при однократном решении)
                var i,t:Integer;
                begin
                    t:=0;
                    SetLength(b, Length(a));
                    StringGrid1.RowCount:=Length(a);
                    for i:=Low(a) to High(a) do
                      if a[i][2] = 4 then
                        inc(t);
                    if t > 0 then begin
                      t := 1;
                      for i := Low(a) to High(a) do if a[i][2] = 4 then begin
                        StringGrid1.Cells[1,t] := IntToStr(a[b[i]][1]);
                        StringGrid1.Cells[2,t] := IntToStr(a[b[i]][4]);
                        inc(t);
                      end;
                    end;
                end;
                    
                procedure TForm1.ThirdOption(); // Вариант вывода произвольного набора элементов (так же удобен при однократном решении, но позволяет дополнительно выбрать произвольный набор полей)
                const b: array [0 .. 1] of Integer = (1, 4);
                var i,j,t:Integer;
                begin
                    t:=0;
                    SetLength(b, Length(a));
                    StringGrid1.RowCount:=Length(a);
                    for i:=Low(a) to High(a) do
                      if a[i][2] = 4 then
                        inc(t);
                    if t > 0 then begin
                      j := 1;
                      for i := Low(a) to High(a) do if a[i][2] = 4 then begin
                        for t := Low(b) to High(b) do
                          StringGrid1.Cells[t + 1 - Low(b),j] := IntToStr(a[i][b[t]]);
                        inc(j);
                      end;
                    end;
                end;
                    
                procedure TForm1.FormShow(Sender: TObject);
                begin
                  // Каждая из них делает то что показано на картинке
                  FirstOption();
                  // SecondOption();
                  // ThirdOption();
                end;
                    
                end.
              Сообщение отредактировано: macomics -
                Только сейчас я стала понимать что мне нужно, поэтому буду дальше думать.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0414 ]   [ 18 queries used ]   [ Generated: 27.04.24, 12:54 GMT ]