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

Zanikanie siatki StringGrid przy wyrównywaniu tekstu

dział ogólny

Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postprzez Pitek » środa, 3 sierpnia 2011, 20:09

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
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
https://www.pg-elektronika.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Firefox

Re: Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postprzez Cyfrowy Baron » środa, 3 sierpnia 2011, 21:48

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postprzez Pitek » środa, 3 sierpnia 2011, 22:57

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.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
https://www.pg-elektronika.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Firefox

Re: Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postprzez Pitek » środa, 3 sierpnia 2011, 23:20

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ę ;)
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
https://www.pg-elektronika.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Firefox

Re: Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postprzez polymorphism » czwartek, 4 sierpnia 2011, 10:16

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]);
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postprzez Pitek » sobota, 6 sierpnia 2011, 00:24

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. ;)
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
https://www.pg-elektronika.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows 7Firefox

Re: Zanikanie siatki StringGrid przy wyrównywaniu tekstu

Nowy postprzez Cyfrowy Baron » sobota, 6 sierpnia 2011, 08:17

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • 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 1 gość

cron