StringGrid kolorowanie tła wiersza

0

Jak wprowadzić inne tło wiersza dla takich samych identyfikatorów

np :wiersz1 oddz1. .............................
wiersz2 oddz1. .............................
wiersz3 oddz2. .............................
wiersz4 oddz2..............................
wiersz5 oddz3..............................
wiersz6 oddz3..............................

Chodzi mi o to aby wszystkie oddz1 miały ten sam kolor tła
a wiersze z oddz2 bez tła
następny znowu ten sam kolor co oddz1 i tak naprzemian
wystarczy jeden kolor ,aby oddzielic wizualnie takie same oddziały

Jan
[email protected]

0

Są dwa wyjścia:

  1. możesz poszukać w sieci komponentu który to umożliwia
  2. możesz znienić właściwość DefaultDrawing na false i skorzystać z obsługi zdarzenia OnDrawGrid które jest wywoływane przy rysowaniu każdej komórki. W ten sposób możesz zrobić w każdej komórce co tylko chcesz. Możesz nie tylko zmienić kolor tła, ale możesz wstawić obrazek, zmienić czcionkę i co tylko jeszcze wymyślisz.

Pierwsze rozwiązanie jest oczywiście łatwiejsze.
Drugie daje więcej możliwości.

0

Są dwa wyjścia:

  1. możesz poszukać w sieci komponentu który to umożliwia
  2. możesz znienić właściwość DefaultDrawing na false i skorzystać z obsługi zdarzenia OnDrawGrid które jest wywoływane przy rysowaniu każdej komórki. W ten sposób możesz zrobić w każdej komórce co tylko chcesz. Możesz nie tylko zmienić kolor tła, ale możesz wstawić obrazek, zmienić czcionkę i co tylko jeszcze wymyślisz.

Pierwsze rozwiązanie jest oczywiście łatwiejsze.
Drugie daje więcej możliwości.

============================
W dalszym ciagu nie do końca wiem
o co chodzi bo w eventach mam tylko ondrawcell ale nie o to chodzi..

Może Inaczej : Mam wybrany programowo obszar
STRINGGRID tak

{od kursora takie same pola sa zaznaczone}

procedure TMainForm.Bajer(Sender: TObject);
var
l,kx: integer;
g: Tgridrect;
begin
L:=stringgrid1.row;
for kx:=stringgrid1.row to ss do begin
with stringgrid1 do begin
if cells[1,stringgrid1.row]=cells[1,kx+1] then
begin
g.left:=1;
g.top:=l; {y1 wiersz }
g.bottom:=kx+1 ;
g.right:=8; {y2}
stringgrid1.selection:=g;
end;
end;
end;
end;

a teraz bym chciał zmienic kolor w wybranym prostokącie TGRID
jak to zrobic?

Interesuje mnie konkretnie jedno polecenie
typu: zmień tło dla jednego wiersza

dla całego stringgrida nie ma problemu po prostu robię:

if colorDialog1.Execute then
stringGrid1.color:= ColorDialog1.Color;

ale mnie interesuje instrukcja zmiany tła jednego wiersza w programie a nie poprzez ustawienia ,gdyz chcę zmienic kolor wiersza wtedy gdy zajdzie okreslony warunek
Jan

0

Niestety nie ma prostego rozwiązania tego problemu. W zwykłym StringGrid nie ma możliwości zmiany koloru jednego wiersza za pomocą właściwości. Jest to możliwe tylko dla całego StringGrid.

W sieci są dostępne komponenty podobne do StringGrid które to umożliwiają. O ile mnie pamięć nie myli to było coś takiego jak TColorizedStringGrid.(ten lub podobny - jest ich kilka).

Co do drugiego rozwiązania - nie wyklucza ono kolorowania tylko określonych wierszy czy obszarów (i nieważne czy zawsze czy tylko po spełnieniu warunku).

Do procedury obsługi zdarzenia OnDrawGrid dostarczane są parametry:

  • Sender : TObject - ten nas raczej nie intertesuje
  • ARow : Integer - to jest numer wiersza który jest rysowany
  • ACol : Integer - to jest numer kolumny która jest rysowana
  • Rect : TRect - obszar w którym znajduje się komórka do narysowania
  • State : TGridState - ten też raczej nie będzie potrzebny

Procedura ta jest wywoływana dla każdej widocznej komórki osobno przy każdej jej rysowaniu.

Więc jeżeli chcesz na przykład aby komórki w prostokącie o współrzędnych : lewy górny róg (2,2) , prawy dolny (3,5) były na czerwonym tle to procedura powinna wyglądać mniej więcej tak:

if warunek then
if (ACol &gt= 2 and ACol &lt= 3) and(ARow &gt=3 and ARow &gl= 5) then do begin
StringGrid1.Canvas.Brush.Color:= //tutaj ustaw kolor tła
StringGrid1.Canvas.Rectangle(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow] );
end;

Tym sposobem jeżeli warunek bęsdzie prawdziwy i współrzędne odpowiednie to będzie inny kolor tła.
Oczywiście zamiast stałych we współrzędnych użyj zmiennych i wstaw warunek jaki potrzebujesz.
I jeszcze jedno w tym przypadku nie zmieniaj właściwości DefaultDrawing. Pozostaw true.

Powodzenia!

0

Niestety nie ma prostego rozwiązania tego problemu. W zwykłym StringGrid nie ma możliwości zmiany koloru jednego wiersza za pomocą właściwości. Jest to możliwe tylko dla całego StringGrid.

W sieci są dostępne komponenty podobne do StringGrid które to umożliwiają. O ile mnie pamięć nie myli to było coś takiego jak TColorizedStringGrid.(ten lub podobny - jest ich kilka).

Co do drugiego rozwiązania - nie wyklucza ono kolorowania tylko określonych wierszy czy obszarów (i nieważne czy zawsze czy tylko po spełnieniu warunku).

Do procedury obsługi zdarzenia OnDrawGrid dostarczane są parametry:

  • Sender : TObject - ten nas raczej nie intertesuje
  • ARow : Integer - to jest numer wiersza który jest rysowany
  • ACol : Integer - to jest numer kolumny która jest rysowana
  • Rect : TRect - obszar w którym znajduje się komórka do narysowania
  • State : TGridState - ten też raczej nie będzie potrzebny

Procedura ta jest wywoływana dla każdej widocznej komórki osobno przy każdej jej rysowaniu.

Więc jeżeli chcesz na przykład aby komórki w prostokącie o współrzędnych : lewy górny róg (2,2) , prawy dolny (3,5) były na czerwonym tle to procedura powinna wyglądać mniej więcej tak:

if warunek then
if (ACol >= 2 and ACol =3 and ARow &gl= 5) then do begin
StringGrid1.Canvas.Brush.Color:= //tutaj ustaw kolor tła
StringGrid1.Canvas.Rectangle(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow] );
end;

Tym sposobem jeżeli warunek bęsdzie prawdziwy i współrzędne odpowiednie to będzie inny kolor tła.
Oczywiście zamiast stałych we współrzędnych użyj zmiennych i wstaw warunek jaki potrzebujesz.
I jeszcze jedno w tym przypadku nie zmieniaj właściwości DefaultDrawing. Pozostaw true.

Powodzenia!

Dziękuję najpiękniej jak tylko potrafię za zainteresowanie tematem i fachową odpowiedź to działa! [hurra]

Jan

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