Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка по столбцу, как в Excel 
V
    Опции темы
THandle
Дата 6.10.2008, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Цитата(Staruha @  6.10.2008,  10:00 Найти цитируемый пост)
Я сама поражаюсь как это происходит ,но Строка в мною приведенном коде сортируется Супер ,а именно по первой букве ,по второй,третьей и т.д.


При сравнении 

Код

if StringGrid1.Cells[1,k]>StringGrid1.Cells[1,k+1] then


Вызывается функция UStrCmp, которая и сравнивает эти строчки smile


MerCus, зачем нужен массив, когда можно свободно обойтись без него. Не устраивает мой пример, тем что он сортирует по первому столбцу? Но ведь не сложно его изменить так чтоб он сортировал по любому другому smile Массив, ИМХО, тут только лишний.
PM   Вверх
MerCus
Дата 7.10.2008, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



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

спасибо всем за ответы, извините, что я туплю)) но мне это очень надо сделать, а у меня не получается

Это сообщение отредактировал(а) MerCus - 7.10.2008, 00:59
PM MAIL   Вверх
Staruha
Дата 8.10.2008, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 1
Всего: 27



сортируем String .Массив как буфер для ячеек по столбцам
Код

procedure TForm1.Button3Click(Sender: TObject);
  var
 flag:boolean;
k,i:integer;
mi1:array[1..3] of String;
begin

  repeat
      flag:=false;
      for k := 1 to 6-1 do
  Begin
       if StringGrid1.Cells[1,k]>StringGrid1.Cells[1,k+1] then//если число,strtoint(String.....
     Begin
        for i := 1 to 3 do

      Begin

         mi1[i]:=StringGrid1.Cells[i,k];
        StringGrid1.Cells[i,k]:=StringGrid1.Cells[i,k+1];
         StringGrid1.Cells[i,k+1]:=mi1[i];
      end;
   flag:=true;
    end;
    end;
   until not flag;

   end;

end.



--------------------
Возмездие настигнет
PM MAIL   Вверх
THandle
Дата 8.10.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Код

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;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    procedure ShowArray;
    { Private declarations }
  public
    { Public declarations }
  end;

const
  ARRAY_SIZE = 5;

type
  TArray = array of array of Integer;

var
  Form1: TForm1;
  A: TArray;

implementation

{$R *.dfm}

procedure SortArray(var AArray: TArray; ANumber: Integer);

procedure Swap(AIndex1, AIndex2: Integer);
var
  I: Integer;
  Tmp: Integer;
begin
  for I := 0 to ARRAY_SIZE do
    begin
      Tmp := AArray[I, AIndex1];
      AArray[I, AIndex1] := AArray[I, AIndex2];
      AArray[I, AIndex2] := Tmp;
    end;
end;

procedure SwpNum;
  var
  I: Integer;
  Tmp: Integer;
begin
  for I := 0 to ARRAY_SIZE do
    begin
      Tmp := AArray[0, I];
      AArray[0, I] := AArray[ANumber, I];
      AArray[ANumber, i] := Tmp;
    end;
end;

procedure Sort;
var
  I, J: Integer;
begin
  for I := 0 to ARRAY_SIZE - 1 do
    for J := 0 to ARRAY_SIZE - 2 - I do
      if AArray[0, j] > AArray[0, j + 1] then
        Swap(J, J + 1);
end;

begin
  if not (ANumber in [0..ARRAY_SIZE - 1]) then
    Exit;
  SwpNum;
  Sort;
  SwpNum;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  J: Integer;
begin
  StringGrid1.ColCount := ARRAY_SIZE;
  StringGrid1.RowCount := ARRAY_SIZE;
  SetLength(A, ARRAY_SIZE, ARRAY_SIZE);
  for I := 0 to ARRAY_SIZE - 1 do
    for J := 0 to ARRAY_SIZE - 1 do
      A[I, J] := Random(10);
  ShowArray;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Number: Integer;
begin
  if TryStrToInt(Edit1.Text, Number) then
    SortArray(A, Number);
  ShowArray;
end;

procedure TForm1.ShowArray;
var
  I: Integer;
  J: Integer;
begin
  for I := 0 to StringGrid1.ColCount - 1 do
    for J := 0 to StringGrid1.RowCount - 1 do
      StringGrid1.Cells[I, J] := IntToStr(A[I, J]);
end;

end.


Это сообщение отредактировал(а) THandle - 8.10.2008, 19:19
PM   Вверх
Poseidon
Дата 8.10.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(MerCus @  6.10.2008,  00:46 Найти цитируемый пост)
сортировать надо через массив, а потом его просто вывести.

Я тебе об этом писал в самом начале:
Цитата(Poseidon @  3.10.2008,  09:03 Найти цитируемый пост)
Можно либо делать сортировку в ручную, запихивая всю таблицу в многомерный массив, либо использовать другой компонент. 


Короче, вы мне надоели. Простую задачку расжовываете уже вторую страницу. Вот код (единственное условие - в гриде должны быть ТОЛЬКО числовые значение, что, собственно, оговаривалось выше).

Код

procedure SortStgingGrid(var StringGrid: TStringGrid;
                         const SortCol: Integer);
var mas: array of array of Integer;
x, y, buf: Integer;
Changed: boolean;
begin
  SetLength(mas, StringGrid.ColCount, StringGrid.RowCount);
  for y:= StringGrid.FixedRows to StringGrid.RowCount-1 do
    for x:= 0 to StringGrid.ColCount-1 do
    mas[x,y]:= StrToInt(StringGrid.Cells[x,y]);

  repeat
    Changed:= False;
    for y:= StringGrid.FixedRows to StringGrid.RowCount-2 do
      if mas[SortCol, y] > mas[SortCol, y+1] then
        for x:= 0 to StringGrid.ColCount-1 do
        begin
          buf:= mas[x, y];
          mas[x, y]:= mas[x, y+1];
          mas[x, y+1]:= buf;
          Changed:= True;
        end;
  until not Changed;

  for y:= StringGrid.FixedRows to StringGrid.RowCount-1 do
    for x:= 0 to StringGrid.ColCount-1 do
    StringGrid.Cells[x,y]:=IntToStr(mas[x,y]);
end;


Сортируем StringGrid1 по 2 столбцу (в функцию передаем 1, т.к. в гриде отсчет начинается с 0).
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
  SortStgingGrid(StringGrid1, 1);
end;




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
THandle
Дата 8.10.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Poseidon, первая строка у тебя вроде как не сортируется...

Кстати, чем мой код не устроил?
PM   Вверх
Poseidon
Дата 8.10.2008, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(THandle @  8.10.2008,  14:22 Найти цитируемый пост)
Poseidon, первая строка у тебя вроде как не сортируется...
Это от чего же?

Цитата(THandle @  8.10.2008,  14:22 Найти цитируемый пост)
чем мой код не устроил?
Чесно? Много букафффф smile Если ради одной сортировки делать глобальную переменную, обьявлять новый тип, да еще саму сортировку разбивать на 3 процедуры, то даже страшно будеть посмотреть на весь проект. А еще не нравится мне, что твоя сортировка привязана к ARRAY_SIZE. Т.е. ее не применишь для двух разных гридов. Мало того, ее не применишь для не "квадратных" гридов. Да и боюсь даже заикаться про фиксированные строки, которые де-факто не должны участвовать в сортировке (они на то и фиксированные).



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
MerCus
Дата 9.10.2008, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



Всем спасибо за помощь! всё работает, всё понял))) 
PM MAIL   Вверх
THandle
Дата 9.10.2008, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



MerCus, помечай тему как решенную.

Poseidon, не убедил)) у меня пример - пусть человек разбирается. У тебя готовое решение. Что лучше. Конечно же 1.  smile В любом случае получай плюс за потраченное время и помощь ТС.
PM   Вверх
Staruha
Дата 9.10.2008, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 1
Всего: 27



А мой код чем плох? Он такой маленький а сортирует не хуже ваших. smile 


--------------------
Возмездие настигнет
PM MAIL   Вверх
Poseidon
Дата 9.10.2008, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(THandle @  9.10.2008,  02:02 Найти цитируемый пост)
у меня пример - пусть человек разбирается. У тебя готовое решение. Что лучше. Конечно же 1.
...и не поспоришь...

Добавлено через 14 минут и 35 секунд
Цитата(Staruha @  9.10.2008,  08:01 Найти цитируемый пост)
А мой код чем плох? Он такой маленький а сортирует не хуже ваших.
Ну... сама спросила smile :
  • Что если передаем таблицу отличную от размера 4х6 ?
  • Может я и придираюсь, но форматирование кода ужастное smile
  • Про фиксированные строки писать..?
  • Привязка к конкретному гриду
Это я, конечно, уже придираюсь. Если серьезно, то нормальный код. А если еще учесть что это пример, а не готовое решение, то сойдет smile



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0753 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.