CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Sortowanie StringGrid

Sortowanie StringGrid

dział ogólny

Sortowanie StringGrid

Nowy postprzez mufasa » poniedziałek, 31 stycznia 2011, 18:19

Macie jakiś sposób na sortowanie StringGrida po intach bo teraz to sortuje mi tak:
1000
100
10
1
23

A mam coś takiego ze strony Cyfrowego Barona

Kod: Zaznacz cały
enum TTypeSort {tsIncrease, tsDecrease};
int __fastcall CustomSortIncrease(TStringList *Lista, int idx1, int idx2)
{
String cTemp1 = Lista->Strings[idx1];
String cTemp2 = Lista->Strings[idx2];
return CompareText(cTemp1, cTemp2);
}
int __fastcall CustomSortDecrease(TStringList *Lista, int idx1, int idx2)
{
String cTemp1 = Lista->Strings[idx1];
String cTemp2 = Lista->Strings[idx2];
return -CompareText(cTemp1, cTemp2);
}
//--------------------------------
void __fastcall SortGrid(TStringGrid *Grid, int Col, TTypeSort tsSort)
{
TStringList *SortList = new TStringList;
String temp = "";

for(int i = Grid->FixedRows; i < Grid->RowCount; i++)
{
  temp = Grid->Cells[Col][i];
  if(temp.IsEmpty()) temp = " ";
  for(int z = Grid->FixedCols; z <= Grid->ColCount; z++)
  {
   if(Grid->Cells[z][i].IsEmpty()) Grid->Cells[z][i] = " ";
   if(z != Col)
    temp = temp + "^" + Grid->Cells[z][i];
  }
  SortList->Add(temp.SubString(0, temp.Length() - 1));
  temp = "";
}

switch(tsSort)
{
  case tsIncrease: SortList->CustomSort(CustomSortIncrease); break;
  case tsDecrease: SortList->CustomSort(CustomSortDecrease); break;
}
temp = "";
for(int i = 0; i < SortList->Count; i++)
{
  temp = SortList->Strings[i];

  int y = temp.Pos("^");
  Grid->Cells[Col][i + 1] = temp.SubString(1, y - 1).Trim();
  temp = temp.Delete(1, y);
  int z;
  for(z = Grid->FixedCols; z < Grid->ColCount; z++)
  {
   if(z != Col)
   {
    y = temp.Pos("^");
    Grid->Cells[z][i + 1] = temp.SubString(1, y - 1).Trim();
    temp = temp.Delete(1, y);
   }
  }
  z++;
  y = temp.Pos("^");
  Grid->Cells[z][i + 1] = temp.SubString(1, y - 1).Trim();
  temp = temp.Delete(1, y);
}

delete SortList;
}
//--------------------------------
TTypeSort tsSwitch = tsIncrease;
int sCol = -1, sRow = -1;
void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender,
        TMouseButton Button, TShiftState Shift, int X, int Y) // zdarzenie OnMouseDown
{
TGridCoord mCoord = StringGrid1->MouseCoord(X, Y);
if(mCoord.Y == StringGrid1->FixedCols - 1)
{
  sCol = mCoord.X;
  StringGrid1->Col = sCol;


  switch(tsSwitch)
  {
   case tsIncrease: SortGrid(StringGrid1, sCol, tsIncrease); tsSwitch = tsDecrease;
                    StringGrid1->Repaint();
                    return;
   case tsDecrease: SortGrid(StringGrid1, sCol, tsDecrease); tsSwitch = tsIncrease;
                    StringGrid1->Repaint();
                    return;
  }
}
}
//--------------------------------
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
        int ARow, TRect &Rect, TGridDrawState State) // zdarzenie OnDrawCell
{
if(ACol == sCol)
{
  TRect rRect = StringGrid1->CellRect(sCol, 0);
  StringGrid1->Canvas->Brush->Color = clBlack;
  StringGrid1->Canvas->Pen->Color = clBlack;

  switch(tsSwitch)
  {
   case tsIncrease:
                   StringGrid1->Canvas->Polygon(OPENARRAY (TPoint, (
                                Point(rRect.Right - 10, rRect.Top + 5),
                                Point(rRect.Right - 13, rRect.Top + 10),
                                Point(rRect.Right - 8, rRect.Top + 10)
                                                                   )));
                   break;
   case tsDecrease:
                   StringGrid1->Canvas->Polygon(OPENARRAY (TPoint, (
                                Point(rRect.Right - 13, rRect.Top + 5),
                                Point(rRect.Right - 10, rRect.Top + 10),
                                Point(rRect.Right - 8, rRect.Top + 5)
                                                                   )));
                   break;
  }
}
}


I jak to teraz przerobić aby kolumne z intami mozna było posortować tak żeby były poprawne wartości
Avatar użytkownika
mufasa
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): poniedziałek, 31 stycznia 2011, 17:36
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: c++ builder 6 enterprise
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez Cyfrowy Baron » poniedziałek, 31 stycznia 2011, 20:09

► patrz serwis: Cyfrowy Baron dział: porady -> StringGrid, porady: Sortowanie tabeli StringGrid oraz Sortowanie bąbelkowe tabeli.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez polymorphism » poniedziałek, 31 stycznia 2011, 21:51

Coś w ten deseń:
KOD cpp:     UKRYJ  
int __fastcall CustomSortIncrease(TStringList *Lista, int idx1, int idx2)
{
        String cTemp1 = Lista->Strings[idx1];
        String cTemp2 = Lista->Strings[idx2];
       
        int n = cTemp1.Length() - cTemp1.Length();
        if(n == 0) n = CompareText(cTemp1, cTemp2);
        return n;
}

int __fastcall CustomSortDecrease(TStringList *Lista, int idx1, int idx2)
{
        return CustomSortIncrease(Lista, idx2, idx1);
}
 
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez mufasa » poniedziałek, 31 stycznia 2011, 23:49

Cyfrowy Baron napisał(a): ► patrz serwis: Cyfrowy Baron dział: porady -> StringGrid, porady: Sortowanie tabeli StringGrid oraz Sortowanie bąbelkowe tabeli.


Zrobiłem jak w poradzie z tym, że mam błąd :

[Linker Error] Unresolved external 'TForm1::BubbleSort(Grids::TStringGrid *, int)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\STRIN GRID 2\UNIT1.OBJ







polymorphism napisał(a):Coś w ten deseń:
KOD cpp:     UKRYJ  
int __fastcall CustomSortIncrease(TStringList *Lista, int idx1, int idx2)
{
        String cTemp1 = Lista->Strings[idx1];
        String cTemp2 = Lista->Strings[idx2];
       
        int n = cTemp1.Length() - cTemp1.Length();
        if(n == 0) n = CompareText(cTemp1, cTemp2);
        return n;
}

int __fastcall CustomSortDecrease(TStringList *Lista, int idx1, int idx2)
{
        return CustomSortIncrease(Lista, idx2, idx1);
}
 


Funkcje mam wywołać z nazwą StringGrida i numerem kolumn które chce posortować ?
Avatar użytkownika
mufasa
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): poniedziałek, 31 stycznia 2011, 17:36
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: c++ builder 6 enterprise
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez mufasa » wtorek, 1 lutego 2011, 01:52

Oraz drugi problem chciałbym do StrinGrida do wybranych kolumn ładować dane z pliku textowego, które odbywać się będzie przy kliknięciu buttona. Z tym, że te dane mają być ładowane linia po linii. Czyli gdy nacisnę button raz pierwszy wiersz z wybranymi kolumnami zostaje wypełniony, naciskam drugi raz kolejne dane z kolejnej linii ładowane są do kolejnego wiersza do wybranych kolumn. Separatorem danych w pliku tekstowym jest spacja czyli po spacji wartość po spacji ładowana będzie do kolejnej kolumny.

Przyjmijmy że muszę załadować dane:
123 23 56 34
234 67 43 54
365 43 12 54
...
Do 2, 4, 5, 6 kolumn StringGrida
Avatar użytkownika
mufasa
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): poniedziałek, 31 stycznia 2011, 17:36
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: c++ builder 6 enterprise
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez polymorphism » wtorek, 1 lutego 2011, 11:24

Funkcje mam wywołać z nazwą StringGrida i numerem kolumn które chce posortować ?

Przyjrzyj się źródłom, które wkleiłeś w pierwszym poście.

Oraz drugi problem chciałbym do StrinGrida do wybranych kolumn ładować dane z pliku textowego (...)

No dobrze, ale czego nie wiesz? Na gotowe czekasz, czy jak?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez Cyfrowy Baron » wtorek, 1 lutego 2011, 12:05

Co do ostatniego problemu ► patrz serwis: Cyfrowy Baron dział: porady -> kursy praktyczne -> Baza danych. Jest tam kod odpowiedzialny za wczytywanie danych z pliku tekstowego bezpośrednio do tabeli TStringGrid, a separator sobie ustawisz. Kod musisz oczywiście dostosować do własnych potrzeb.
Możesz również skorzystać z porady: Zapisywanie i odczytywanie zawartości obiektu StringGrid. w dziale: porady -> StringGrid.



Zrobiłem jak w poradzie z tym, że mam błąd :

[Linker Error] Unresolved external 'TForm1::BubbleSort(Grids::TStringGrid *, int)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\STRIN GRID 2\UNIT1.OBJ



Problem polega na tym, że nie zastosowałeś się do porady, czyli w poradzie funkcja BubbleSort nie jest metodą klasy TForm1, Ty natomiast chciałeś uczynić ją metodą klasy TForm1 więc w pliku nagłówkowym Unit1.h w sekcji private dałeś:

KOD cpp:     UKRYJ  
private:        // User declarations
        void BubbleSort(TStringGrid *Tabela, int Col);


To, że chcesz uczynić tą funkcję metodą klasy TForm1, żadnym błędem nie jest, ale Ty w pliku źródłowym tak zapiałeś tą funkcję:

KOD cpp:     UKRYJ  
void BubbleSort(TStringGrid *Tabela, int Col)
{
 String temp;
 for(int i = Tabela->FixedRows; i < Tabela->RowCount; i++)
 {
  for(int j = Tabela->FixedRows; j < i; j++)
  {
   if(Tabela->Cells[Col][i] < Tabela->Cells[Col][j])
   {
    temp = Tabela->Rows[i]->GetText();
    Tabela->Rows[i]->SetText(Tabela->Rows[j]->GetText());
    Tabela->Rows[j]->SetText(temp.c_str());
   }
  }
 }
}


I tutaj jest problem, gdyż to nie czyni funkcji metodą klasy TForm1, ponieważ masz tak:

KOD cpp:     UKRYJ  
void BubbleSort(TStringGrid *Tabela, int Col)


a powinno być tak:

KOD cpp:     UKRYJ  
void TForm1::BubbleSort(TStringGrid *Tabela, int Col)


czyli TForm1::BubbleSort



Funkcje mam wywołać z nazwą StringGrida i numerem kolumn które chce posortować ?


To co zaproponował polymorphism jest niemal identyczne z tym co ja proponuję w poradzie: porady -> StringGrid -> Sortowanie tabeli StringGrid. Z tą różnicą, że proponowany przeze mnie kod jest przystosowany do sortowania tabeli StringGrid dla wybranej kolumny. Sortowane są wszystkie wiersze w oparciu o sortowaną kolumnę, a więc powiązania komórek w wierszu pozostają, gdyż tak to powinno wyglądać. Sortowanie odbywa się tekstowo, czyli zawartość komórek traktowana jest jak tekst, a nie jak liczby, ale w poradzie: dział: porady -> ListBox -> Sortowanie listy według różnych kryteriów (liczby lub tekstu), pokazany jest sposób sortowania również wg. liczby, wystarczy więc odpowiednie funkcje zaadoptować do potrzeb tabeli:

KOD cpp:     UKRYJ  
#pragma warn +csu

enum TTypeSort {tsIncrease, tsDecrease, tsIncreaseInt, tsDecreaseInt};

int foo(int u, int i)  /* funkcja pomocnicza */
{
 int z = u - i;
 return z;
}
//---------------------------------------------------------------------------
int __fastcall CustomSortIncreaseInt(TStringList *Lista, int idx1, int idx2)
{  /* sortowanie rosnąco wg. liczb */
 String cTemp1 = Lista->Strings[idx1];
 String cTemp2 = Lista->Strings[idx2];
 int x1 = cTemp1.Pos("^");
 int x2 = cTemp2.Pos("^");
 int rTemp1 = cTemp1.SubString(1, x1 - 1).Trim().ToIntDef(0);
 int rTemp2 = cTemp2.SubString(1, x2 - 1).Trim().ToIntDef(0);

 return foo(rTemp1, rTemp2);
}
//---------------------------------------------------------------------------
int __fastcall CustomSortDecreaseInt(TStringList *Lista, int idx1, int idx2)
{  /* sortowanie malejąco wg. liczb */
 String cTemp1 = Lista->Strings[idx1];
 String cTemp2 = Lista->Strings[idx2];
 int x1 = cTemp1.Pos("^");
 int x2 = cTemp2.Pos("^");
 int rTemp1 = cTemp1.SubString(1, x1 - 1).Trim().ToIntDef(0);
 int rTemp2 = cTemp2.SubString(1, x2 - 1).Trim().ToIntDef(0);

 return -foo(rTemp1, rTemp2);
}
//---------------------------------------------------------------------------
int __fastcall CustomSortIncrease(TStringList *Lista, int idx1, int idx2)
{ /* sortowanie rosnąco wg. tekstu */
 String cTemp1 = Lista->Strings[idx1];
 String cTemp2 = Lista->Strings[idx2];
 return CompareText(cTemp1, cTemp2);
}
//---------------------------------------------------------------------------
int __fastcall CustomSortDecrease(TStringList *Lista, int idx1, int idx2)
{ /* sortowanie malejąco wg. tekstu */
 String cTemp1 = Lista->Strings[idx1];
 String cTemp2 = Lista->Strings[idx2];
 return -CompareText(cTemp1, cTemp2);
}
//---------------------------------------------------------------------------
void __fastcall SortGrid(TStringGrid *Grid, int Col, TTypeSort tsSort)
{ /* funckja sortująca */

 TStringList *SortList = new TStringList;
 String temp = "";

 for(int i = Grid->FixedRows; i < Grid->RowCount; i++)
 {
  temp = Grid->Cells[Col][i];
  if(temp.IsEmpty()) temp = " ";
  for(int z = Grid->FixedCols; z <= Grid->ColCount; z++)
  {
   if(Grid->Cells[z][i].IsEmpty()) Grid->Cells[z][i] = " ";
   if(z != Col)
    temp = temp + "^" + Grid->Cells[z][i];
  }
  SortList->Add(temp.SubString(0, temp.Length() - 1));
  temp = "";
 }

 switch(tsSort)
 {
  case tsIncrease:    SortList->CustomSort(CustomSortIncrease); break;
  case tsIncreaseInt: SortList->CustomSort(CustomSortIncreaseInt); break;
  case tsDecrease:    SortList->CustomSort(CustomSortDecrease); break;
  case tsDecreaseInt: SortList->CustomSort(CustomSortDecreaseInt); break;
 }

 temp = "";

 for(int i = 0; i < SortList->Count; i++)
 {
  temp = SortList->Strings[i];

  int y = temp.Pos("^");
  Grid->Cells[Col][i + 1] = temp.SubString(1, y - 1).Trim();
  temp = temp.Delete(1, y);
  int z;
  for(z = Grid->FixedCols; z < Grid->ColCount; z++)
  {
   if(z != Col)
   {
    y = temp.Pos("^");
    Grid->Cells[z][i + 1] = temp.SubString(1, y - 1).Trim();
    temp = temp.Delete(1, y);
   }
  }
  z++;
  y = temp.Pos("^");
  Grid->Cells[z][i + 1] = temp.SubString(1, y - 1).Trim();
  temp = temp.Delete(1, y);
 }

 delete SortList;
}
//---------------------------------------------------------------------------
/* zdarzenie OnMouseDown - sortowanie po kliknięciu w kolumnę */
TTypeSort tsSwitch = tsIncreaseInt;
int sCol = -1, sRow = -1;
void __fastcall TForm2::StringGrid1MouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
{
 TGridCoord mCoord = StringGrid1->MouseCoord(X, Y);
 if(mCoord.Y == StringGrid1->FixedCols - 1)
 {
  sCol = mCoord.X;
  StringGrid1->Col = sCol;


  switch(tsSwitch)
  {
   case tsIncreaseInt: SortGrid(StringGrid1, sCol, tsSwitch);
                       tsSwitch = tsDecreaseInt;
                        StringGrid1->Repaint();
                        return;
   case tsDecreaseInt: SortGrid(StringGrid1, sCol, tsSwitch);
                       tsSwitch = tsIncreaseInt;
                        StringGrid1->Repaint();
                       return;
  }
 }
}
//---------------------------------------------------------------------------
/* zdadzenie OnDrawCell - rysowanie strzałki określajacej kierunek sortowania */
void __fastcall TForm2::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
          TRect &Rect, TGridDrawState State)
{
 if(ACol == sCol)
 {
  TRect rRect = StringGrid1->CellRect(sCol, 0);
  StringGrid1->Canvas->Brush->Color = clBlack;
  StringGrid1->Canvas->Pen->Color = clBlack;

  switch(tsSwitch)
  {
   case tsIncreaseInt:
                   StringGrid1->Canvas->Polygon(OPENARRAY (TPoint, (
                                Point(rRect.Right - 10, rRect.Top + 5),
                                Point(rRect.Right - 13, rRect.Top + 10),
                                Point(rRect.Right - 8, rRect.Top + 10)
                                                                   )));
                   break;
   case tsDecreaseInt:
                   StringGrid1->Canvas->Polygon(OPENARRAY (TPoint, (
                                Point(rRect.Right - 13, rRect.Top + 5),
                                Point(rRect.Right - 10, rRect.Top + 10),
                                Point(rRect.Right - 8, rRect.Top + 5)
                                                                   )));
                   break;
  }
 }
}


Gdybyś chciał posortować wybraną kolumnę klikając np. na przycisku Button1 to wystarczy funkcji SortGrid przekazać jako pierwszy argument wskaźnik na obiekt, który ma być sortowany, jako drugi argument kolumna w oparciu o którą cała tabela będzie sortowana, a jako trzeci argument sposób sortowania:

KOD cpp:     UKRYJ  
void __fastcall TForm2::Button1Click(TObject *Sender)
{    /* sortowanie rosnąco wegług liczb */
 SortGrid(StringGrid1, 1, tsIncreaseInt);
}


Sortowanie na cztery sposoby:
  • tsIncrease - zawartość komórek traktowana tylko jako tekst - sortowanie rosnąco
  • tsDecrease - zawartość komórek traktowana tylko jako tekst - sortowanie malejąco
  • tsIncreaseInt - zawartość komórek traktowana najpierw jako liczby, potem jako tekst o ile zawierają wartości nie będące liczbą - sortowanie rosnąco
  • tsDecreaseInt - zawartość komórek traktowana najpierw jako liczby, potem jako tekst o ile zawierają wartości nie będące liczbą - sortowanie malejąco
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez mufasa » wtorek, 1 lutego 2011, 13:53

Co do ostatniego problemu ► patrz serwis: Cyfrowy Baron dział: porady -> kursy praktyczne -> Baza danych. Jest tam kod odpowiedzialny za wczytywanie danych z pliku tekstowego bezpośrednio do tabeli TStringGrid, a separator sobie ustawisz. Kod musisz oczywiście dostosować do własnych potrzeb.
Możesz również skorzystać z porady: Zapisywanie i odczytywanie zawartości obiektu StringGrid. w dziale: porady -> StringGrid.




Kod: Zaznacz cały
//--- FUNKCJA PRZEPISUJĄCA TEKST DO KOMÓREK I ODCZYUJĄCA SZEROKOŚĆ KOLUMN ---
AnsiString SetCellText(AnsiString txt, AnsiString Wtxt, int &Size, int Col)
{
String txt_1 = "", txt_2 = "";
for(int i = -1; i < Col; i++)
{
  int q = 0;
  int t = txt.AnsiPos(";\"");
  if(i >= 0)
   q = Wtxt.AnsiPos(";");
  txt_1 = txt.SubString(2, t - 3);
  if(i >= 0)
   txt_2 = Wtxt.SubString(1, q - 1);

  if(t > 0)
   txt = txt.Delete(1, t);
  else
   txt_1 = txt.SubString(2, txt.Length() - 2);

  if(i >= 0)
  {
   if(q > 0)
    Wtxt = Wtxt.Delete(1, q);
   else
    txt_2 = Wtxt.SubString(1, Wtxt.Length() - 1);
  }
}
Size = txt_2.ToInt();
if(txt_1.SubString(txt_1.Length() - 1, txt_1.Length() + 1) == ";'")
  txt_1 = txt_1.Delete(txt_1.Length(), txt_1.Length() + 1);

return txt_1;
}
//--- FUNKCJA ODCZYTUJĄCA TABELĘ Z PLIKU ------------------------------------
void __fastcall TForm1::LoadGridFromFile(AnsiString FileName, TStringGrid *Grid)
{
TStringList *Lista = new TStringList;
Lista->LoadFromFile(FileName);
SetColRow(Lista->Strings[0], Grid);

for(int i = zmienna; i <=zmienna; i++)
{
  for(int j = 0; j < Grid->ColCount; j++)
  {
   int Size;
   Grid->Cells[j][i] = SetCellText(Lista->Strings[i + 2], Lista->Strings[1], Size, j + 1);
   Grid->ColWidths[j] = Size;
  }
}
delete Lista;
}
//--------------------------------




Kod: Zaznacz cały
void __fastcall TForm1::Button5Click(TObject *Sender)
{         



     
           zmienna++;  //zmienna globalna
             LoadGridFromFile("Nazwa_pliku.roz", StringGrid1, zmienna);
     
}


Robię coś takiego, zczytuje mi ale nie do końca jak chciałem, zamierzeniem było zczytywanie linia po linii po wciśnięciu buttona.
Teraz gdy już załaduje jedną linie, po wciśnięciu buttona i wczytaniu kolejnej poprzednia linia jest kasowana a chodzi o to żeby ona tam została
Avatar użytkownika
mufasa
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): poniedziałek, 31 stycznia 2011, 17:36
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: c++ builder 6 enterprise
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez Cyfrowy Baron » wtorek, 1 lutego 2011, 14:04

Wczytuje Tobie cały czas do tego samego wiersza tabeli StringGrid. Przejrzyj kod i sprawdź który fragment odpowiada za wprowadzanie tekstu do wybranego wiersza, a gdy już to znajdziesz to wystarczy kod tak zmodyfikować, by po każdym kliknięciu przycisku zmieniał się numer wiersza do którego tekst jest wprowadzany.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez mufasa » wtorek, 1 lutego 2011, 14:48

Ok znalazłem
Kod: Zaznacz cały
//--- FUNKCJA PRZEPISUJĄCA TEKST DO KOMÓREK I ODCZYUJĄCA SZEROKOŚĆ KOLUMN ---
AnsiString SetCellText(AnsiString txt, AnsiString Wtxt, int &Size, int Col)
{
String txt_1 = "", txt_2 = "";
for(int i = -1; i < Col; i++)
{
  int q = 0;
  int t = txt.AnsiPos(";\"");
  if(i >= 0)
   q = Wtxt.AnsiPos(";");
  txt_1 = txt.SubString(2, t - 3);
  if(i >= 0)
   txt_2 = Wtxt.SubString(1, q - 1);

  if(t > 0)
   txt = txt.Delete(1, t);
  else
   txt_1 = txt.SubString(2, txt.Length() - 2);

  if(i >= 0)
  {
   if(q > 0)
    Wtxt = Wtxt.Delete(1, q);
   else
    txt_2 = Wtxt.SubString(1, Wtxt.Length() - 1);
  }
}
Size = txt_2.ToInt();
if(txt_1.SubString(txt_1.Length() - 1, txt_1.Length() + 1) == ";'")
  txt_1 = txt_1.Delete(txt_1.Length(), txt_1.Length() + 1);

return txt_1;
}
//--- FUNKCJA ODCZYTUJĄCA TABELĘ Z PLIKU ------------------------------------
void __fastcall TForm1::LoadGridFromFile(AnsiString FileName, TStringGrid *Grid)
{
TStringList *Lista = new TStringList;
Lista->LoadFromFile(FileName);
SetColRow(Lista->Strings[0], Grid);

for(int i = 0; i <=zmienna; i++)
{
  for(int j = 0; j < Grid->ColCount; j++)
  {
   int Size;
   Grid->Cells[j][i] = SetCellText(Lista->Strings[i + 2], Lista->Strings[1], Size, j + 1);
   Grid->ColWidths[j] = Size;
  }
}
delete Lista;
}
//--------------------------------


Teraz jeszcze jedno pytanie, miałem na starcie załadowane do StringGrida jakieś dane które miałem uzupełnić poprzez tą funkcje wprowadzającą zmiany linia po linii, z tym, że teraz jeśli dobrze wprowadza mi dane, to usuwa mi te które były wprowadzone wcześniej.
Przykład mam wprowadzone nazwiska imiona, i teraz mam dociągnąć do nich zdobyte punkty i punkty zostają a dane są usuwane. Jest na to jakiś sposób ?
Avatar użytkownika
mufasa
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): poniedziałek, 31 stycznia 2011, 17:36
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: c++ builder 6 enterprise
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez Cyfrowy Baron » wtorek, 1 lutego 2011, 16:15

Ja Ciebie zupełnie nie rozumiem, przecież StringGrid to nie jest jakaś magiczna tabelka, to zwykła tabela taka jak w Excel tylko dużo mniejszych możliwościach, cokolwiek wprowadzasz do komórki to zastępujesz tym to co w tej komórce się znajduje. Czego nie rozumiesz? Napisz kod tak by dopisywał dane, a nie je zastępował. Do komórek tabeli odwołujesz się poprzez właściwość Cells[nr kolumny][nr wiersza].
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez mufasa » środa, 2 lutego 2011, 03:26

Hej mógłby ktoś spojrzeć co jest źle w tym programie. Problem polega na tym, że StringGrid jest sortowany przy każdym wpisaniu nowych wartości do tabeli. Program sortuje dobrze ale podmienia rekordy w trakcie pracy
Przykład:
Małysz był na pierwszym miejscu z odległością 140 punktów a po kolejnym przebiegu jest dalej na pierwszym miejscu z odległością 120 punktów. I niewiem co jest grane. Sortowanie odbywa się po kolumnie z punktami
Będę wdzięczny za każdą odpowiedź
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
mufasa
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): poniedziałek, 31 stycznia 2011, 17:36
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: c++ builder 6 enterprise
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez mufasa » wtorek, 8 lutego 2011, 01:26

Mam taki problem funkcja sortująca działa z tym że przemienia wartości w innych kolumnach StringGrida
mianowicie mamy tak:

imię ; nazwisko ; odległość ; punkty
adam ; wąski ; 130 ; 240
mariusz ; karski ; 110 ; 220

po sortowaniu mamy:

imię ; nazwisko ; odległość ; punkty
mariusz ; karski ; 110 ; 240
adam ; wąski ; 130 ; 220

Po punktach sortuje dobrze lecz inne kolumny nie są zgrywane Wiecie może co jest nie tak?

Kod: Zaznacz cały
void __fastcall SortGrid(TStringGrid *Grid, int Col, TTypeSort tsSort)
{ /* funckja sortująca */

        TStringList *SortList = new TStringList;
        String temp = "";

        for(int i = Grid->FixedRows; i < Grid->RowCount; i++)
        {
                temp = Grid->Cells[Col][i];
                if(temp.IsEmpty()) temp = " ";
                for(int z = Grid->FixedCols; z <= Grid->ColCount; z++)
                {
                        if(Grid->Cells[z][i].IsEmpty()) Grid->Cells[z][i] = " ";
                         if(z != Col)
                                 temp = temp + "^" + Grid->Cells[z][i];

                 }
                 SortList->Add(temp.SubString(0, temp.Length() - 1));
                temp = "";
        }

        switch(tsSort)
        {
                 case tsIncrease:    SortList->CustomSort(CustomSortIncrease); break;
                 case tsIncreaseInt: SortList->CustomSort(CustomSortIncreaseInt); break;
                 case tsDecrease:    SortList->CustomSort(CustomSortDecrease); break;
                 case tsDecreaseInt: SortList->CustomSort(CustomSortDecreaseInt); break;
         }

         temp = "";

        for(int i = 0; i < SortList->Count; i++)
         {
                temp = SortList->Strings[i];

                 int y = temp.Pos("^");
                Grid->Cells[Col][i + 1] = temp.SubString(1, y - 1).Trim();
                 temp = temp.Delete(1, y);
                int z;
                 for(z = Grid->FixedCols; z < Grid->ColCount; z++)
                 {
                        if(z != Col)
                        {
                                y = temp.Pos("^");
                                Grid->Cells[z][i + 1] = temp.SubString(1, y - 1).Trim();
                                temp = temp.Delete(1, y);
                        }
                }
                z++;
                y = temp.Pos("^");
                Grid->Cells[z][i + 1] = temp.SubString(1, y - 1).Trim();
                temp = temp.Delete(1, y);
        }

        delete SortList;
}



Kod: Zaznacz cały
int __fastcall CustomSortDecreaseInt(TStringList *Lista, int idx1, int idx2)
{  /* sortowanie malejąco wg. liczb */
        String cTemp1 = Lista->Strings[idx1];
        String cTemp2 = Lista->Strings[idx2];
        int x1 = cTemp1.Pos("^");
        int x2 = cTemp2.Pos("^");
        int rTemp1 = cTemp1.SubString(1, x1 - 1).Trim().ToIntDef(0);
        int rTemp2 = cTemp2.SubString(1, x2 - 1).Trim().ToIntDef(0);

        return -foo(rTemp1, rTemp2);
}


a tak wywołuje
Kod: Zaznacz cały
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  SortGrid(StringGrid2, 7, tsDecreaseInt);
}
Avatar użytkownika
mufasa
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): poniedziałek, 31 stycznia 2011, 17:36
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: c++ builder 6 enterprise
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez Cyfrowy Baron » wtorek, 8 lutego 2011, 08:52

Funkcja sortująca działa tak jak została zaprogramowana, czyli z samymi funkcjami jest wszystko w porządku. Przy tworzeniu tych funkcji przyjąłem założenie, że wartości w kolumnach są ze sobą powiązane, więc sortowanie powinno odbywać się całymi wierszami tak by te powiązania pozostały.
Jeżeli masz np. w wierszu takie wartości:

mariusz ; karski ; 110 ; 240

to czy nie powinny one być ze sobą powiązane. Sortujesz kolumnę z imieniem mariusz, ale przecież mariusz jest przypisane do karski, więc czy po sortowaniu tej kolumny nie powinno pozostać powiązanie mariusz z karski. Jeżeli zrezygnujesz z tych powiązać to po sortowaniu będziesz miał np.

adam ; karski ; 110 ; 220
mariusz ; wąski ; 130; 240

Jak widać po sortowaniu adam wąski stał się a adamem karskim a mariusz karski - adamem wąskim.
Według Ciebie sortowanie, które gubi powiązania komórek jest prawidłowe?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Sortowanie StringGrid

Nowy postprzez mufasa » wtorek, 8 lutego 2011, 12:00

Według Ciebie sortowanie, które gubi powiązania komórek jest prawidłowe?!

No oczywiście, że nie jest prawidłowe, napisałem tylko, że po zastosowaniu tej funkcji funkcja sortująca działa do pewnego momentu, a poźniej gubi powiązania i niewiem właśnie dlaczego gdyż powinno być wszystko ze sobą ładnie powiązane
Avatar użytkownika
mufasa
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): poniedziałek, 31 stycznia 2011, 17:36
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: c++ builder 6 enterprise
Gadu Gadu: 0
    MacintoshSafari

Następna strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości