CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - BCB6 Stringgrid

BCB6 Stringgrid

dział ogólny

BCB6 Stringgrid

Nowy postprzez Manianass » niedziela, 7 maja 2017, 17:42

Witam, zatrzymałem się z pisaniem programu na kolorowaniu komórek che żeby w zależności od wartości zmiennie zmieniał się kolor w odpowiedniej komórce w StringGrid.

Przykład :
a=5 kolor tekstu zielony
a=0 kolor tekstu żółty
a=0 kolor tekstu czerwony
Jak by jeszcze można było zmieniać kolor tła w komórce to by było super.

Patrzyłem na stronie http://programowanie.cal.pl/cyfbar/stri ... html#grid4 ale jakość nic mi to nie pomogło nadal stoję w miejscu.
Proszę o jakiś kawałek kodu w miarę łatwego do zrozumienia .
Może być jakiś inny komponent w którym się da zmienić kolor, teraz w programie korzystam z ListBox-a, ale nie wiem czy on ma taka opcje.
Avatar użytkownika
Manianass
Bladawiec
Bladawiec
 
Posty: 27
Dołączył(a): środa, 11 listopada 2015, 00:45
Lokalizacja: Lubin
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Builder C++
Gadu Gadu: 0
    Windows 7Chrome

Re: BCB6 Stringgrid

Nowy postprzez Cyfrowy Baron » poniedziałek, 8 maja 2017, 08:38

Zmiana koloru czcionki dla wybranej komórki obiektu StringGrid. > http://programowanie.cal.pl/cyfbar/stri ... html#grid4
Zmiana stylu czcionki dla wybranej komórki obiektu StringGrid. > http://programowanie.cal.pl/cyfbar/stri ... html#grid5
Określanie koloru dla wybranej komórki obiektu StringGrid. > http://programowanie.cal.pl/cyfbar/stri ... html#grid6

W przypadku zmiany koloru czcionki masz podany taki kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
 StringGrid1->Canvas->Brush->Color = StringGrid1->Canvas->Brush->Color;
 StringGrid1->Canvas->FillRect(Rect);

 if(ACol == 2 && ARow == 1)
    {
     StringGrid1->Canvas->Font->Color = clRed;
    }
 StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);
}


Teraz wystarczy niewielka modyfikacja, by pasował do twoich potrzeb:

KOD cpp:     UKRYJ  
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
                  TRect &Rect, TGridDrawState State)
{
 if(ACol >= StringGrid1->FixedCols && ARow >= StringGrid1->FixedRows)
 {
  StringGrid1->Canvas->Brush->Color = StringGrid1->Canvas->Brush->Color;
  StringGrid1->Canvas->FillRect(Rect);
 }

 int iColor = StringGrid1->Cells[ACol][ARow].ToIntDef(0);
 TColor sColor;

 switch(iColor)
 {
        case 1: sColor = (TColor)0x00CCDE85; break;
        case 2: sColor = clBlue; break;
        case 3: sColor = clYellow; break;
        case 4: sColor = clNavy; break;
        case 5: sColor = clRed; break;
        case 6: sColor = clGreen; break;
        default: sColor = clBlack;
 }

 StringGrid1->Canvas->Font->Color = sColor;
 StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);
}


Jeżeli w C++Builder 6 nie występuje funkcja ToIntDef zrób tak:

KOD cpp:     UKRYJ  
 int iColor;
 try{ iColor = StringGrid1->Cells[ACol][ARow].ToInt(); } catch(...){ iColor = 0; }


A z przerobieniem kodów już sam sobie poradzisz. Pamiętaj tylko, że zmiany koloru czcionki w zdarzeniu OnDrawCell należy dokonywać przed innymi zadaniami np. przed wyrównywaniem tekstu w komórkach, czyli najpierw ustawiamy właściwości czcionki a dopiero potem określamy pozostałe działania. Dzieje się tak dlatego, że w zdarzeniu OnDrawCell rysowany jest arkusz i tekst w poszczególnych komórkach, a rysowanie odbywa się za każdym razem gdy zostaną wprowadzone jakiekolwiek zmiany w tabeli StringGrid.
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 7Firefox

Re: BCB6 Stringgrid

Nowy postprzez Manianass » poniedziałek, 8 maja 2017, 18:02

Trochę rozjaśniło Mi to w głowie , znaczy już wiem ze to sprawdza co jest w danej komórce i ustawia dany kolor.
Trochę zmieniłem kod żeby działało trochę inaczej znaczy teraz działa prawie tak jak chcę czyli jak napotka w komórce :
- "ok" to zmienia kolor na zielony
- "Znaleziono" to zmienia na Niebieski
reszta jest wyświetlana na czerwono ale tez wyświetla na czerwono kolumnie pierwszą.

I teraz pytanko czy można zmieniać kolor w każdej komórce osobno,
na przykład StringGrid1->Cells[0][1] = clRed;
KOD cpp:     UKRYJ  
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{

 if(ACol >= StringGrid1->FixedCols && ARow >= StringGrid1->FixedRows)
 {
  StringGrid1->Canvas->Brush->Color = StringGrid1->Canvas->Brush->Color;
  StringGrid1->Canvas->FillRect(Rect);
   StringGrid1->Canvas->Font->Style = StringGrid1->Canvas->Font->Style << fsBold;
 }

String iColor = StringGrid1->Cells[ACol][ARow];
 TColor sColor;
 if (iColor=="Ok")
  {
    sColor = clGreen;
  }
 else if (iColor=="Znaleziono")
  {
   sColor = clBlue;
  }
 else
  {
   sColor = clRed;
  }
 /*
 switch(iColor)
 {
        case 1: sColor = (TColor)0x00CCDE85; break;
        case 2: sColor = clBlue; break;
        case 3: sColor = clYellow; break;
        case 4: sColor = clNavy; break;
        case 5: sColor = clRed; break;
        case 6: sColor = clGreen; break;
        default: sColor = clBlack;
 }
*/

 StringGrid1->Canvas->Font->Color = sColor;
 StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
StringGrid1->Cells[0][1] = "Miedz ";
StringGrid1->Cells[0][2] = "Złoto ";
StringGrid1->Cells[0][3] = "Aluminium ";

StringGrid1->Cells[1][1] = "Ok";
StringGrid1->Cells[1][2] = "Zawalono ";
StringGrid1->Cells[1][3] = "Znaleziono";
}
//---------------------------------------------------------------------------
 



I nagle dostałem olśnienia :) i powstał taki kod

KOD cpp:     UKRYJ  
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
 StringGrid1->Canvas->Brush->Color = StringGrid1->Canvas->Brush->Color;
 StringGrid1->Canvas->FillRect(Rect);

 if(ACol == 0 && ARow == 1)
  {
    StringGrid1->Canvas->Font->Color = clRed;
  }

 if(ACol == 1 && ARow == 1)
  {
   String iColor = StringGrid1->Cells[ACol][ARow];
   TColor sColor;
   Label1->Caption=iColor;
   if (iColor==" Ok")
    {
     sColor = clGreen;
    }
   else if (iColor=="Znaleziono")
    {
     sColor = clBlue;
    }
   else
    {
     sColor = clRed;
    }
   StringGrid1->Canvas->Font->Color = sColor;
  }
 StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);
}


i działa. Ale jak jest jakiś lepszy albo inny sposób to proszę o info.

Dziękuję Marcin.
Avatar użytkownika
Manianass
Bladawiec
Bladawiec
 
Posty: 27
Dołączył(a): środa, 11 listopada 2015, 00:45
Lokalizacja: Lubin
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Builder C++
Gadu Gadu: 0
    Windows 7Chrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

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 43 gości

cron