Poddalem sie - TStringGrid......

0

Witam.

Mam problem...i mecze sie od dluzszego czasu (chyba za bardzo kombinuje a problem sie wydaje zbyt prosty aby go tak zagmatwac)...wiec:
Mam oprogramowanego StringGrida jezeli chodzi o gdSelected, gdFocused, gdFixed. Pytanie - zaznaczam komorke cell[C,R] - chce aby w tym momencie zostala odznaczona komorka cell[0,R] oraz cell[C,0]. Inaczej piszac, zaznaczonej wartosci w tabeli, zostana odznaczone rowniez np 'numer przypadku' (wiersz) i numer zmiennej (kolumna) oczywiscie w sposob dynamiczny.
Wiec jak oprogramowac zdarzenia onSelectCell i onDrawCell ....dajcie jakies namiary myslowe, juz ich mam zanadto ale kazda zawodzi :(

0

No coż witam Cię. Jeżeli dobrze cię zrozumiałem to to jest rozwiązanie:

W OnDrawCell daj:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with StringGrid1 do
    begin
      Canvas.Brush.Color := clWhite;
      Canvas.FillRect(Rect);

      if (gdSelected in State)  then
        begin
          Canvas.Brush.Color := clBlue;
          Canvas.FillRect(Rect);
        end;

      if (ARow >= StringGrid1.Selection.Top) and (ARow <= StringGrid1.Selection.Bottom)
      and (ACol = 0) then  // obsluguje multi select - jezeli nie chcesz to wyrzuc drugi warunek

      begin
          Canvas.Brush.Color := clGreen; // kolor dla wierszy
          Canvas.FillRect(Rect);
      end;

      if (ACol >= StringGrid1.Selection.Left) and (ACol <= StringGrid1.Selection.Right)
      and ( ARow= 0) then

      begin
          Canvas.Brush.Color := clAqua; // kolor dla kolumn
          Canvas.FillRect(Rect);
      end;
   end;
end;

Teraz w zależności jak chcesz odświeżać rysowanie daj tam gdzie chcesz

StringGrid1.Refresh;

Ja dałem to do OnMouseUp:

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  StringGrid1.Refresh;
end;

Jeżeli chodzi o tekst w tych komórkach to myślę, że nie muszę już nic pisać...

Pozdrawiam

0

Dzieki za to ze poswieciles mi czas..niestety ten sposob w przypadku wypelnienia np ok 1000 wierszy i 100 kolumn odpada, przerabialem to juz niestety. Odswiezanie jest karkolomne :/

Jak na razie raczej opre sie na :
CellRect, TGridRect, TRect itp

pozdrawiam

0

No coż skoro ci to nie odpowiada to już nie moja wina.
Jednak nurtuje mnie jedno pytanie - nie chcę być niegrzeczny ale czy sprawdziłeś w ogóle tę procedurę?

A dlaczego pytam? Dlatego, że ja sprawdziłem tą procedurę na StringGridzie 30 000 x 30 000 komórek i mi działała ona wyśmienicie. Poza tym zmieniałem czcionkę jej styl itp. i było OK
A przyznasz że 900 mln komórek to znacznie więcej niż podany przez ciebie przykład 100 tys.

Pozdrawiam

0

Odświerzając StringGrida nie rysujemy WSZYSTKICH komórek od nowa, a jedynie te WIDOCZNE. Więc nie ma różnicy w szybkości odświerzania 100 czy 100 000 komórek (jeśli zaledwie kilka-kilkadziesiąt jest widocznych).

0

Witam.
Jak to mawiaja kto pyta nie bladzi - rzeczywiscie wdarl sie maly "byk", dopiero gdy przeczytalem Twojego posta zaczalem sie zastanawiac gdzie tkwil blad. poza tym sprawdzalem Twoj sposob, moj byl podobny ... opieral sie na zdefiniowaniu zmiennych globalnych i przypisaniu w zdarzeniu onSelectCell, mianowicie:

procedure TPlanEksperymentu.StringGrid1SelectCell(Sender: TObject; ACol,  ARow: Integer; var CanSelect: Boolean);
begin
 Wiersz:=ARow;
 Kolumna:=ACol;

StringGrid1.Invalidate;
end;

a nastepnie w zdarzeniu onDrawCell:

     ..............................
     if  gdSelected in state then
              begin
                Canvas.Font.Name:='Century Gothic';
                Canvas.Brush.Color :=clMoneyGreen;
                Canvas.Font.Color:=clBlack;
                Canvas.Font.Size:=9;
                Canvas.Font.Style:=[fsBold];
                Canvas.FillRect(Rect);
                Frame3D(Canvas,Rect,clRed,clRed,1);
               end;


              if (ACol=Kolumna) and (ARow=0) then
                  begin
                   Frame3D(Canvas,Rect,clRed,clRed,2);
                  end;
              if (ACol=0) and (ARow=Wiersz) then
                  begin
                   Frame3D(Canvas,Rect,clRed,clRed,2);
                  end;
          ................................

A znaleziony "BYK" tkwil sobie od samego poczatku nie zuwazony dopoty nie zostala zastosowana procedura odswiezania....mianowicie na samym poczatku w onDrawCell :

.........

StringGrid1.Cols[3].Add('1');

.........

Na samym poczatku sodzilem ze to wina zbyt "konkretnego" stosowania klasy TCanvas, przy wylaczonym DefaultDrawing:=false nalezalo samemu zadbac o kolory, style, czcionke..etc. Jednak okazalo sie ze to nie to :)
Dzieki Rav [browar] za sugestie :)

pozdrawiam

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