Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка в StringGrid 
:(
    Опции темы
ValerkaT
Дата 28.8.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



есть таблица StringGrid с данными вид таблицы:

Измерение №    Канал1    Канал2    Канал3
1                        436,2        8,9          436,3
1                        355           13,3        355,1
1                        375,7        13,2        375,7
1                        325,9        13,3        325,9
1                        279,1        13,4        279,2
1                        221,8        13,4        221,8
1                        260,3        13,4        260,3
1                        167,1        13,4        167,1
1                        110,8        13,6        110,9
1                        85,4          13,6        85,4
1                        72,5          13,8        72,4
1                        48,6          13,5        48,5
1                        39,2          13,9        39,2
1                        28,7          13,5        28,6
1                        10,7          13,7        10,6
1                        9,2            13,9        9,2
1                        7,6            13,3        7,5
1                        1               13,8        1
2                        466,8        9             466,9
2                        432,3        13,2        432,5
2                        402,3        13,4        402,5
2                        426,5        13,3        426,6
2                        376,9        13,9        377
2                        324,6        17,7        324,6
2                        365,9        17,1        365,8
2                        261,2        17,7        261,2
2                        176,4        17,7        176,4
2                        137,2        17,8        137,1
2                        116,4        17,8        116,3
2                        78             17,8        77,9
2                        63,2          17,8        63,1
2                        46,6          17,8        46,5
2                        17,8          17,9        17,7
2                        15,5          17,9        15,4
2                        12,8          17,8        12,7
2                        2,2            17,8        2,1
3                        484,2        8,9          484,3
3                        450,6        13,4        450,8
3                        463,9        13,2        464
3                        443,6        13,6        443,8
3                        414,9        16,8        415
3                        426,4        15,9        426,5
3                        390,4        17,7        390,5
3                        335,2        19           335,1
3                        237,2        21,3        237,1
3                        185,2        21,9        185
3                        157,7        21,9        157,6
3                        106           21,8        105,9
3                        86,2          22,1        86
3                        63,4          21,9        63,3
3                        24,3          22,1        24,1
3                        21,4          22,1        21,3
3                        17,8          21,9        17,7
3                        3,6            22,1        3,3

как отсортировать значения по 1-у каналу для каждого из измерений в отдельности?, т.е. если взять первое имерение это 18 строк, надо отсортировать по 1-у каналу по убыванию значений, допустим если взять второе значение 1-го канала 1-го измерения (355) оно меньше третьего значения 1-го канала того же измерения (375,7), следовательно вся вторая строка должна сместиться вниз а третья наверх и таким образом все 18 строк до 2-го измерения, далее отсортировать 2-е и 3-е измерения.

Добавлено @ 11:20
я тут нашел код 
Код

//Сортировка
typedef struct {
  int ARow; //Номер строки 
  AnsiString S; //содержимое ячейки сортируемой колонки
}TMyData;
//Вспомогательная функция сортировки 
static int __fastcall CompareUp(void * Item1, void * Item2)
{
  return ((TMyData *)Item1)->S.AnsiCompare(((TMyData *)Item2)->S); 
} 
//Вспомогательная функция сортировки 
static int __fastcall CompareDown(void * Item1, void * Item2) 
{ 
  return ((TMyData *)Item2)->S.AnsiCompare(((TMyData *)Item1)->S); 
} 
//Сортировка строк в SG по содержимому колонки ACol 
//DirectSort==1 - по возрастающей, ==-1 - по убывающей 
//          ==0 -без сортировки 
static void __fastcall Sort(TStringGrid *StringGrid1,int ACol,int DirectSort)
{
  DirectSort == -1;
  int i,j,ARow;
  if(!DirectSort)return; // без сортировки 
  if(!StringGrid1->FixedRows)return; //Нет заголовка колонки
  if(StringGrid1->RowCount <=StringGrid1->FixedRows)return; //Нечего сортировать
  TList *SortList=new TList; //Список для сортировки
  TList *TempList=new TList; //Список для установки строк на новое место 
  //Заполним список содержимым колонки ACol 
  for(ARow=StringGrid1->FixedRows; ARow < StringGrid1->RowCount; ARow++)
  {
    TMyData *md=new TMyData;
    md->ARow=ARow;
    md->S=StringGrid1->Cells[ACol][ARow];
    SortList->Add(md);
    //Заполним TempList
    TempList->Add((void *)ARow); //Запомним старую расстановку строк
  }
  if(DirectSort==1)SortList->Sort(CompareUp); //Отсортируем по возрастающей
  else SortList->Sort(CompareDown); //Отсортируем по убывающей
    //Найдём в каком месте сейчас находится бывшая строка Row
  int cRow=StringGrid1->Row; //Текущая строка
  int cTopRow=StringGrid1->TopRow; //Текущая верхняя строка
  int newRow=cRow;
    for(j=0; j < SortList->Count; j++)
    {
     TMyData *md=(TMyData *)(SortList->Items[j]);
      if(cRow==md->ARow)break;
    }
    if(j < SortList->Count)newRow=j+StringGrid1->FixedRows;

  for(i=0; i < SortList->Count; i++)
  {
    TMyData *md=(TMyData *)(SortList->Items[i]);
    //Возьмём номер строки в начальной расстановке
    ARow=md->ARow;
    //Найдём в каком месте сейчас находится бывшая строка ARow
    for(j=0; j < TempList->Count; j++)
    {
      if(ARow==(int)TempList->Items[j])break;
    }
    //Сейчас строка находится на месте j+FixedRows
    //Надо её переставить на место i+FixedRows
//.... Это вариант для стандартного StringGrid'а ..... 
    AnsiString Sold=StringGrid1->Rows[j+StringGrid1->FixedRows]->Text; //Прежнее положение строки
    AnsiString Snew=StringGrid1->Rows[i+StringGrid1->FixedRows]->Text; //Новое положение строки
    StringGrid1->Rows[j+StringGrid1->FixedRows]->Text=Snew;
    StringGrid1->Rows[i+StringGrid1->FixedRows]->Text=Sold;
    //Делаем параллельную перестановку в TempList 
    int jold=(int)(TempList->Items[j]); 
    int inew=(int)(TempList->Items[i]); 
    TempList->Items[j]=(void *)inew; 
    TempList->Items[i]=(void *)jold; 
  } 
  //Удалим списки
  delete TempList; 
  for(i=0; i < SortList->Count; i++) 
  { 
    delete (TMyData *)(SortList->Items[i]); 
  } 
  delete SortList; 
  int newTopRow=newRow-(cRow-cTopRow); 
  if(newTopRow < 1)newTopRow=1; 
  StringGrid1->Row=newRow;
  StringGrid1->TopRow=newTopRow; //Покажем текущую строку
}

возможно ли его применить к моей задаче?, не пойму что где поменять заменить...

Это сообщение отредактировал(а) ValerkaT - 28.8.2008, 11:27
PM MAIL   Вверх
ValerkaT
Дата 29.8.2008, 14:02 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



сортировку массива я тоже сделал вобщем, осталось сделать сплайн интерполяцию, помогите кто может
PM MAIL   Вверх
Notreg
Дата 29.8.2008, 14:18 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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




Модератор: Сообщение скрыто.

--------------------
Надежна лишь смерть, жизнь - нет.
PM MAIL   Вверх
ValerkaT
Дата 29.8.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а почему сообщение скрыто?
PM MAIL   Вверх
ThunderJeka
Дата 12.1.2010, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В дополнение к сортировке задам вопрос как обработать клик по Fixed ячейке чтобы например определить по какому столбцу вызывать сортировку?
PM MAIL   Вверх
smoke_man
Дата 12.1.2010, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ValerkaT, тебе необходимо сделать следующее - добавить приведенный выше код к себе в проект и , допустим, по событию кнопки вызвать функцию Sort, в которую тебе необходимо передать твой StringGrid, номер колонки и тип сортировки. 


ThunderJeka, использовать событие OnSelectCell StringGrid`a


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
ThunderJeka
Дата 13.1.2010, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



OnSelectCell на фиксированные ячейки не срабатывает, уже пробывал
PM MAIL   Вверх
smoke_man
Дата 14.1.2010, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Для фиксированных ячеек можно использовать событие OnMouseUp следующим образом:
Код

void __fastcall TForm1::StringGrid1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
  int SelectCol;
  TRect rect;

  if (Y < StringGrid1->RowHeights[0])
  {
    for (int i= 0 ;i < StringGrid1->ColCount; i++)
    {
      rect = StringGrid1->CellRect(i,0);
      if ((rect.Left < X) && (rect.Right> X))
      {
        SelectCol = i;
        break;
      }
    }
    ShowMessage(IntToStr(SelectCol));//SortFunction()...
  }

}


Это сообщение отредактировал(а) smoke_man - 14.1.2010, 08:29


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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