![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте.
Есть StringGrid1 и в нем есть колонки КолA, КолB, кол-во повторов по строкам (см. вложения). Необходимо сделать: 1. сравнение по строкам, т.е. встречается ли пара StringGrid1.Cells[0,i], StringGrid1.Cells[1,i] 2. удалить повторы 3. вывести кол-во повторов Код:
procedure TForm1.Button2Click(Sender: TObject);
var
kolvoAB, AllAB: array of integer;
i,j,k,kolAB, n: integer;
begin
n:=StringGrid1.RowCount;
SetLength(AllAB,n);
SetLength(kolvoAB,n);
for i:=1 to n do
begin
AllAB[i]:= StrToInt(StringGrid1.Cells[0,i]+StringGrid1.Cells[1,i]);
end;
i:=1;
while i <= n do
begin
kolAB:=1;
j:=i+1;
while j <= n do
begin
if AllAB[i]=AllAB[j] then
begin
for k:=j to n-1 do AllAB[k]:=AllAB[k+1];
kolAB:=kolAB+1;
n:=n-1;
end
else j:=j+1;
end;
kolvoAB[i]:=kolAB;
i:=i+1;
end;
StringGrid1.RowCount:=n;
for i := 1 to n do
StringGrid1.cells[2,i]:=IntToStr(kolvoAB[i]);
end;Проблема заключается в том, что 1.ошибка "Invalid pointer operation" выскакивает на 33-й строке и данные до конца не отображаются 2.Как решить задачу, если массив AllAB это массив чисел int64 Последний раз редактировалось royun, 28.01.2014 в 07:16. |
|
#2
|
|||
|
|||
|
Исправил код и заработало:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
AllAB: array of int64;
kolvoAB: array of integer;
i,j,k,kolAB, n: integer;
begin
n:=StringGrid1.RowCount;
SetLength(AllAB,n);
SetLength(kolvoAB,n);
for i:=1 to n-1 do
begin
AllAB[i]:= StrToInt64(StringGrid1.Cells[0,i]+StringGrid1.Cells[1,i]);
end;
i:=1;
while i <= n do
begin
kolAB:=1;
j:=i+1;
while j <= n do
begin
if AllAB[i]=AllAB[j] then
begin
for k:=j to n-1 do AllAB[k]:=AllAB[k+1];
kolAB:=kolAB+1;
n:=n-1;
end
else j:=j+1;
end;
kolvoAB[i]:=kolAB;
i:=i+1;
end;
StringGrid1.RowCount:=n;
for i := 1 to n-1 do
StringGrid1.cells[2,i]:=IntToStr(kolvoAB[i]);
KolvoAB:=nil;
AllAB:=nil;
end;Если цифры в колонках 10-значные то вываливается ошибка "is not valid integer value" и это понятно: 20-значное число выходит за рамки int64. Я понимаю что механизм сравнения у меня неправильный. И хотел бы послушать Ваши предложения. |
|
#3
|
||||
|
||||
|
Цитата:
Код:
var AllAB: array of String; Код:
type
TTwoCols = record
Col1, Col2: Int64;
end;
var
AllAB: array of TTwoCols;Цитата:
|
|
#4
|
|||
|
|||
|
Если вдруг кому-то поможет. Вот решение:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
TS : TStringList;
i, indexS : integer;
begin
TS := TStringList.Create;
for i:=1 to StringGrid1.RowCount-1 do begin
indexS := TS.IndexOf(StringGrid1.Cells[2,i]);
if indexS<0 then begin {ещё не было такой строки, добавляем}
TS.AddObject(StringGrid1.Cells[2,i], TObject(1));
end
else {такое значение уже было ранее, увеличим счётчик на 1}
TS.Objects[indexS] := TObject(Integer(TS.Objects[indexS])+1);
end;
StringGrid2.RowCount := TS.Count+1;
for I := 0 to TS.Count - 1 do begin
StringGrid2.Cells[0,i+1] := IntToStr(i+1);
StringGrid2.Cells[1,i+1] := TS.Strings[i];
StringGrid2.Cells[2,i+1] := IntToStr( Integer(TS.Objects[i]));
end;
FreeAndNil(TS);
end; |
|
#5
|
||||
|
||||
|
Цитата:
Код:
TS.Sorted := True; Цитата:
Цитата:
![]() |
|
#6
|
|||
|
|||
|
Цитата:
StringGrid1.Cells[1,i]:=StringGrid1.Cells[2,i]+'='+StringGrid1.Cells[3,i] Вот в таком виде решение полное. Последний раз редактировалось royun, 29.01.2014 в 16:29. |