StringGrid - kolor podświetlenia przy edycji.

0

Witam.

Mam następujący problem:
W programie który zaciekle tworze mam tabelkę z ofertą, ustawiłem "na sztywno" tło, a zdarzeniem OnDrawCell koloruje aktywny wiersz.
Coś takiego :
ok.jpg

Problem pojawia się przy wpisywaniu wartości do edytowanej komórki, wtedy tekst zmienia kolor na biały.
not ok.jpg

Podpowiedzcie mi proszę jak temu zaradzić ...
Dziękuję i pozdrawiam

0

Pokaż obecny kod zdarzenia OnDrawCell to coś wymyślimy.

0
procedure TForm2.tabela_ofertaDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
var
   S,T : String;
begin
   if (arow=wiersz) AND (wiersz<>0) then
    begin
              T:=tabela_oferta.Cells[ACol, ARow]; ;
              tabela_oferta.Canvas.Brush.Color :=$00C7F5FE;
              tabela_oferta.Canvas.FillRect(aRect);
              tabela_oferta.Canvas.TextOut(aRect.Left + 2, aRect.Top + 2, T);
    end;

end;
 procedure TForm2.tabela_ofertaSelection(Sender: TObject; aCol, aRow: Integer);

begin
wiersz := tabela_oferta.Row;
for m:=0 to tabela_oferta.RowCount-1 do
    begin
      for n:=0 to tabela_oferta.ColCount-1 do
          begin
            if tabela_oferta.Cells[n,m]<>'' then tabela_oferta.Cells[n,m]:=tabela_oferta.Cells[n,m]
              else
                begin
                   tabela_oferta.Cells[n,m]:=' ';
                   tabela_oferta.Cells[n,m]:='';
                end;
          end;
    end;
end;  

Ten sposób "kolorowania" wymyśliłem sam więc idealny to on na pewno nie jest ale poza tym jednym mankamentem działa poprawnie ;).

0

Chyba najprościej to nadpisać CreateEditor

type
  TStringGrid = class(Grids.TStringGrid)
  protected
    function CreateEditor: TInplaceEdit; override;
  end;
//...
function TStringGrid.CreateEditor: TInplaceEdit;
begin
  result:= inherited CreateEditor;
  TMaskEdit(result).Color:= clRed; //Moze być TEdit ale  TInplaceEdit dziedziczy po TMaskEdit więc tak bezpieczniej :)
end;
0

@kAzek Nie do końca rozumiem jak Twój sposób ma działać.
Po wklejeniu kodu dostaje pierwszy błąd:
"unit2.pas(19,40) Error: Identifier not found "TInplaceEdit"

Zapomniałem o chyba dość istotnej rzeczy : pisze w Lazarusie a nie w Delphi.

0

TInplaceEdit zdefiniowany jest w module Grids i musisz go dodać do uses
A A w Lazarus to nie wiem :/

0

Grids mam w uses a i tak ten błąd wywala.

0

Twoje zdarzenie OnDrawCell ma niestety bardzo mało wspólnego z prawdziwym (normalnym) rysowaniem komórek... Nie wiem dlaczego stosujesz takie kombinacje, jednak nie tędy droga; Sprawdziłem na Lazarusie jak wygląda sprawa i nie jest źle;

Jedyne co trzeba oprogramować, to zdarzenie OnDrawCell uwzględniając stan danej komórki oraz ewentualnie jej współrzędne po to, by inaczej rysować nagłówki (w moim przykładzie nagłówki wypełniane są innym kolorem, a tekst w nich zawarty jest pogrubiony);

To, co należy zrobić by kontrolka była poprawnie rysowana, to wykorzystać właśnie goRowSelect - po kliknięciu na daną komórkę zostanie podświetlony cały wiersz, czyli zostaną przemalowane wszystkie komórki danego wiersza z wartością gdSelected w argumencie aState; Jedynym minusem tego rozwiązania jest niemożność przejścia strzałką w bok do sąsiedniej komórki - aby to zrobić należy w nią kliknąć i wtedy nastąpi przesunięcie fokusa; Zastanawiam się dlaczego jest to tak rozwiązane (strzałki w górę i w lewo podświetlają poprzedni wiersz, a strzałki w dół i w prawo następny), jednak nie mam pojęcia...

Kod zdarzenia OnDrawCell:

procedure TMainForm.sgExampleDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState);
begin
  with TStringGrid(Sender).Canvas do
  begin
    { COLORS }
    if (aCol = 0) or (aRow = 0) then
    begin
      { HEADER CELL }
      Pen.Color := $00DCE8ED;
      Brush.Color := $00DCE8ED;
      Font.Style := [fsBold];
    end
    else
      if gdSelected in aState then
      begin
        { SELECTED CELL }
        Pen.Color := $00C9F4FE;
        Brush.Color := $00C9F4FE;
      end
      else
      begin
        { NORMAL CELL }
        Pen.Color := $00E1E1E1;
        Brush.Color := $00E1E1E1;
      end;

    { BACKGROUND }
    Rectangle(aRect);

    { FOCUS FRAME }
    if gdFocused in aState then
    begin
      Pen.Color := clRed;
      Pen.Style := psDot;      
      Rectangle(aRect.Left + 1, aRect.Top + 1, aRect.Right - 2, aRect.Bottom - 2);
    end;

    { TEXT }
    TextOut(aRect.Left + 4, aRect.Top + 2, TStringGrid(Sender).Cells[aCol, aRow]);
    Font.Style := [];
  end;
end;

Efekt:

imgExample.png

Kod ten działa poprawnie - kolor tekstu w komórkach jest zawsze taki, jaki sam ustawiam (nigdy nie zmienia się na biały) bez względu na to czy się wartość danej komórki edytowało czy nie; Przy rysowaniu tekstu zadbaj o poprawne przycinanie łańcucha w momencie gdy nie zmieści się w danej komórce - należy go odpowiednio przyciąć by nie zasłonił czerwonej ramki fokusa;

Tak więc zapoznaj się z tym kodem i poczytaj o stosowanych metodach klasy TCanvas; Do posta dołączam projekt zrobiony w Lazarusie (bez exe), w którym to wykorzystałem wyżej podany kod do malowania komórek; Sprawdź dokładnie w jaki sposób ustawiona jest kontrolka sgExample - zwróć uwagę na niektóre właściwości; Jeśli cokolwiek jest w nim niejasne to pytaj.

0

@Furious Programming to co sam napisałem było efektem przekopywania kolejnych for w poszukiwaniu tego jak coś takiego uzyskać...
Dziękuję Ci serdecznie za Twój kod - zaraz go sobie "przestudiuje" i poczytam o klasie Tcanvas.
Pozdrawiam.

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