Witam. Siedze i kombinuje, ale nie moge sobie poradzić z jedną rzeczą. Mam na formatce standardowego StringGrida
nazwanego SG1 i taki kod jak poniżej (fragmenty). I problem polega na tym, że gdy klikne dwukrotnie w komórke SG1
to zmienia ona kolor wypełnienia oraz czcionki na żądany. Wierszy do klikania jest 13. I załóżmy, że klikne na pierwszy
oraz drugi. Jednak kiedy przyciskiem ustawię AktualnyGraczNr := 2; i kliknę w kolumnie o indeksie 2. To w poprzedniej
z kolumn kolorowe zaznaczenie zostanie tylko przy pierwszym klikniętym elemencie. Kolor z ostatniej pokolorowanej
komórki znika. To samo stanie się na przykład z pierwszą komórką jeżeli najpierw kliknę dwukrotnie na nią, a później
na przykłąd na drugą komórkę - po czym znowu na pierwszą komórkę i zmienie przyciskiem AktualnyGraczNr := 2; to
kolorowanie z pierwszej komórki zniknie. Jak temu zaradzić aby pozostawały wszystkie zawarte w zbiorze komórki
pokolorowane poprawnie? Co ciekawe jeżeli klikne na niewłaściwą kolumnę (inna niż w zmiennej AktualnyGraczNr)
i pokaże mi się komunikat z ShowMessage, to po jego zamknięciu i zmianie AktualnyGraczNr - oznaczenia zostają w
sposób prawidłowy. Kombinowałem już ze zmianą Focusa na jakiś inny element formatki, ale to nie pomogło. Może
ktoś z Was wie jak zrobić aby StringGrid zachowywał się poprawnie. Ewentualnie jakiś inny pomysł na zmiane dla
dwukrotnie klikniętej komórki koloru na stałe. Dodam, że próbowałem chyba różnych opcji StringGrida, a także je w
całości wyłączałem. Teraz mam tylko takie [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine]. Może coś
trzeba jeszcze poprawić czy przestawić, ale nie wiem. Dodam, że wolę raczej używać standardowy StringGrid..
// ... ciach...
const
Min_Graczy = 1;
Max_Graczy = 2;
// ... ciach ...
public
KoloroweTab : array[1..Max_Graczy] of set of Byte;
AktualnyGraczNr, AktualnaKolumna, AktualnyWiersz : Byte;
//... ciach ...
procedure TMainForm.SG1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
I : Byte;
S : string;
DrawRect : TRect;
begin
S := SG1.Cells[ACol, ARow];
DrawRect := Rect;
DrawRect.Left := DrawRect.Left + 2;
DrawRect.Top := Drawrect.Top + 4;
Drawrect.Right := Rect.Right;
SG1.Canvas.FillRect(DrawRect);
DrawText(SG1.Canvas.Handle, Pchar(S), Length(S), DrawRect, dt_Center);
if (ACol = AktualnyGraczNr) and (ARow in KoloroweTab[AktualnyGraczNr]) then
begin
SG1.Canvas.Brush.Color := RGB(255, 165, 0);
SG1.Canvas.Font.Color := clWhite;
SG1.Canvas.FillRect(Rect);
DrawText(SG1.Canvas.Handle, Pchar(S), Length(S), DrawRect, dt_Center);
end;
end;
// ... ciach ...
procedure TMainForm.SG1DblClick(Sender: TObject);
begin
if AktualnaKolumna <> AktualnyGraczNr then
begin
ShowMessage(Format(
'Jesteś graczem numer: %d, a próbujesz wpisać punkty za kombinacje dla gracza numer: %d',
[AktualnyGraczNr, AktualnaKolumna]));
Exit;
end;
PlayerClicks[AktualnyGraczNr][AktualnyWiersz] := True;
KoloroweTab[AktualnyGraczNr] := KoloroweTab[AktualnyGraczNr] + [AktualnyWiersz];
end;