Jak sprawdzić kolor komórki w DrawGrid

0

Zabrałem się za programowanie w Lazarusie i trafiłem na pewien problem. Muszę użyć komponentu DrawGrid. Potrafię zmienić kolor dowolnej komórki,

DrawGrid1.Canvas.PEN.Color:=clMenuHighlight;
DrawGrid1.Canvas.Brush.Color:=clRed;
DrawGrid1.Canvas.Rectangle(DrawGrid1.CellRect(2,3));

ale w jaki sposób odczytać kolor, którym aktualnie pokolorowana jest komórka? Walczę z tym od kilku godzin, nawet Google nie pomaga. Pomóżcie proszę.

2

Nie używałem nidgy tego komponentu, ale z pobieżnego przeglądnięcia metod i właściwości wychodzi mi to:

function GetCellColor(AGrid: TDrawGrid; ACol, ARow: Integer): TColor;
var
  LCellRect: TRect;
begin
  LCellRect := AGrid.CellRect(ACol, ARow);
  Result := AGrid.Canvas.Pixels[LCellRect.Left, LCellRect.Top];
end;

Powyższa funkcja pobiera kolor piksela z lewego górnego rogu komórki o współrzędnych ACol i ARow z komponentu z parametru AGrid; Szybki test wyszedł dobrze i funkcja zwraca prawidłowy kolor, ale nie testowałem tego dla wszystkich możliwych przypadków - to pozostawiam Tobie;

Być może istnieje lepszy sposób na pozyskanie koloru, ale nie mam dziś już siły na to.

0

Dziękuję furious programming za szybką odpowiedź. Niestety mój problem rozwiązany jest połowicznie. Jak napisałeś, funkcja odczytuje kolor lewego górnego narożnika, a jest to niestety obramowanie komórki, które ma inny kolor niż wypełnienie. Mo natomiast zależy na odczytaniu koloru wnętrza komórki i to właśnie do niej nie mogę się dobrać :(

1

to dodaj po 3 do x i y i tyle.

0

Dodanie po 3 przesunie komórki o 3 w prawo i w dół, a nie o 3 piksele.

2

programowanie nie jest dla Ciebie, niestety...

AGrid.Canvas.Pixels[LCellRect.Left + 3, LCellRect.Top + 3];

0

Dzięki, działa, ale ta uwaga ... Jak rozumiem ty się już mądry urodziłeś?
W tym języku siedzę od kilku dni i dopiero poznaję jak działa więc wyznaczam sobie jakiś cel i do niego dążę. Czasami trafię na problem z którym dotychczas nie miałem kontaktu. W zamian za to słyszę "programowanie nie jest dla Ciebie, niestety..." - gratuluję lotnego umysłu :(

1

twoja poprzednia uwaga (że przesunie komórki a nie piksele) nie miała nic wspólnego z programowaniem, a już na pewno nie z konkretnym językiem. Miała ona związek z logicznym myśleniem i z kojarzeniem faktów. Zabrakło przede wszystkim zrozumienia co ta linijka AGrid.Canvas.Pixels[LCellRect.Left, LCellRect.Top] robi a fakt, że przepisałeś ją bezmyślnie bez zrozumienia kilku metod/właściwości nie świadczy o twojej nauce dobrze. Stąd mój wniosek, być może błędny, być może następnym razem spróbujesz zrozumieć kod zamiast go przepisać i stwierdzić, że nie działa.

0

@malum - jak pisałem wcześniej, podany przeze mnie kod co prawda prawidłowo pobiera kolor, ale nie testowałem go na wszystkie możliwe sposoby; Nie wiem np. czy będzie działać dla komórek niewidocznych na ekranie (najpewniej nie będzie), więc to taka proteza wymyślona na szybko;

Najlepiej by było przechowywać gdzieś ten kolor (każdej komórki), zamiast odczytywać go w locie.

0

Na pomysł przechowywania kolorów w oddzielnej tablicy również wpadłem, ale te kolory zmieniają się bardzo często, a dodatkowa tablica sprawiłaby więcej problemów niż radości. Twój pomysł sprawdza się bardzo dobrze, więc dziękuję za podpowiedź.

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