Ой, ну это-то можно было и самому сделать.
Не оптимальный, но простой способ:
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 ссылки, а по массиву идет прямая адресация.