Показать сообщение отдельно
  #2  
Старый 31.05.2022, 23:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,799
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ой, ну это-то можно было и самому сделать.
Не оптимальный, но простой способ:
1. Пробегаемся по массиву регистрации и собираем список марок.
2. Второй шаг. Внешний цикл по списку марок, внутрений - по массиву регистраций. При совпадении занчения марки в обоих массивах/списках увеличиваем соотв. счетчик
3. Выводим результат.
Да, не оптимально, но понятно что делать.

Вот тут чуть более сложный, но более быстрый способ:
Код:
type
  TRegistrationInfo = record
    MakerName : String;
    LicPlate : String;
    OwnerName : String;
    InspectionDate : String; // Для простоты просто как строка
  end;

  TMakerInfo = record
    Name : String;
    Count : Integer;
  end;
  
var
  Src : Array Of TRegistrationInfo; // Это наши исходные данные в виде массива
  
procedure TForm1.Button1Click(Sender : TObject);
var
  MkrSum : Array Of TMAkerInfo;
  I, Idx : Integer;
  
  function GetIdx(S : String; A : Array Of TMakerInfo) : Integer;
  var
    I : Integer;
  begin
    Result := -1;
    For I := Low(A) To High(A) Do
      If A[i].Name = S Then
        Begin
          Result := I;
          Break;
        End;
  end;
  
begin
  SetLength(MkrSum,0);
  For I := Low(Src) To High(Src) Do
    Begin
      Idx := GetIdx(Src[i].MakerName,MkrSum);
      If Idx = -1 
        Then
          Begin
            SetLength(MkrSum,Length(MkrSum)+1);
            MkrSum[High(MkrSum)].Name := Src[i].MakerName;
            MkrSum[High(MkrSum)].Count := 1;
          End
        Else
          Begin
            MkrSum[Idx].Count := MkrSum[Idx],Count + 1;
          End;
    End;
    
  // Теперь собранную информацию выводим в грид    
  // Предполагаем, что грид настроен, заголовок существует и в гриде 2 столбца
  StringGrid2.RowCount := Length(MrkSum) + 1; // +1 - на заголовок
  For I := Low(MkrSum) To High(MkrSum) Do
    Begin
      StringGrid2.Cells[0,I+1] := MkrSum[i].Name;
      StringGrid2.Cells[1,I+1] := IntToStr(MkrSum[i].Count);
    End;
end;

PS. Можно при сборе информации "бежать" прямо по гриду (StringGrid1), но это будет чуть медленнее (на больших данных), т.к. при этом коду придется "разрешать" 2 ссылки, а по массиву идет прямая адресация.
Ответить с цитированием