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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.05.2012, 12:03
gamezeldol gamezeldol вне форума
Прохожий
 
Регистрация: 21.02.2012
Сообщения: 16
Репутация: 10
По умолчанию Сортировка в stringgrid

Здравсвуйте. Помогите решить одну проблемку. Может уже кто ниб встречался с такой?
Есть Stringgrid1 в нем 3 столбца, а количество строк изменяется в соответствии с тем какое число выбирается в combobox1.
В этих 3ёх столбцах даны какие либо числа...
Нужно чтобы выполнилась сортировка по 2ому столбцу, а ячейки в других столбцах изменили свое положение в соответствии с ячейками 2ого столбца. пример: Дано
1 2 6
2 3 9
3 1 2
Сортируем по 2ому столбцу, получаем
3 1 2
1 2 6
2 3 9
Примерная функция сортировки выглядит так:
Код:
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;

begin
  ts := TStringList.Create;
  try
   with StringGrid1 do
     ts.
      begin
        ts.Assign(cols[1]); // Получаем элементы очередной строки
        ts.CustomSort(mySort); // сортируем их как числа по убыванию
        Cols[1].Assign(ts); // возвращаем назад в Грид
      end;
  finally
    ts.Free;
  end;
СПАСИБО за внимание.
Ответить с цитированием
  #2  
Старый 31.05.2012, 12:51
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

если выложенная сортировка работает по 1 колонке, то можно поменять значениями первую и вторую колонку, до и после сортировки
Ответить с цитированием
  #3  
Старый 31.05.2012, 13:05
gamezeldol gamezeldol вне форума
Прохожий
 
Регистрация: 21.02.2012
Сообщения: 16
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
если выложенная сортировка работает по 1 колонке, то можно поменять значениями первую и вторую колонку, до и после сортировки
Эта сортировка работает только для 2ого столбца, т.е. сортируется только он, а мне нужно чтобы после сортировки 2ого столбца, ячейки 1ого и 3его столбцов тоже меняли свое положение в соответствии со 2ым.
Ответить с цитированием
  #4  
Старый 31.05.2012, 13:18
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

тогда можно попробовать значение 1 и 3 колонок спрятать в Stringlist.Objects[i]
после сортировки вытащить назад
Ответить с цитированием
Этот пользователь сказал Спасибо Pyro за это полезное сообщение:
gamezeldol (02.06.2012)
  #5  
Старый 01.06.2012, 08:24
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 340
Версия Delphi: 11.3
Репутация: 429
Сообщение

Цитата:
Сообщение от gamezeldol
Примерная функция сортировки выглядит так:
Код:
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;

begin
  ts := TStringList.Create;
  try
   with StringGrid1 do
     ts.
      begin
        ts.Assign(cols[1]); // Получаем элементы очередной строки
        ts.CustomSort(mySort); // сортируем их как числа по убыванию
        Cols[1].Assign(ts); // возвращаем назад в Грид
      end;
  finally
    ts.Free;
  end;
СПАСИБО за внимание.
А где в твоей примерной функции сортировки есть сравнение значений? Слышал что-нибудь о таком методе сортировке как сортировка пузырьком? Так вот здесь он вполне применим. В качестве пузырька у нас будет строка в StringGrid, которую мы специально добавим чтобы через нее менять значение строк местами.
Код:
procedure TFormGeneral.BtnSortingClick(Sender: TObject);
var
  I, J, CntRow, Val1, Val2: Integer;
begin
  StringGrid.RowCount := StringGrid.RowCount + 1;
  CntRow := StringGrid.RowCount;
  for J := 1 to CntRow - 1 do
  for I := 1 to CntRow - 1 do
    begin
      Val1 := StrToIntDef(StringGrid.Cells[1, I], 0);
      Val2 := StrToIntDef(StringGrid.Cells[1, J], 0);
      if Val1 < Val2 then
      with StringGrid do
      begin
        Rows[CntRow] := Rows[i];
        Rows[i] := Rows[J];
        Rows[J] := Rows[CntRow];
      end;
    end;
  StringGrid.RowCount := StringGrid.RowCount - 1;
end;

P.S.: в данном случае сортировка по убыванию. Чтобы получить сортировку по возрастанию нужно чуть-чуть доработать код. А что бы его доработать нужно понять что тут к чему. Учиться, учиться и еще раз учиться
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
Этот пользователь сказал Спасибо Kailon за это полезное сообщение:
gamezeldol (02.06.2012)
  #6  
Старый 02.06.2012, 18:58
gamezeldol gamezeldol вне форума
Прохожий
 
Регистрация: 21.02.2012
Сообщения: 16
Репутация: 10
Радость

Цитата:
Сообщение от Kailon
А где в твоей примерной функции сортировки есть сравнение значений? Слышал что-нибудь о таком методе сортировке как сортировка пузырьком? Так вот здесь он вполне применим. В качестве пузырька у нас будет строка в StringGrid, которую мы специально добавим чтобы через нее менять значение строк местами.
Код:
procedure TFormGeneral.BtnSortingClick(Sender: TObject);
var
  I, J, CntRow, Val1, Val2: Integer;
begin
  StringGrid.RowCount := StringGrid.RowCount + 1;
  CntRow := StringGrid.RowCount;
  for J := 1 to CntRow - 1 do
  for I := 1 to CntRow - 1 do
    begin
      Val1 := StrToIntDef(StringGrid.Cells[1, I], 0);
      Val2 := StrToIntDef(StringGrid.Cells[1, J], 0);
      if Val1 < Val2 then
      with StringGrid do
      begin
        Rows[CntRow] := Rows[i];
        Rows[i] := Rows[J];
        Rows[J] := Rows[CntRow];
      end;
    end;
  StringGrid.RowCount := StringGrid.RowCount - 1;
end;

P.S.: в данном случае сортировка по убыванию. Чтобы получить сортировку по возрастанию нужно чуть-чуть доработать код. А что бы его доработать нужно понять что тут к чему. Учиться, учиться и еще раз учиться
Тооооооочно)) Вспомнил проходили мы такую сортировку))) Спасибо огромное) Просто Диплом делаю, в мозгах уже кипит все)))
Ответить с цитированием
  #7  
Старый 03.06.2012, 02:38
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 340
Версия Delphi: 11.3
Репутация: 429
Сообщение

Цитата:
Просто Диплом делаю...
Ты хоть делаешь, а я вот ни как не могу за него взяться
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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