Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.03.2007, 11:44
MrBabols MrBabols вне форума
Прохожий
 
Регистрация: 01.03.2007
Сообщения: 12
Репутация: 10
По умолчанию сортировка таблицы

Привет! Подскажите, как сделать сортировку таблицы. Я вот написал, но что-то не работает.

procedure TForm2.Button9Click(Sender: TObject);
Var k,a,b,c,d,e,v,x,k1,a1,b1,c1,d1,e1,v1,x1,k2,a2,b2,c 2,d2,e2,v2,x2:string;
begin
with StringGrid1 do
begin
if Cells[7,1]<Cells[7,2] then
begin
k:=Cells[0,2];
Cells[0,2]:=Cells[0,1];
Cells[0,1]:=k;

a:=Cells[1,2];
Cells[1,2]:=Cells[1,1];
Cells[1,1]:=a;

b:=Cells[2,2];
Cells[2,2]:=Cells[2,1];
Cells[2,1]:=b;

c:=Cells[3,2];
Cells[3,2]:=Cells[3,1];
Cells[3,1]:=c;

d:=Cells[4,2];
Cells[4,2]:=Cells[4,1];
Cells[4,1]:=d;

e:=Cells[5,2];
Cells[5,2]:=Cells[5,1];
Cells[5,1]:=e;

v:=Cells[6,2];
Cells[6,2]:=Cells[6,1];
Cells[6,1]:=v;

x:=Cells[7,2];
Cells[7,2]:=Cells[7,1];
Cells[7,1]:=x;
end;

if Cells[7,2]<Cells[7,3] then
begin
k1:=Cells[0,2];
Cells[0,2]:=Cells[0,1];
Cells[0,1]:=k1;

a1:=Cells[1,2];
Cells[1,2]:=Cells[1,1];
Cells[1,1]:=a1;

b1:=Cells[2,2];
Cells[2,2]:=Cells[2,1];
Cells[2,1]:=b1;

c1:=Cells[3,2];
Cells[3,2]:=Cells[3,1];
Cells[3,1]:=c1;

d1:=Cells[4,2];
Cells[4,2]:=Cells[4,1];
Cells[4,1]:=d1;

e1:=Cells[5,2];
Cells[5,2]:=Cells[5,1];
Cells[5,1]:=e1;

v1:=Cells[6,2];
Cells[6,2]:=Cells[6,1];
Cells[6,1]:=v1;

x1:=Cells[7,2];
Cells[7,2]:=Cells[7,1];
Cells[7,1]:=x1;

if Cells[7,1]<Cells[7,3] then
begin
k2:=Cells[0,2];
Cells[0,2]:=Cells[0,1];
Cells[0,1]:=k2;

a2:=Cells[1,2];
Cells[1,2]:=Cells[1,1];
Cells[1,1]:=a2;

b2:=Cells[2,2];
Cells[2,2]:=Cells[2,1];
Cells[2,1]:=b2;

c2:=Cells[3,2];
Cells[3,2]:=Cells[3,1];
Cells[3,1]:=c2;

d2:=Cells[4,2];
Cells[4,2]:=Cells[4,1];
Cells[4,1]:=d2;

e2:=Cells[5,2];
Cells[5,2]:=Cells[5,1];
Cells[5,1]:=e2;

v2:=Cells[6,2];
Cells[6,2]:=Cells[6,1];
Cells[6,1]:=v2;

x2:=Cells[7,2];
Cells[7,2]:=Cells[7,1];
Cells[7,1]:=x2;
end;
end;


end;
end;
Ответить с цитированием
  #2  
Старый 18.03.2007, 21:55
MrBabols MrBabols вне форума
Прохожий
 
Регистрация: 01.03.2007
Сообщения: 12
Репутация: 10
По умолчанию

Ну чего, никто не знает что ли???
Ответить с цитированием
  #3  
Старый 19.03.2007, 10:39
Holy Holy вне форума
Новичок
 
Регистрация: 31.07.2006
Сообщения: 55
Репутация: 10
По умолчанию

Я не понял вопрос. Алгоритмов сортировки в Интернете тьма. Давай уточним, как именно ты хочешь сортировать?
1) Отсортировать записи по одному из полей;
2) Отсортировать колонки по имени;
4) Отсортировать все ячейки по вертикали;
5) Отсортировать все ячейки по горизонтали;
6) Отсортировать все ячейки по диагонали (своеобразная комбинация 4 и 5).

Зачем это нужно в твоем случае?
Ответить с цитированием
  #4  
Старый 19.03.2007, 14:19
MrBabols MrBabols вне форума
Прохожий
 
Регистрация: 01.03.2007
Сообщения: 12
Репутация: 10
По умолчанию

Смотри. Если StringCells[6,1]<StringCells[6,2], то мне нужно поменять их местами, а также строки, в которых находятся StringCells[6,1] и StringCells[6,2] соответственно. Потом их надо сравнить с StringCells[6,3].

Надеюсь понял.
Ответить с цитированием
  #5  
Старый 19.03.2007, 16:59
Holy Holy вне форума
Новичок
 
Регистрация: 31.07.2006
Сообщения: 55
Репутация: 10
По умолчанию

Вот набросал.
Принимает:
StringGrid - грид типа TStringGrid с данными;
RowIndx - номер строки, по которой выполнять сортировку;
StartCol - номер столбца, с которого начинается сортировка;
StopCol - номер столбца, на котором окончить сортировку;

Необходимо добавить проверки принимаемых значений и подумать о перестановке столбцов разом возможно через TStrings.

Код:
procedure Sort(var StringGrid: TStringGrid; RowIndx: Integer;
  StartCol, StopCol: Integer);
var
  Interval: Integer;
  i, j: Integer;
  Moved: Boolean; // пpизнак пеpестановки
  Str: AnsiString;
begin
  if StartCol > StopCol then
    Exit;

  // начальное значение интеpвала
  Interval := (StopCol - StartCol) div 2;

  // цикл с yменьшением интеpвала до 1
  while Interval > 0 do
  begin
    // пyзыpьковая соpтиpовка с интеpвалом
    // цикл, пока есть пеpестановки
    Moved := True;
    while Moved do
    begin
      Moved := False;

      for i := StartCol to StopCol - (1 + Interval) do
      begin
        if AnsiCompareText(StringGrid.Cells[i, RowIndx],
          StringGrid.Cells[i+Interval, RowIndx]) > 0 then
        begin
          // пеpестановка
          for j := 0 to StringGrid.RowCount - 1 do
          begin
            Str := StringGrid.Cells[i, j];
            StringGrid.Cells[i, j] := StringGrid.Cells[i+Interval, j];
            StringGrid.Cells[i+Interval, j] := Str;
          end;

          // пpизнак пеpестановки
          Moved := True;
        end;
      end;
    end;

    // yменьшение интеpвала
    Interval := Interval div 2;
  end;
end;
Ответить с цитированием
  #6  
Старый 19.03.2007, 17:43
MrBabols MrBabols вне форума
Прохожий
 
Регистрация: 01.03.2007
Сообщения: 12
Репутация: 10
По умолчанию

Спасибо! Но, если честно, то я мало чего понял!?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:29.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter