Generowanie TStringgrid a kolorowanie tekstu - błędy

0

Witam
Mam tabele w TStringgrid w której koloruje zależnie od potrzeb tekst w wierszach.
Robię to używając zdarzenia PrepareCanvas.
I nie wiem czy ja używam złego zdarzenia czy to błąd kompilatora (obsługi winapi ).

title

Czasem kolorowanie jest przesunięte, a gdy treść wymaga przewinięcia to część niewidoczna na początku okazuje się być pokolorowana z błędami

3

czemu nie użyjesz zdarzenia OnDrawCell ?

0

Opssss
Zasugerowałem się nazwą procedury - to działa na OnOnDrawCell

Przechwytywanie2.PNG

0

No to pokaż kod, bo jak w kodzie ok to raczej niemożliwe zawsze dobrze działało przynajmniej u mnie.

0

Oto procedurka :

procedure TForm1.tabelkaPrepareCanvas(Sender: TObject; aCol, aRow: integer;      //             MALOWANIE WIERSZY  - GLOWNA TABELA
  aState: TGridDrawState);
var
  stan: integer;
begin
  if TrybWyswietlaniaTabeli.ItemIndex = 1 then stan := 9  else  stan := 6;
  with TStringGrid(Sender) do
  begin
      case tabelka.Cells[stan, aRow] of
        'na czerwono':
        begin
          Font.Color := clRed;
          font.Bold:=true;
        end;
        'na zielono':
        begin
              Font.Color := clGreen;
               font.Bold:=true;
        end;
        'na niebiesko':
        begin
          Font.Color := clBlue;
          font.Bold:=false;
        end;
        else
          Font.Color := clDefault;
          font.Bold:=false;
      end;

  end;
end; 

Jak zaczynam klikać po tabeli sytuacja się normuje - ale tylko w obszarze który akurat widzę

0

I jak tam - jakieś pomysły ? Przesiadka na 2.0.0 niestety nic nie wniosła :/ w tej kwestii.

2

Nie spotkałem się z tym wcześniej, działający przykład w załączniku.

0

Heh - nie wiem dlaczego zrezygnowałem z PrepareCanvas na rzecz DrawCell - ale okazało się iż było to błędem - po powrocie do domyślnego zdarzenia PrepareCanvas (tak jak w załączonym przez Pawła przykładzie ) wszystko wróciło do normy.
Dzięki

1

@titako: zdarzenie OnPrepareCanvas służy jedynie do inicjalizacji ustawień płótna przed jego renderowaniem, którym zajmuje się wewnętrznie zdefiniowany mechanizm i jemu powierza się namalowanie zawartości w komponencie. Natomiast OnDrawCell jest zdarzeniem wykonawczym, w którym kod renderujący należy w całości zdefiniować samemu – dzięki temu ma się pełną kontrolę nad wyglądem komórek.

Tak więc zdarzenie powinieneś dobrać w zależności od wymagań, tak aby je spełnić jak najmniejszą ilością kodu i w jak najmniejszym stopniu ingerować w wewnętrzne mechanizmy. W Twoim przypadku OnPrepareCanvas jest wystarczające – ustawiasz styl fontu i niech resztą zajme się domyślny mechanizm malowania komórek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1