Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Сортировка в TStringGrid


Автор: VanClivern 5.12.2007, 05:38
День добрый, господа. 
Вновь обращаюсь к Вам за советом. Значится так:
Имеется TStrinGgrid (6x5). Забиваю туда данные. Нажимаю на кнопочку и, по идее, должна открыться форма с этой же таблицей, но уже отсортированной по некоторому полю. Если же поля одинаковы, то сортировка идет по соседнему. Поля пости все числовые, за исключением 1-го - текст. 

Код

form3.ta.Cells[0,1] := ta.Cells[0,1];
form3.ta.Cells[1,1] := FloatToStr(pro1);
form3.ta.Cells[2,1] := FloatToStr(zab1);
form3.ta.Cells[3,1] := FloatToStr(d1);

form3.ta.Cells[0,1] := ta.Cells[0,2];
form3.ta.Cells[1,1] := FloatToStr(pro2);
form3.ta.Cells[2,1] := FloatToStr(zab2);
form3.ta.Cells[3,1] := FloatToStr(d2);

и т.д.

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

Автор: pavelv 5.12.2007, 06:10
Просто методы чтоли? Ну можно пузырьком, квиксорт, пирамидальная. Если по времени проблем нет бери первый вариант и не грей мозг. Заносишь все твои значения в массив, сортируешь, затем отчищаешь StringGrid и заново данные заносишь. Кстати думаю давно есть компонеты, чтобы после нажатия на колонку сортировка автоматически проводилась 

Автор: VanClivern 5.12.2007, 06:44
Цитата

Просто методы чтоли?...Заносишь все твои значения в массив, сортируешь, затем отчищаешь StringGrid и заново данные заносишь


А можно код? Пожалуйста.  smile 

Цитата

Кстати думаю давно есть компонеты, чтобы после нажатия на колонку сортировка автоматически проводилась  


Интересно было бы с ними ознакомиться. 

Автор: Poseidon 5.12.2007, 15:26
Цитата(VanClivern @  5.12.2007,  06:44 Найти цитируемый пост)
Интересно было бы с ними ознакомиться. 
 VirtualTreeView

Автор: Lexicss 5.12.2007, 21:23
Цитата(VanClivern @  5.12.2007,  06:44 Найти цитируемый пост)
А можно код? Пожалуйста. 

Пожалуйста. Здесь, например, метод пузырька - http://read.excode.ru/art4490p1.html

Автор: VanClivern 6.12.2007, 08:10
Спасибо за помощь. Вот поглядите. Код отрыл:

Procedure GridSort(StrGrid: TStringGrid; NoColumn: Integer);   
Var
    Line, PosActual: Integer;
    Row,Renglon: TStrings;
    begin
 Renglon := TStringList.Create;
    For Line := 1 to StrGrid.RowCount-1 do
  Begin   
    PosActual := Line;
    Row.Assign(TStringlist(StrGrid.Rows[PosActual]));
    While True do   
    Begin   
      If (PosActual = 0) Or (StrToInt(Row.Strings[NoColumn-1]) >=   
          StrToInt(StrGrid.Cells[NoColumn-1,PosActual-1])) then   
        Break;   
      StrGrid.Rows[PosActual] := StrGrid.Rows[PosActual-1];   
      Dec(PosActual);   
    end;   
    If StrToInt(Row.Strings[NoColumn-1]) < StrToInt(StrGrid.Cells[NoColumn-1,PosActual]) then   
      StrGrid.Rows[PosActual] := Row;
    Renglon.free;    
  end;
  end;

Вставляю процедуру в код.
Вызываю ее:
procedure TForm1.Button5Click(Sender: TObject);
begin
gridsort(form3.Ta,3);
end;
и Вылезает ошибка такого содержания:
Accses violation at adress и т.д.
Чего делать ума не приложу. Пожалуйста присоветуйте чего. 
Мне сдаваться завтра.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)