Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 1
Регистрация: 05.10.2009
Сообщений: 19
1

StringGrid Сортировка рядов

05.11.2009, 22:59. Показов 1312. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Собственно задача - Есть StringGrid заполненный значениями Имя, Город, номер, и тд. Таблица то есть. Необходимо отсортировать по номеру. но естественно сортироваться должен не только столбец, а вся таблица. Привожу код процедуры что получилось сочинить (сортировка не касается 1 и последний строки, в 1 заголовки, последняя пустая):
Ранний вариант
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.Button10Click(Sender: TObject);
var
  rc,i,j,n_of_max: integer;
begin
if RadioButton4.Checked then
 for I:=1 to StringGrid1.RowCount-2 do
  begin
  rc:=StringGrid1.RowCount;
  n_of_max:=i;
  for j:=i+1 to StringGrid1.RowCount-2 do
    if (StringGrid1.cells[j,2]>StringGrid1.cells[n_of_max,2]) then n_of_max:=j;
        StringGrid1.Rows[rc]:=StringGrid1.Rows[i];
        StringGrid1.Rows[i]:=StringGrid1.Rows[n_of_max];
        StringGrid1.Rows[n_of_max]:=StringGrid1.Rows[rc];
        StringGrid1.Rows[rc].Clear;
  end;
end;
Более поздний
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Procedure TForm1.Button10Click(Sender: TObject);
var
i,j,n_of_max: integer;
begin
if RadioButton4.Checked then
 for I:=1 to StringGrid1.RowCount-2 do
  begin
  rc:=StringGrid1.RowCount;
  n_of_max:=i;
  for j:=i+1 to StringGrid1.RowCount-2 do
    if (StringGrid1.cells[j,2]>StringGrid1.cells[n_of_max,2]) then n_of_max:=j;
        StringGrid2.Rows[1]:=StringGrid1.Rows[i];
        StringGrid1.Rows[i]:=StringGrid1.Rows[n_of_max];
        StringGrid1.Rows[n_of_max]:=StringGrid2.Rows[1];
  end;
end;
Прошу помочь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2009, 22:59
Ответы с готовыми решениями:

Выделение мышью неполных рядов StringGrid на Delphi XE7
Ребята, подскажите. Суть проблемы наверное многим знакома. В StringGrid выделение происходит...

Stringgrid сортировка
Доброго времени суток! Есть заполненная таблица, в одном столбике из которой лежат числа вида ...

Сортировка Stringgrid
Возникла проблема с сортировкой Stringgrid unit Unit1; interface uses Windows,...

StringGrid сортировка
Доброго дня! Вот такая задача: Сведения о футбольных командах, участвующих в чемпионате мира:...

2
Retired
7727 / 2559 / 671
Регистрация: 17.10.2009
Сообщений: 5,100
05.11.2009, 23:13 2
Baka-kun, вот посмотрите пока пот эту статью из DRKB:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
unit olimp_;   
    
interface  
    
uses  
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,   
  Grids, StdCtrls;   
    
type  
  TForm1 = class(TForm)   
    Tabl: TStringGrid;   
    Button1: TButton;   
    Label1: TLabel;   
    procedure FormActivate(Sender: TObject);   
    procedure Button1Click(Sender: TObject);   
  private  
    { Private declarations }  
  public  
    { Public declarations }  
  end;   
    
var  
  Form1: TForm1;   
    
implementation  
    
{$R *.DFM}  
    
procedure TForm1.FormActivate(Sender: TObject);   
begin  
  tabl.Cells[0, 0] := 'Страна';   
  tabl.Cells[1, 0] := 'Золотых';   
  tabl.Cells[2, 0] := 'Серебряных';   
  tabl.Cells[3, 0] := 'Бронзовых';   
  tabl.Cells[4, 0] := 'Всего';   
  tabl.Cells[5, 0] := 'Баллов';   
  tabl.Cells[0, 1] := 'Австралия';   
  tabl.Cells[0, 2] := 'Белоруссия';   
  tabl.Cells[0, 3] := 'Великобритания';   
  tabl.Cells[0, 4] := 'Германия';   
  tabl.Cells[0, 5] := 'Италия';   
  tabl.Cells[0, 6] := 'Китай';   
  tabl.Cells[0, 7] := 'Корея';   
  tabl.Cells[0, 8] := 'Куба';   
  tabl.Cells[0, 9] := 'Нидерланды';   
  tabl.Cells[0, 10] := 'Россия';   
  tabl.Cells[0, 11] := 'США';   
  tabl.Cells[0, 12] := 'Франция';   
  tabl.Cells[0, 13] := 'Япония';   
end;   
    
procedure TForm1.Button1Click(Sender: TObject);   
var  
  c, r: integer; // номер колонки и строки таблицы   
  s: integer; // всего медалей у команды   
  p: integer; // очков у команды   
    
  m: integer; // номер строки с максимальным количеством очков   
  buf: array[0..5] of string; // буфер для обмена строк   
  i: integer; // номер строки используется во время сортировки   
    
begin  
  for r := 1 to tabl.rowcount do // обработать все строки   
  begin  
    s := 0;   
    // вычисляем общее кол-во медалей   
    for c := 1 to 3 do  
      if tabl.cells[c, r] <> '' then  
        s := s + StrToInt(tabl.cells[c, r])   
      else  
        tabl.cells[c, r] := '0';   
    // вычисляем количество очков   
    p := 7 * StrToInt(tabl.cells[1, r]) +   
      6 * StrToInt(tabl.cells[2, r]) +   
      5 * StrToInt(tabl.cells[3, r]);   
    
    // вывод результата   
    tabl.cells[4, r] := IntToStr(s); // всего медалей   
    tabl.cells[5, r] := IntToStr(p); // очков   
  end;   
    
  // сортировка таблицы по убыванию в соответствие   
  // с количеством баллов (по содержимому 5-ого столбца)   
  // сортировка методом выбора   
  for r := 1 to tabl.rowcount - 1 do  
  begin  
    m := r; // максимальный элемент - в r-ой строке   
    for i := r to tabl.rowcount - 1 do  
      if StrToInt(tabl.cells[5, i]) > StrToInt(tabl.cells[5, m]) then  
        m := i;   
    
    if r <> m then  
    begin // обменяем r-ую и m-ую строки таблицы   
      for c := 0 to 5 do  
      begin  
        buf[c] := tabl.Cells[c, r];   
        tabl.Cells[c, r] := tabl.Cells[c, m];   
        tabl.Cells[c, m] := buf[c];   
      end;   
    end;   
  end;   
end;   
    
end.
1
1 / 1 / 1
Регистрация: 18.11.2009
Сообщений: 35
17.03.2010, 15:38 3
Простите, что поднял старую тему. Хочу изменить данную программу таким образом. несколько групп есть, столбцы 4 столбца и столбец для среднего балла. Вроде все работало, но потом, что-то не так сделал и теперь ошибку выдает. "is not integer value"
сам код вот, подсчет среднего значения, где в комментариях присутствуют восклицательные знаки:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
procedure TForm1.FormActivate(Sender: TObject);
begin
     tabl.Cells[0,0]:='Группа';
     tabl.Cells[1,0]:='1 тур';
     tabl.Cells[2,0]:='2 тур';
     tabl.Cells[3,0]:='3 тур';
     tabl.Cells[4,0]:='4 тур';
     tabl.Cells[5,0]:='СР.Балл';
     tabl.Cells[0,1]:='401';
     tabl.Cells[0,2]:='402';
     tabl.Cells[0,3]:='403';
     tabl.Cells[0,4]:='404';
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
   c,r:integer; // номер колонки и строки таблицы
s:integer;  // всего медалей у команды
   p:real;   // очков у команды
 
   m:integer;   // номер строки с максимальным количеством очков
   buf:array[0..5] of string; // буфер для обмена строк
   i:integer;    // номер строки используется во время сортировки
 
begin
   for r:=1 to tabl.rowcount do // обработать все строки
   begin
      s:=0;
      // вычисляем общее кол-во медалей
          // вычисляем общее кол-во медалей
      for c:=1 to 3 do
          if tabl.cells[c,r] <> ''
             then s:=s+StrToInt(tabl.cells[c,r])
             else tabl.cells[c,r]:='0';
      // вычисляем среднее значение!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      p:=(StrToint(tabl.cells[1,r])+StrToint(tabl.cells[2,r])+StrToint(tabl.cells[3,r])+strtoint(tabl.Cells[4,r]))/4;
 
      // вывод результата
     // всего медалей
      tabl.cells[5,r]:=floatToStr(p); // очков
   end;
 
   // сортировка таблицы по убыванию в соответствие
   // с количеством баллов (по содержимому 5-ого столбца)
   // сортировка методом выбора
   for r:=1 to tabl.rowcount-1 do
   begin
       m:=r; // максимальный элемент - в r-ой строке
       for i:=r to tabl.rowcount-1 do
         if StrToInt(tabl.cells[5,i])>StrToInt(tabl.cells[5,m])
            then m:=i;
 
       if r <> m then
       begin // обменяем r-ую и m-ую строки таблицы
          for c:=0 to 5 do
             begin
                   buf[c]:=tabl.Cells[c,r];
                   tabl.Cells[c,r]:=tabl.Cells[c,m];
                   tabl.Cells[c,m]:=buf[c];
             end;
       end;
   end;
end;
end.
0
17.03.2010, 15:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2010, 15:38
Помогаю со студенческими работами здесь

Сортировка StringGrid
Добровго времени суток. Помогите зделать сортировку в StringGrig. Дается 5 столбцов. Надо сделать...

Сортировка StringGrid
Необходимо упорядочить строки матрицы по возрастанию их наибольших элементов. Всё работает, только...

Сортировка StringGrid
Сведения о комплектующих компьютера: -название устройства; -фирма изготовитель; -главная...

Сортировка в StringGrid
Сортировать данные по наименованию


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru