Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
1 / 1 / 2
Регистрация: 19.08.2011
Сообщений: 60
1

Сравнение колонок StringGrid по строкам

28.01.2014, 06:57. Показов 1216. Ответов 7
Метки нет (Все метки)

Здравствуйте.
Есть StringGrid1 и в нем есть колонки КолA, КолB, кол-во повторов по строкам (см. вложения). Необходимо сделать:

1. сравнение по строкам, т.е. встречается ли пара StringGrid1.Cells[0,i], StringGrid1.Cells[1,i]
2. удалить повторы
3. вывести кол-во повторов

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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" выскакивает на строке и данные до конца не отображаются
2.Как решить задачу, если массив AllAB это массив чисел int64
Миниатюры
Сравнение колонок StringGrid по строкам   Сравнение колонок StringGrid по строкам  
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2014, 06:57
Ответы с готовыми решениями:

Рассчитать ширину колонок с учетом ScrollBar в StringGrid на всю ширину StringGrid
Здравствуйте, Требуется в StringGrid-ах автоматически рассчитать ширину колонок - что бы не было...

Поиск по строкам в StringGrid
Помогите пожалуйста сделать программу, не сделать поиск по строкам Дан текстовый файл....

StringGrid изначальное название колонок
Можно ли на этапе дизайна сделать таблицу из StringGrid, и некоторые столбцы и колонки озаглавить....

Непонятки с шириной колонок у StringGrid
Здравствуйте еще раз) Перелез с Delphi 7 на Delphi 10 Seattle и никак не могу понять как сделать...

7
1 / 1 / 2
Регистрация: 19.08.2011
Сообщений: 60
28.01.2014, 08:02  [ТС] 2
Исправил код и заработало:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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.
Я понимаю что механизм сравнения у меня неправильный. И хотел бы послушать Ваши предложения.
0
Модератор
3476 / 2600 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
28.01.2014, 09:08 3
Зачем вообще ячейки в int64 переводить? Сразу строки сравнивать нельзя что ли?
0
1 / 1 / 2
Регистрация: 19.08.2011
Сообщений: 60
28.01.2014, 09:18  [ТС] 4
Можно. В том-то и дело что не могу додуматься. Прошу Вас показать мне как это сделать для моего случая.
0
Модератор
3476 / 2600 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
28.01.2014, 09:38 5
Delphi
1
2
3
4
//
  if (StringGrid1.Cells[0,i] = StringGrid1.Cells[0,j]) and
     (StringGrid1.Cells[1,i] = StringGrid1.Cells[1,j]) then
    <строки равны>
0
1 / 1 / 2
Регистрация: 19.08.2011
Сообщений: 60
29.01.2014, 09:31  [ТС] 6
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

Если вдруг кому-то поможет. Вот решение:


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;
0
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 382
11.02.2014, 09:04 7
Цитата Сообщение от FIL Посмотреть сообщение
Delphi
1
2
3
4
//
  if (StringGrid1.Cells[0,i] = StringGrid1.Cells[0,j]) and
     (StringGrid1.Cells[1,i] = StringGrid1.Cells[1,j]) then
    <строки равны>
Вопрос такой, по такому принципу и колонки сравнивать между собой можно?

Пример:
У меня StringGrid, в него записываются массив, в столбик.

5;6;4;4;6;
4;8;2;7;8;
1;2;8;9;3;
1;5;7;5;6;
1;8;7;9;8;
как мне сделать, чтобы каждый следующий столбик, который добавляется в StringGrid сравнивался со всеми (от начала до конца), и если он повторился с каким-то из них, то просто его не вставлял. Как это можно организовать?
Спасибо!
0
Модератор
3476 / 2600 / 740
Регистрация: 19.09.2012
Сообщений: 7,966
11.02.2014, 11:23 8
Цитата Сообщение от PierL Посмотреть сообщение
Как это можно организовать?
Можно так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  with StringGrid1 do
  begin
    for i := 0 to RowCount - 1 do
      Rows[i].Delimiter := ';';
 
    Rows[0].DelimitedText := '5;6;4;4;6;';
    Rows[1].DelimitedText := '4;8;2;7;8;';
    Rows[2].DelimitedText := '1;2;8;9;3;';
    Rows[3].DelimitedText := '1;5;7;5;6;';
    Rows[4].DelimitedText := '1;8;7;9;8;';
  end;
 
  Edit1.Text := '1;8;7;9;8';
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  with StringGrid1 do
  begin
    for i := 0 to RowCount - 1 do
      if Rows[i].DelimitedText = Edit1.Text then
      begin
        ShowMessage('Такая запись уже есть!');
        Exit;
      end;
    RowCount := RowCount + 1;
    Rows[RowCount - 1].Delimiter := ';';
    Rows[RowCount - 1].DelimitedText := Edit1.Text;
  end;
end;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2014, 11:23

StringGrid динамическая ширина колонок
День добрый! Скажите, можно ли как-то установить, чтобы ширина столбцов StringGrid менялась по...

Сравнение колонок на странице
Здравствуйте! От души поставлю Like за помощь На страничке Excel 2016 Есть 2 колонки А и B, в...

Сравнение колонок в TStringGrid
Доброго времени суток. Программа считывает два excel файла в стринггриды, надо сделать сравнение и...

StringGrid как изменить шрифт колонок
Не всех колонок, а только верхних, есть таблица StringGrid1-&gt;Cells, как изменить шрифт у верхних...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.