CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Zanikanie siatki StringGrid przy wyrównywaniu tekstu
Strona 1 z 1

Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postNapisane: środa, 3 sierpnia 2011, 20:09
przez Pitek
Witam!

Mam problem, podczas wyrównywania tekstu funkcja za to odpowiedzialna powoduje efekt częściowego zanikania siatki StringGrid (lepszy obraz sytuacji w załączniku).
Moje pytanie, czy da się temu jakoś zaradzić jest to dla mnie istotne aby tak się nie działo.

Pozdrawiam

Re: Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postNapisane: środa, 3 sierpnia 2011, 21:48
przez Cyfrowy Baron
Bez kodu, który za to odpowiada nic ni da się zrobić. Prawdopodobnie Twój kod wyrównujący tekst w komórkach rysuje poza komórkami.

► patrz serwis: Cyfrowy Baron dział: porady -> StringGrid -> Wyrównywanie tekstu w komórkach obiektu StringGrid.

Re: Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postNapisane: środa, 3 sierpnia 2011, 22:57
przez Pitek
Tak naprawdę to nie mój a Pana kod właśnie z tej podanej porady.
U mnie wygląda on tak :
KOD cpp:     UKRYJ  
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
          TGridDrawState State)
{
// Podwietlanie zer - czerwona czcionka oraz pogrubienie

StringGrid1->Canvas->Brush->Color = StringGrid1->Canvas->Brush->Color;
StringGrid1->Canvas->FillRect(Rect);

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


// Wyroznienie niedostatecznych

if( ACol == 46 )
{
        if(StringGrid1->Cells[ACol][ARow] == "niedostateczny")
        {
        StringGrid1->Canvas->Font->Style = StringGrid1->Canvas->Font->Style << fsUnderline;
        StringGrid1->Canvas->Brush->Color = clRed;
        StringGrid1->Canvas->FillRect(Rect);
        StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);
        }
}


// Podswietlanie zer - czerwona komorka

//if( (ACol >=2 && ACol <=41) && (ARow >=1 && ARow <=38) )
//{
//              if(StringGrid1->Cells[ACol][ARow] == "0")
//              {
//                      StringGrid1->Canvas->Brush->Color = clRed;
//                      StringGrid1->Canvas->FillRect(Rect);
//                      StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);
//              }
//}


// Wyrownanie - do srodka

if( (ACol >=2 && ACol <=46) && (ARow >=0 && ARow <=38) )
{
Alignment(StringGrid1->Canvas, StringGrid1->Cells[ACol][ARow], Rect, algCenter);
}

}
//---------------------------------------------------------------------------

Reszta kodu aby funkcja Alignment mogła działać jest napisana dokładnie jak w poradzie.

Re: Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postNapisane: środa, 3 sierpnia 2011, 23:20
przez Pitek
Problem rozwiązany ale nie jestem pewien co do jego poprawności. Mianowicie chodziło o kod kolorowania zer na czerwono zamiast takiego kodu :
KOD cpp:     UKRYJ  
// Podwietlanie zer - czerwona czcionka oraz pogrubienie

StringGrid1->Canvas->Brush->Color = StringGrid1->Canvas->Brush->Color;
StringGrid1->Canvas->FillRect(Rect);

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

Dałem taki :
KOD cpp:     UKRYJ  
// Podwietlanie zer - czerwona czcionka oraz pogrubienie

//StringGrid1->Canvas->Brush->Color = StringGrid1->Canvas->Brush->Color;
//StringGrid1->Canvas->FillRect(Rect);

if( (ACol >=2 && ACol <=41) && (ARow >=1 && ARow <=38) )
{
                if(StringGrid1->Cells[ACol][ARow] == "0")
                {
                StringGrid1->Canvas->Font->Color = clRed;
                StringGrid1->Canvas->Font->Style = StringGrid1->Canvas->Font->Style << fsBold;
                }
//StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);
}

Po prostu bez tych dodatkowych poleceń i nie dość że to działa to jeszcze bez błędnie. Moja obawa jest tylko taka czy to będzie bez tych trzech linijek zawsze działać poprawnie. Sądzę że w moim przypadku tak ponieważ tabela StringGrid ma wyłączone edytowanie bezpośrednie a wprowadzanie danych odbywa się za pomocą funkcji z innych okien.

Jeżeli moje rozumowanie jest błędne to proszę o zrozumienie i wytłumaczenie za co z góry dziękuję ;)

Re: Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postNapisane: czwartek, 4 sierpnia 2011, 10:16
przez polymorphism
Nie wiem, czy to da się zrobić z poziomu VCL-a, ale możesz wyłączyć malowanie tła dla napisów funkcją SetBkMode:
KOD cpp:     UKRYJ  
SetBkMode(StringGrid1->Canvas->Handle, TRANSPARENT);
StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);

Re: Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postNapisane: sobota, 6 sierpnia 2011, 00:24
przez Pitek
Funkcja SetBkMode działa doskonale. Ale dręczy mnie jeszcze temat pozostałych dwóch linijek nie do końca wiem po co one są w dodatku bez nich jest ok a z nimi mam czasem błędy w tabeli. Bardzo proszę o wyjaśnienie. ;)

Re: Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postNapisane: sobota, 6 sierpnia 2011, 08:17
przez Cyfrowy Baron
Metoda Brush->Color ustala kolor wypełnienia obszaru. Metoda Brush->Style określa sposób wypełnienia obszaru. Metoda FillRect wypełnia zdefiniowany obszar kolorem i stylem określonym w Brush. Metoda TextOut wpisuje tekst z tłem nieprzeźroczystym o ile Brush->Style jest różne od bsClear, w przeciwnym razie wpisywany tekst ma tło przeźroczyste. W Twoim kodzie błędy wynikają z niewłaściwej kolejności wywoływanych metod. Wiedząc to co napisałem wyżej powinieneś ustalić taką kolejność wywoływania funkcji, która nie będzie prowadzić do błędów.
Jeżeli w zdarzeniu OnDrawCell wywołujesz funkcje FillRect i/lub TextOut poza jakimkolwiek warunkiem, to odnoszą się one do wszystkich komórek tabeli, gdy jednak wywołujesz te funkcje w jakimś warunku to odnoszą się one tylko do komórek określonych w tymże warunku. Istotna jest więc tutaj kolejność wywoływania funkcji poza warunkiem i w warunku.