![]() |
|
|
Регистрация | << Правила форума >> | 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. |