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

Поиск:

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


Новичок



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

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



есть таблица со значениями StringGrid, нужно отсортировать эти значения по столбцу (пусть будет столбец А), то есть один столбец(А) сортируем по возрастанию, а значения остальных столбцов сортируются соответственно значениям столбца А.
в Ecxel'e есть такая сортировка, думаю многие с ней знакомы. надо тоже самое организовать в StringGrid'е. может вопрос ламерский, но разобраться не могу, помогите пожалуйста! заранее спасибо!
PM MAIL   Вверх
MerCus
Дата 1.10.2008, 04:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вот код который пишу я:
Код

repeat
    Flag2:=False;
    for k:=1 to n1-1 do begin
      if arg[k]>arg[k+1] then
       begin
       d1:=k;
        mi1:= arg[k];
        arg[k]:=arg[k+1];
        arg[k+1]:=mi1;
        For j:=1 to n2 do begin
            mi2:=a[j,d1];
            a[j,d1]:=a[j,d1+1];
            a[j,d1+1]:=mi2;
        end;
        Flag2:=True;
       end;
       end;
  until Flag2=False;


надо было пояснение написать..
так вот arg - это массив столбца в котором производим сортировку по возрастанию, а- это двумерный массив всех значений СтрингГрида.

Это сообщение отредактировал(а) MerCus - 3.10.2008, 02:37
PM MAIL   Вверх
Staruha
Дата 1.10.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



В StringGride есть свойство Index наверно это то что тебе надо


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


Новичок



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

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



не знаю, что вы имели ввиду, но свойства Индекс у СтрингГрида нет, если вы хотели мне сказать, что менять значения надо по соответствующим индексам, то я догодался и сам об этом, только у меня не выходит грамотно это прописать, поэтому я и обратился за помощью smile 
PM MAIL   Вверх
Staruha
Дата 2.10.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

но свойства Индекс у СтрингГрида 

 smile действительно нет

Я по твоему образу написала код но он ругается на StringGrid1Sells[i-1,0];
наверно потому что String не заполнен.
Код

procedure TForm1.Button1Click(Sender: TObject);
 var
Flag2:boolean;
k,n1,i:integer;
mi1:String;
myarray:array[1..7] of string;
begin
   for i := 1 to 7 do
       myarray[i]:=StringGrid1Sells[i-1,0];
repeat
//n1:=7;
    Flag2:=False;
    for k:=1 to 7 do begin
      if myarray[k,0]>myarray[k+1,0] then
         mi1:= myarray[k,0];
        myarray[k,0]:=myarray[k+1,0];
         myarray[k,0]:=mi1;
       StringGrid1Sells[k-1,0]:=StringGrid1Sells[k,0];
         StringGrid1Sells[k,0]:=mi1;



        Flag2:=True;
       end;
       end;
  until Flag2=False;


end;

end.



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


Delphi developer
****


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

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



Цитата(Staruha @  2.10.2008,  11:57 Найти цитируемый пост)
наверно потому что String не заполнен.
нет. Потому что нужна точка и не правильно написано.

StringGrid1.Сells[i-1,0];


Это сообщение отредактировал(а) Poseidon - 2.10.2008, 14:12


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

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



Staruha,  smile  smile  за StringGrid1Sells, особенно за Sells ))

"ол рихтс!"- сказал студент-самоучка, изучающий английский язык, положив на стол газету "невс тимес"

Это сообщение отредактировал(а) uranpro - 2.10.2008, 16:25


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
MerCus
Дата 3.10.2008, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



по существу ответа так и не было, больше ни у кого никаких мыслей нет?
PM MAIL   Вверх
Poseidon
Дата 3.10.2008, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



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


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


Эксперт
***


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

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



MerCus нам немножко осталось до правильного решения.Я в коде все исправила больше не ругается только опять не могу тестировать.Вопрос Что в String данные тоже программно вводить?Чейто я не найду там ReadOnly

Код

procedure TForm1.Button1Click(Sender: TObject);
 var
Flag2:boolean;
k,n1,i:integer;
mi1:String;
myarray:array[1..7] of string;
begin
   for i := 1 to 7 do
       myarray[i]:=StringGrid1.Cells[i-1,0];
repeat
//n1:=7;
    Flag2:=False;
    for k:=1 to 7 do begin
      if myarray[k]>myarray[k+1] then
         mi1:= myarray[k];
        myarray[k]:=myarray[k+1];
         myarray[k]:=mi1;
       StringGrid1.Cells[k-1,0]:=StringGrid1.Cells[k,0];
         StringGrid1.Cells[k,0]:=mi1;

        Flag2:=True;
       end;

  until Flag2=False;


end;

end.



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


Эксперт
***


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

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



OPtions.goEditing  люди добрые подсказали.

Сейчас че-нить накопаю



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


Эксперт
***


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

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



Работает  smile 
Код

procedure TForm1.Button3Click(Sender: TObject);
  var
 flag:boolean;
k:integer;
mi1:String;
begin

  repeat
      flag:=false;
      for k := 1 to 6-1 do

      if StringGrid1.Cells[1,k]>StringGrid1.Cells[1,k+1] then
      Begin
         mi1:=StringGrid1.Cells[1,k];
        StringGrid1.Cells[1,k]:=StringGrid1.Cells[1,k+1];
         StringGrid1.Cells[1,k+1]:=mi1;

   flag:=true;
      end;
    until not flag;

        end;



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


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



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

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



Что то подобное:

Заполним StringGrid:

Код

procedure TForm1.Button1Click(Sender: TObject);
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(Random(1000));
end;


Сортируем:

Код

procedure TForm1.Button2Click(Sender: TObject);
var
  I: Integer;
  S: TStrings;
  J: Integer;
begin
  for I := 0 to StringGrid1.RowCount - 1 do
    for J := 0 to StringGrid1.RowCount - I - 2 do
      if CompareStr(StringGrid1.Cells[0, J], StringGrid1.Cells[0, J + 1]) > 0 then
        begin
          S := TStringList.Create;
          try
            S.Assign(StringGrid1.Rows[J]);
            StringGrid1.Rows[J].Assign(StringGrid1.Rows[J + 1]);
            StringGrid1.Rows[J + 1].Assign(S);
          finally
            S.Free;
          end;
        end;
end;


Сортирует СТРОКИ, а не числа, которые взяты просто для примера smile
PM   Вверх
MerCus
Дата 6.10.2008, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Staruha вы сортируете один столбец! это проще простого, а мне надо один столбец сортировать по возрастанию, а все остальные по этому столбцу.
THandle спасибо, но тоже не совсем то.

короче обьясняю как делаю я, и это скорее всего правильно, только наверное не совсем)))
делаем через массив, потом этот массив выводим в стринггрид. 
сортируем один столбец (который выбирает пользователь), запоминаем индекс числа в массиве которое меняем, и меняем числа в других столбцах с таким же индексом. собственно всё это отражает мой код во втором сообщении, а вы ребята, то ли меня не поняли, то ли от темы ушли. вы все к СтрингГриду прицепились, сортировать надо через массив, а потом его просто вывести.
PM MAIL   Вверх
Staruha
Дата 6.10.2008, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



THandle 
Цитата

Сортирует СТРОКИ, а не числа, которые взяты просто для примера 

Я сама поражаюсь как это происходит ,но Строка в мною приведенном коде сортируется Супер ,а именно по первой букве ,по второй,третьей и т.д.

MerCus  
Цитата

Staruha вы сортируете один столбец! это проще простого

 спасибо тебе MerCus   smile 
 
так что получается,если  Stroka:=StringGrid1.Cells[1,k]+StringGrid1.Cells[2,k]+.....;
тоже должна сортироваться по тому же принципу. А массив или String(ты сам просил,хотя во всех примерах сортируются массивы) это просто контейнер.



--------------------
Возмездие настигнет
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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