Помощь - Поиск - Пользователи - Календарь
Полная версия: StringGrid сортировка
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Alucard
var
Form1: TForm1;
i,j:integer;
implementation

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
with StringGrid1 do
for i:=0 to ColCount -1 do
for j:=0 to RowCount -1 do
cells[i,j]:=inttostr(random(50)+1);
end;

procedure TForm1.Button2Click(Sender: TObject);
var temp:integer;
begin
with StringGrid1 do
for i:=1 to ColCount -1 do
for j:=0 to RowCount -1 do
if StrToInt(cells[i,j])>StrToInt(cells[i-1,j]) then
begin
temp:=StrToInt(cells[i-1,j]);
cells[i-1,j]:=cells[i,j];
cells[i,j]:=IntToStr(temp);
end;
end;

begin
randomize;
end.



Код для стрингрида и двух кнопок. Первая формирует, вторая сортирует по убыванию

Помогите плиз:
1.сортировка происходит с шагом на одну клетку, как сделать что бы они выстроились в нужную последовательность после 1 нажатия?
2. нужно сосчитать сумму чисел в строке и выстроить строки по возрастанию этого самого числа
volvo
Цитата
Первая формирует, вторая сортирует по убыванию
ЧТО формирует? ЧТО сортирует? По убыванию ЧЕГО? Ты б хоть пример приводил, что ожидать-то от кода, а то были одни числа, потом раз - поменялись напрочь на другие. И чего это было?

Тебе чего надо-то?

Update
Объясняю:
ДО:
Нажмите для просмотра прикрепленного файла

ПОСЛЕ:
Нажмите для просмотра прикрепленного файла

Внимание - вопрос, по какому критерию "отсортирован" грид?
volvo
А в ответ - тишина unsure.gif

С использованием минимальных возможностей Дельфи сортировка элементов строк Grid-а по убыванию пишется так:
function mySort(List: TStringList; first, second: Integer): Integer; // это функция сортировки
function f(index: integer): integer;
begin result := StrToInt(List.Strings[index]) end;
begin
result := f(second) - f(first)
end;

procedure TForm1.Button12Click(Sender: TObject);
var
ts: TStringList;
i: integer;
begin
ts := TStringList.Create;
try
with StringGrid1 do
begin
for i := 0 to RowCount - 1 do
begin
ts.Assign(Rows[i]); // Получаем элементы очередной строки
ts.CustomSort(mySort); // сортируем их как числа по убыванию
Rows[i].Assign(ts); // возвращаем назад в Грид
end;
end;
finally
ts.Free;
end;
end;
Alucard
volvo
Первой кнопкой формируем массив рандомных чисел, второй кнопкой сортируем построчно в порядке убывания, тесть первый элемент строки - самая большая цифра этой строки, а последняя - самая маленькая. На кнопку сортировки надо нажать несколько раз, что бы цыфры переползли на свое место.

у меня не получается найти сумму элементов строки грида, а именно синтаксис обращения к гриду. Если в массиве:
var m,i:integer;
a:array[1..5] of integer;

for i:=1 to 5 do
m:=m+a[i];

прокатывал, то
m:=m+StrToInt(cells[i]);


ни в какую не хочет

Когда будет найдена сумма всех 5 строк грида, нужно выстроить строки в порядке возрастания (первая строка с самой маленькой суммой, последняя самой большой)
Client
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;

type
TForm2 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
a=array [1..5] of integer;
m=array [1..5] of a;
const
n=5;

var
Form2: TForm2;
mas:m;

implementation

{$R *.dfm}

procedure refreshtable;
var
i,j:byte;
begin
for I := 1 to n do
for j := 1 to n do
form2.StringGrid1.Cells[j-1,i-1]:=inttostr(mas[i,j]); // тут укажи свою форму
end;

procedure TForm2.Button1Click(Sender: TObject);
var
i,j:byte;
s:integer;
begin
for I := 1 to n do begin
s:=0;
for j := 1 to n do begin
mas[i,j]:=Random(100);
s:=s+mas[i,j];
end;
StringGrid1.Cells[5,i-1]:=inttostr(s);
end;
refreshtable;
end;


procedure TForm2.Button2Click(Sender: TObject);
var
i,j:byte;
s:string;
k:a;
begin
for I := 1 to 4 do
for j := 1 to n-i do
if (strtoint(StringGrid1.Cells[5,j]) < strtoint(stringGrid1.Cells[5,j-1])) then begin
k:=mas[j];
mas[j]:=mas[j+1];
mas[j+1]:=k;
s:=StringGrid1.Cells[5,j-1];
StringGrid1.Cells[5,j-1]:=StringGrid1.Cells[5,j];
StringGrid1.Cells[5,j]:=s;
end;
refreshtable;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
Randomize;
end;

end.
На форме стринггрид и 2 кнопки.
Еще надо отсорировать сами строки...
volvo
Цитата
у меня не получается найти сумму элементов строки грида
Блин... Вы чего, издеваетесь? Как ЭТО связано с заданием
Цитата
второй кнопкой сортируем построчно в порядке убывания, тесть первый элемент строки - самая большая цифра этой строки, а последняя - самая маленькая.
? Вот где здесь, в задании, сказано что-то про какую-то сумму? Процитируй мне это, может у меня что-то с глазами? Ощущение создается такое, что ты сам не знаешь, чего тебе надо. Ты мой код смотрел? Запускал? Он делает в точности то, что написано во второй моей цитате. Нет, блин, тебе теперь какую-то сумму приплести понадобилось. Задание сформулируй как положено, безо всяких виляний, потом будем дальше разговаривать.

Ссылка в тему: Сага о X, Y и Z...
Alucard
Цитата
? Вот где здесь, в задании, сказано что-то про какую-то сумму? Процитируй мне это, может у меня что-то с глазами?

Не хочу тебя расстраивать, но...
Цитата
Код для стрингрида и двух кнопок. Первая формирует, вторая сортирует по убыванию

Помогите плиз:
1.сортировка происходит с шагом на одну клетку, как сделать что бы они выстроились в нужную последовательность после 1 нажатия?
2. нужно сосчитать сумму чисел в строке и выстроить строки по возрастанию этого самого числа



Client
СПАСИБО

А можно обойтись без массива в этом задании? Все операции сделать в стринггриде? Это ведь тоже массив

Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  a=array [1..5] of integer;
  m=array [1..5] of a;
const
  n=5;
var
  Form1: TForm1;
  mas:m;

implementation

{$R *.dfm}

procedure refreshtable;
var
  i,j:byte;
begin
  for i:= 1 to n do
    for j:= 1 to n do
      Form1.StringGrid1.Cells[j-1,i-1]:=IntToStr(mas[i,j]);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:byte;
  s:integer;
begin
  for i:= 1 to n do
    begin
      s:=0;
      for j:= 1 to n do
        begin
          mas[i,j]:=Random(50)+1;
          s:=s+mas[i,j];
        end;
      StringGrid1.Cells[5,i-1]:=IntToStr(s);
    end;
  refreshtable;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  i,j:byte;
  s:string;
  k:a;
begin
  for i := 1 to 4 do
    for j := 1 to n-i do
      if (StrToInt(StringGrid1.Cells[5,j]) < StrToint(StringGrid1.Cells[5,j-1])) then
       begin
        k:=mas[j];
        mas[j]:=mas[j+1];
        mas[j+1]:=k;
        s:=StringGrid1.Cells[5,j-1];
        StringGrid1.Cells[5,j-1]:=StringGrid1.Cells[5,j];
        StringGrid1.Cells[5,j]:=s;
      end;
    refreshtable;
end;

procedure TForm1.Button2Click(Sender: TObject);
var temp,i,j:byte;
begin
  for i:=1 to n do
      for j:=0 to n do
      if mas[i,j]>mas[i-1,j] then
        begin
          temp:=mas[i-1,j];
          mas[i-1,j]:=mas[i,j];
          mas[i,j]:=temp;
        end;
    refreshtable;
end;
end.


Что то не так с последней процедурой
Client
если убрать массив, то придется работать с StringGrid1.Cells[] постоянно.
volvo
Цитата
Что то не так с последней процедурой
Вылет за границу массива - достаточно веская причина, чтоб было "не так"?

Раз:
type
a=array [1..5] of integer;
m=array [1..5] of a;
const
n=5;
var
Form1: TForm1;
mas:m; // <--- То есть, mas: array[1 .. 5] of array[1 .. 5] of integer ?

// Тогда здесь ...
procedure TForm1.Button2Click(Sender: TObject);
var temp,i,j:byte;
begin
for i:=1 to n do
for j:=0 to n do
if mas[i,j]>mas[i-1,j] then // <--- №1
begin
temp:=mas[i-1,j]; // <--- №2
mas[i-1,j]:=mas[i,j]; // <--- №3
mas[i,j]:=temp;
end;
refreshtable;
end;

... при i = 1 будет вылет за пределы массива. Чтобы увидеть это - даже запускать программу не надо, оно на поверхности лежит...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.