Как сделать сортировку в stringgrid

Обновлено: 04.07.2024

procedure TForm9.SgSort(aSg : TStringGrid; const aCol : Integer);
var
SlSort, SlRow : TStringList;
i, j : Integer;
begin
SlSort := TStringList.Create;
for i := aSg.FixedRows to aSg.RowCount - 1 do begin
SlRow := TStringList.Create;
SlRow.Assign(aSg.Rows[i]);
SlSort.AddObject(aSg.Cells[aCol, i], SlRow);
end;
SlSort.Sort;
j := 0;
for i := aSg.FixedRows to aSg.RowCount - 1 do begin
SlRow := Pointer(SlSort.Objects[j]);
aSg.Rows[i].Assign(SlRow);
SlRow.Free;
Inc(j);
end;
SlSort.Free;
end;

Видите строку SlSort.Sort; ? Это сортировка и есть.

Смотрите, как умеет сортировать TStringList.Sort . Может, по убыванию и не. (А почему TStringList ? Потому что раньше SlSort := TStringList.Create; .)

Видите строку SlSort.Sort; ? Это сортировка и есть.

Смотрите, как умеет сортировать TStringList.Sort . Может, по убыванию и не. (А почему TStringList ? Потому что раньше SlSort := TStringList.Create; .)

Вижу. ну и что из этого? как сделать,что сортировалось в обратном порядке данному?

Последний раз редактировалось arseniiv 24.05.2013, 00:16, всего редактировалось 2 раз(а).


Посмотрите в справке. Возможно, у TStringList есть свойство, указывающее порядок сортировки. Возможно, метод принимает соответствующий параметр.


Посмотрите в справке. Возможно, у TStringList есть свойство, указывающее порядок сортировки. Возможно, метод принимает соответствующий параметр.

Надо вызвать функцию CustomSort, которая на вход принимает ссылку на вашу собственную функцию сравнения. В этой своей функции сравнения вы можете наколбасить все, что угодно.

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Репутация: 0

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

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

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

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

Update
Объясняю:
ДО:

Внимание - вопрос, по какому критерию "отсортирован" грид?

А в ответ - тишина

С использованием минимальных возможностей Дельфи сортировка элементов строк Grid-а по убыванию пишется так:

Репутация: 0

volvo
Первой кнопкой формируем массив рандомных чисел, второй кнопкой сортируем построчно в порядке убывания, тесть первый элемент строки - самая большая цифра этой строки, а последняя - самая маленькая. На кнопку сортировки надо нажать несколько раз, что бы цыфры переползли на свое место.

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

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

Репутация: 20

второй кнопкой сортируем построчно в порядке убывания, тесть первый элемент строки - самая большая цифра этой строки, а последняя - самая маленькая.

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

Репутация: 0

? Вот где здесь, в задании, сказано что-то про какую-то сумму? Процитируй мне это, может у меня что-то с глазами?

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

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

Client
СПАСИБО

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

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;

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]) 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.

Что то не так с последней процедурой

в общем есть таблица StringGrid с 1 столбцом, нужно отсортировать по возрастанию.
пытался сделать самостоятельно, что приводило либо к ошибке либо к зависанию программы.
столбец заполнен числами.
прошу обьяснить как можно более понятно.
заранее спасибо.

в общем есть таблица StringGrid с 1 столбцом, нужно отсортировать по возрастанию.
пытался сделать самостоятельно, что приводило либо к ошибке либо к зависанию программы.
столбец заполнен числами.
прошу обьяснить как можно более понятно.
заранее спасибо.


надо приводить код, а так мы фиг догадаемся, что ты там натворил .

(i в глобальных переменных)

по нажатию Button2 все числа в StringGrid1 (там столбец высотой 100 строк) должны упорядочиться по возрастанию. будут использоваться как действительные так и реальные числа.
использоваться они будут в раздельных StringGrid так что прошу уточнить что изменяется (в том случае если по какой то причине код различается)
заранее спасибо

TStringList *lst = new TStringList;
lst->Assign(StringGrid1->Cols[0]);
lst->Sort();
StringGrid1->Cols[0]->Assign(lst);
delete lst;

спасибо все работает

еще одну вещь надо сделать.
надо подсчитать сколько раз повторяется каждое число в этой выборке и вывести в StringGrid2 (2 столбца несколько строк)

← →
rank ( 2002-05-13 05:29 ) [0]

Есть Stringgrid в несколько строк и 4 столбца, содержимое пишется в файл и читается при старте программы, но сортировать в файле очень неудобно(строки и столбцы там перемешены). Слышал что возможно использование класса TStringList где есть св-во Sorted ,но как это все использовать не пойму. Буду рад любому совету.

← →
Song ( 2002-05-13 08:39 ) [1]

В TStringList Вы можете обработать только одну колонку. Остальные придётся сопоставлять.

← →
Song ( 2002-05-13 08:44 ) [2]

есть способ где-то видел. Если у Вас не получится - поищу.

← →
Толик ( 2002-05-13 10:17 ) [3]

А чем QuickSort не подходит? Там можно задавать совершенно произвольные условия сортировки, хоть по одной колонке, хоть по десяти сразу. Заполнить список, да и сортировать его себе на здоровье.

← →
rank ( 2002-05-14 03:30 ) [4]

Ребят, а где взять этот QuickSort?

← →
BAHO ( 2002-05-14 05:57 ) [5]

Попробуй для каждой колонки отдельный файл создавать
где строки в формате (текст в колонке=заголовок строки)
теперь можно организовать сортировку в файле заголовков
и при выводе текста присваивать определённой строке свой текст
типа:

файл заголовков:
aaa
bbb
ccc

файл первой колонки:
xxx=aaa //текст в колонке = заголовок строки
yyy=bbb
zzz=ccc

файл второй колонки:
uuu=aaa
iii=bbb
ooo=ccc

и вывод текста:

for i:=0 .
if заголовок строки = strings.value[strings.name[i]]
then .

← →
MBo ( 2002-05-14 07:14 ) [6]

Вопрос пока что непонятен.

← →
Толик ( 2002-05-14 10:44 ) [7]

QuickSort - ф-я из Classes.pas (см. исходники). Либо можно воспользоваться классом TList, его сортировка напрямую использует эту ф-ю. Короче, технология примерно такая:

procedure StringGrodSort(const SG: TStringGrid);
function Compare(Item1, Item2: pointer): longint;
begin
0 если строка Item1 > Item2
А вот что значит "больше" или "меньше" решайте сами: доступ к ячейкам StringGrid"а есть.>
end;
var
i: longint;
begin
with(TList.Create())do begin
try
Count := SG.RowCount;
for i := 0 to Count - 1 do
Add(pointer(i));//заполняем массив номерами строк
Sort(@Compare);
finally
Free();//удаляем TList
end;
end;
end;

← →
Бурундук ( 2002-05-14 11:51 ) [8]

Можно так:

function TForm1.RowLess(i, j: Integer): Boolean;
begin
Result := CompareText(SGrid.Cells[SortCol, i], SGrid.Cells[SortCol, j]) 0 do
begin
k:=t div 2;
if not Less(k, t) then t:=0 else
begin
Swap(k, t); t:=k;
end;
end;
i:=i+1;
until not(i -1 do
begin
k:=2*t;
if k>i then t:=-1 else
begin
if k =0);
end;

← →
Толик ( 2002-05-14 12:21 ) [10]

В догонку к своему примеру: забыл добавить, что после сортировки TList"а надо привести в соотв. с ним StringGrid, т.е. пройтись по TList"у и поменять местами строки в StringGrid"е. Например в TList"е Item[0] = 2, значит в Grid"е в строку с индексом 0 нужно поставить строку с индексом 2 и т.д. Это напоминает поиск по индексу в базе данных.

← →
Song ( 2002-05-14 14:17 ) [11]

rank © (13.05.02 05:29)
Напиши на почту. Пришлю, чтоб не мучался *))

Читайте также: